우선, SPRING BOOT 프로젝트를 생성했을 때 자동으로 생성되는 src/main/resources/application.properties 파일을 삭제하고 application.yml 파일을 생성해준다. properties를 사용해도 된다. 하지만 계층적 구조인 yml이 설정파일이 많아졌을 때 더 편리한 느낌이 있어 여기서는 yml로 대체한다.
application.yml 설정
ddl-auto: application 실행 시점에 기존의 테이블을 지우고 테이블을 새로 생성
show_sql: true -> System.out으로 sql 출력
org.hibernate.SQL: debug -> Logger로 sql 출력
멤버 클래스 생성(Entity)
MemberRepository 생성(Repository는 DB에 직접 접근할 때 사용)
JPA를 사용하기 때문에 Entity Manager가 필요하다.
Spirng Boot는 결국 스프링 컨테이너 위에서 동작하기 때문에 Spring Boot가 @PersistenceContext에 있으면 Entity Manager를 주입해준다.
spring-boot-starter-data-jpa가 다 해줍니다. yml 설정 읽어서 혼자 다 해줍니다. 너무너무 편한 spring boot!!
CQS개념 - 이것은 추후 다른 포스팅에서 설명 예정
VS-CODE에서는 JAVA 테스트 파일을 따로 만들어주는 것이 없다.
Extension에서 설치해주었다.
파일만 생성되는 것에 의미를 갖고 사용하면 된다.
사용방법: 마우스 우클릭 - generate junit testFile
junit4에서는 @RunWith(SpirngRunner.class)를 사용.
junit5에서는 @ExtendWith(SpingExtension.class)를 사용
이 부분을 몰라서 한참을 헤맸다.
테스트 전체 코드
package jpabook.jpashop;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.transaction.annotation.Transactional;
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Test
@Transactional
@Rollback(false)
public void testMember() throws Exception {
//given
Member member = new Member();
member.setUsername("memberA");
//when
Long saveId = memberRepository.save(member);
Member findMember = memberRepository.find(saveId);
//then
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
System.out.println("findeMember === member: " + (findMember == member));
}
}
검증 부분에서 사용되는 Assertions을 VS-CODE에서 활성 방법
launch.json : Visual Studio Code는 launch.json프로젝트 폴더 루트의 파일에서 시작 구성을 관리합니다
Transaction을 해주지 않는다면 에러가 난다.
Entity Manager를 통한 모든 데이터 변경은 트랜잭션을 통해 이루어져야 한다.
IllegalStateException : Failed to load ApplicationContext 에러
yml파일을 읽어들이지 못할때 생기는 에러이다.
필자는 yml파일에 오타가 있어서 생겼다.
테스트 코드를 실행하고 DB에 접속해보면 멤버 테이블이 생성된것을 확인 가능하다.
생성된 이유는 테스트 코드가 실행될때 hibernate가 생성해준다.
(yml파일에 hibernate: ddl-auto 설정을 해줬기 때문)
create table 위를 잠깐 살펴보면 테이블을 먼저 날리는 것을 알 수 있다.
기본적으로 테스트에서 Transactional을 해주게 된다면 모든 테스트가 끝나고 난 후 데이터를 Rollback한다. 테스트를 한 데이터를 남기고 싶다면 옵션 설정 필요.
테스트가 끝나도 데이터가 남아있는 것을 확인 할 수 있음.
테스트 케이스 전체 코드를 보면 위와 같은 코드가 있다.
이것은 결과값은 True이다. 왜 True일까??
해답:
같은 트랜잭션안에서 저장을 하고 조회를 하면 영속성 컨텍스트(PersistenceContext)가 똑같다. 같은 영속성 컨텍스트 안에서는 id값이 같으면 같은 Entity로 식별한다.
결과값:
결과를 보면 true를 확인할 수 있고, 더 자세히 보면 select문 자체가 없는 것을 확인할 수 있다. insert query만 나갔는데 그 이유는 위에서 말한것이다. 같은 영속성 컨텍스트에 있다고 판별나서 1차 캐시에서 꺼내온다.
Window cmd
성공한다면 마지막에 Build Success가 뜬다.
포트가 열려있다면 에러가 날 것이므로 사용중인 포트를 닫고 실행하자.
명령어:
netstat -a -o
taskkill /f /pid 번호
yml 파일에 org.hibernate.type 추가하기.
이런 방법도 있지만 외부 라이브러리를 사용해보겠다.
P6SPY
build.gradle에 추가
실행 모습