요구사항 확인

-요구사항기반으로 도메인 모델과 테이블 설계

-설계바탕으로 엔티티클래스 개발

-엔티티 설계시 주의점을 알아볼 것

 

간단한 쇼핑몰기능 살펴보기

기능 3가지

 

1. 회원기능

-회원가입(회원등록)

-회원목록(회원조회)

 

2. 상품기능

-상품등록

-상품목록(수정 및 조회)

 

3. 주문기능

-상품주문 및

-주문내역 조회

-주문 취소

 

4. 기타요구사항

-상품은 제고 관리가 필요하다.

-상품의 종류는 도서, 음반, 화가 있다.

-상품을 카테고리로 구분할 수 있다.

-상품 주문시 배송 정보를 입력할 수 있다.

 

6. MemberRepositoryTest파일 테스트

MemberRepositoryTest 파일

설명

@SpringBootTest

-스프링부트로 테스트하기 때문에 SpringBootTest annotation 세팅

 

@RunWith(SpringRunner.class)

-JUnit에게 스프링과 관련된 테스트를 할 것이라고 알려주기 위해 하는 세팅

 

*annotation관련설명

(https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/html/spring-boot-features.html#boot-features 참고)

If you are using JUnit 4, don’t forget to also add @RunWith(SpringRunner.class) to your test,

otherwise the annotations will be ignored.

If you are using JUnit 5, there’s no need to add the equivalent @ExtendWith(SpringExtension.class)

as @SpringBootTest and the other @Test annotations are already annotated with it.

 

-JUnit4 사용할 경우, @RunWith를 넣지 않으면 annotations들이 적용되지 않을 것이라고 함.

 JUnit5 @SpringBootTest와 같은 annotation을 세팅할필요 없다고 한다.

 

@Autowired MemberRepository memberRepository;

-MemberRepository작동을 위해서 Autowired를 사용해서 MemberRepository 인젝션 받음

 

@Test

-member를 테스트하기 위함

-given when then 형태로 테스트

 

//given

-member 변수를 만들고, memberA로 설정한다.

 

//when

a.member가 잘 저장되는지 확인

: memberRepository.save(member)작성후 save에서 단축키 ctrl+ Alt + v를 누르면

다음과 같은 형태로 설정이 된다.

 

Long saveId = memberRepository.save(member);

-> saveId: 저장된 Id(변수)를 뽑아오는(extract) 역할을 한다.

->member를 가지고 save를 하면 잘 저장이 되는지 확인을 해야 한다.

 

b.Member findmember = memberRepository.find(saveId);

-memberRepository에서 find해서 saveId가지고 넘긴 것이 findmember가 맞는지 확인한다.

*findMember 변수를 만든다.

 

//then (검증)

-Assertions 라고 하면 assertj라는 라이브러리를 스프링테스트가 자동으로 가지고 있어

라이브러리 디펜던시에서 자동으로 올라온다. “ . ”을 찍어주기만 하면!

 

-findMembergetIdmembergetId와 같다.

 findMembergetUsernamemembergetUsername과 같다.

 

#마주한문제

a.applcation.yml_debug설정 위치변경

무엇이 문제인지 정확히 몰라 test하기 위해 연관 있는 파일들을 확인하기 시작했다.

-application.yml 로 들어감

-applcation.yml_debug설정 위치변경

 level : debug 라고 설정이 되어 있음을 확인

 org.hibernate.SQL : debug로 변경

 

b.application.yml_DB경로접속 휴먼에러_JPA에러

-다음과 같은 메시지 확인

a,b 문제해결

그래서 application.yml 들어가니 설정경로가 jap와 debug위치 변경

 

c.MVCC_unsupported 메세지

-MVCC=TRUE 삭제

 

d. URL 에러메세지

-application.yml에서 경로를 확인하니

“ : ” 가 하나 더 추가 되어 있어 삭제

 

 

e. No EntityManager with actual transaction available 에러메세지

엔티티매니저를 통한 모든 데이터 변경 트랜잭션 안에서 이루어져야 하는데

현재 @Transactional 어노테이션이 없다.

2가지 종류의 transaction이 있는데 현재 스프링프레임워크를 사용하므로

-javax.transaction

-org.springframework.transanction <-이것을 사용한다.

 

에러메시지

문제해결

#마주한문제 3_Member테이블 미생성

-H2 콘솔에 접속하여 데이터베이스에 member 테이블이 생겼나 확인하니 Member 생성이 안되어 있었다!

 

a.application.yml_hibernate 단어오타

-hibernate 단어correction

 

b.application.yml에서

-logging.level: 로 다시 변경

-그리고 전체적으로 띄어쓰기가 중요하다는 사실을 발견 전체적으로 2칸씩 이동해줌

-그리고 다시 h2 콘솔 접속하여 데이터베이스에 member테이블생성 확인!

 

문제해결

*localhost:8082로 접속이 안될 시

local에서 h2데이터베이스를 실행시켜주지 않고 실행시킬 시에는

h2.database 관련하여 에러가 나오니 주의 할 것!

cmd에서 h2<bin<h2.bat실행 해주어야 h2데이터베이스로 접속(localhost:8082)접속할 수 있다.

 

 

JPA가 ddl-auto: 에 CREATE 옵션이 있으니 멤버테이블을 만들어 주었다.

member 테이블생성과정

-dropcreate로 테이블 생성을 했다.

-Member Entity정보를 보고 테이블을 생성한다.

 

 

member 테이블에 데이터가 없다?

Transactional이 데이터를 Rollback한다.

-Transactional 어노테이션이 테스트케이스에 있으면 테스트가 끝난 후에 바로 롤백이 되어 버린다.

-테스트케이스가 아닌 곳에서는 제대로 작동된다.

 왜냐하면 데이터가 계속 들어가 있으면 반복적인 테스트를 하지 못하기 때문이다.

 

Rollback(false) annotation

-그럼에도 불구하고 내눈으로 직접 데이터를 보고 싶을 때 이용

JPA 세팅 및 동작 확인완료!

 

기타

-같은 트랜잭션 안에서 저장하고 조회하면 영속성 컨텍스트 같다.

 같은 영속성 context안에서는 id값이 같으면 같은 엔티티로 식별한다.

 같은 영속성 context 안에서 기존 엔티티에서 관리하던 1차 캐쉬에서 바로 정보를 가져온다.

 그래서 select 쿼리는 없고, insert 쿼리만 보인다

a.쿼리 파라미터 로그 남기기 2가지 방법

쿼리 파라미터를 남기는 방법 1

-application.yml ->logging.levvel

org.hibernate.type: trace 추가

쿼리 파라미터를 남기는 방법 2

외부라이브러리 사용

https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

 

-데이터베이스 커넥션을 랩핑해서 왔다갔다하는 만들어진 sql 스테이트먼트를 로그로 출력해주는 라이브러리들을 이용

 

-P6Spy 라이브러리 추가

->build.gradle

-implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.6.1' 추가

->refresh

 

MemberRepositoryTest 실행후

-원본 출력정보 확인 및 파라미터 바인딩 출력정보 확인

-url에서 connection 얻어오는 로그

 

*로그를 어떻게 찍을 건지에 대한 옵션은 상기 사이트에서 확인할 수 있다.

*외부라이브러리 사용시 개발단계에서는 편한데,

 운영단계에서는 성능테스트를 해야 하고 성능저하가 있을 수 있기 때문에,

 성능이 좋지 못하면 개발단계에서만 사용할 것!

 

단어개념_binding Parameter를 보다가

파라미터 - 매개변수

매개변수란

-컴퓨터 프로그래밍에서 매개변수란 변수의 특별한 한 종류로서, 함수 등과 같은 서브루틴의 인풋으로 제공되는 여러

 데이터 중 하나를 가리키기 위해 사용된다. 여기서 서브루틴의 인풋으로 제공되는 여러 데이터들을 전달인자 라고 부른

 다.

 

위키백과 및 구글 참고

https://www.google.com/search?q=%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0&oq=%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0&aqs=chrome..69i57j0l7.1697j0j7&sourceid=chrome&ie=UTF-8

 

바인딩이란

바인딩(binding)이란 프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는

행위를 의미합니다.

 

예를 들어 함수를 호출하는 부분에서 실제 함수가 위치한 메모리를 연결하는 것도

바로 바인딩입니다.

이러한 바인딩은 크게 다음과 같이 구분할 수 있습니다.

 

1. 정적 바인딩(static binding)

-실행 시간 전에 일어나고, 실행 시간에는 변하지 않은 상태로 유지되는 바인딩임.

 

2. 동적 바인딩(dynamic binding)

- 실행 시간에 이루어지거나 실행 시간에 변경되는 바인딩임.

이러한 동적 바인딩은 늦은 바인딩(late binding)이라고도 불립니다.

 

참고사이트

http://tcpschool.com/php/php_oop_binding

 

 

다른 라이브러리는 버전정보가 왜 없나요?

기본적으로 스프링부트가 2.1.7에서는 내한테 맞는 라이브러리를 전부 세팅 해놓았따.

미리 세팅 해놓지 않은 라이브러리들은 직접 버전정보를 적어주어야 한다.

 

#마주한문제 <미해결>

jar빌드 동작확인

-windowsmac 환경에 따라 명령어가 다르니 주의!

 

Build

<windows 환경>

jpashop> gradlew.bat

 

<mac 환경>

jpashop> ./gradlew clean build

 

 

Buildjar 라이브러리가 생긴다.

3. JPADB설정후 동작확인

a. Member classfile 생성

 

getter setter를 이용해도 되지만,

lombok을 이용하기 때문에 getter setter를 이용하지 않아도 된다.

@Getter @Setter로 세팅완료

 

b.MemberRepository classfile 생성

*Repository : entity를 찾아주는 역할을 한다.

 

@Repository : 스프링이 제공하는 기본 타입

 

@Repository@Component가 보인다.

기본 컴포넌트 스캔에 대상이 되는 어노테이션 중에 하나이다.

컴포넌트 스캔에 대상이 되어서 자동으로 스프링 bin에 등록이 된다.

@PersistenceContext 와 엔티티매니저

jpa를 사용하기 때문에 엔티티 매니저가 필요하다

스프링부트를 사용하기 때문에 스프링컨테이너에서 모든게 동작한다.

스프링부트가 @PersistenceContext 어노테이션에 있으면 엔티티매니저를 주입을 해준다.

 

엔티티매니저를 생성하는 코드가 없는데요?

spring-boot-starter-data-jpa를 라이브러리를 설치하면서 엔티티매니저가 자동생성이 되고

application.ymljpa설정파일을 전부 읽어서 엔티티매니저 팩토리코드가 자동으로 만들어진다. 그래서 따로 코드를 작성할 필요가 없다.

 

여기에서 #마주한문제 1

persistenceContextannotations are not allowed 라고 확인을 했다..

문제해결

설명

버전이 안맞는 것인지 처음 의심을 했으나..휴먼에러였다.

문제를 찾다보니 Member클래스에 Long.id “ . ”이 있어서 삭제를 하였고

Memberclass 파일에 private.EntityManager.em“ . ”이라고 되어 있었다.

이것을 삭제해주고 나니 해결 완료

 

4. 저장하는 코드 및 조회하는 코드 작성

설명

member를 반환하면 되는데 왜 Id만 반환하지?

commandquery를 분리한다는 원칙에 의해서

저장을 하고 나면 가급적이면 사이드이펙트를 일으키는 커맨드성이기 때문에

리턴값을 거의 안만드려고 한다. 아이디정도 있으면 다음에 조회를 할 수 있으니

Id만 반환한다.

 

5. 작성된 저장코드를 테스트!

설명

window/Linux환경에서 테스트 단축키 [ctrl + shift + T]

좌측처럼 JUnit4 선택 + [ok버튼클릭]

우측과 같이 test클래스파일이 만들어진다.

 

<위키백과 참고>

JUnit(제이유닛)

-자바 프로그래밍 언어용 유닛 테스트 프레임워크

-JUnit 테스트 주도 개발면에서 중요하며 SUnit과 함께 시작된 XUnit이라는 이름의 유닛

테스트 프레임워크 계열의 하나

-JUnit은 컴파일 타임에 JAR로서 링크

 

*JAR(Java Archive, 자바 아카이브)

-여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등)  

메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어 라이브러리를

배포하기 위한 소프트웨어를 패키지 파일 포맷

 

 

+ Recent posts