본문 바로가기

강의 내용 정리/스프링부트와 JPA 활용 1

4-3. 회원 기능 테스트

@RunWith(SpringRunner.class)
@SpringBootTest

두가지 넣으면 스프링과 통합테스트( DB까지 )

두개 모두 있어야 스프링부트 올려서 테스트 가능.

 

@Transactional//데이터를변경해야하기 떄문에 , 그리고 롤백이됨.

엔티티매니저에 persist 하면 DB에 INSERT문에 나갈까??

->> 안나감. (DB Transaction이 commit 될 때 flush가 되면서 DB에 INSERT쿼리가 나간다.)

 

 

@Transactional 이 테스트클래스에 있으면 기본적으로 롤백을 해버림 ( 커밋 안함 )=영속성 컨텍스트가 flush안함.

 

하지만 개별 @Test에 @Rollback(false)를 적어두면 롤백안함=커밋=flush=DB에 실제 반영.

 

실제로 INSERT문에 나가는것을 볼수있다.

진짜 적용됨.

 

 

-------------------------------------------내가 방금 처럼 굳이 쿼리 나가는것보고싶다.(하지만 이 방법은 실제 DB에 조회 되진 않음. 실제로 영속성 컨텍스트에서 쿼리가 나가는 건 찍히지만 그 뒤에 @Transactional이 Rollback 하기 떄문에.

( 회원가입() 이 끝날 때 롤백시킴.)

 

 

 

em.flush();

 

엔티티매니저 주입받고 em.flush() 하면된다.

( memberService.join에서 member 객체가 영속성 컨텍스트에 들어간다. ( em.persist(member) )

이 때는 쿼리 나간것까지만 보인다. ( 이후에 @Traansactional이 롤백시킴.

flush해주면 DB에 반영한다. = flush하면 DB에 강제로 쿼리가 나감. ( 영속성 컨텍스트에 있는 것들을 

 

 

 

 

 

정리 : 실제 DB반영 확인은 @Rollback(false) 밖에없음.

 

 

 

 

---------------------------------------------------- 중복_회원_예외()

 

checkedexception 안잡으면 계속 튀어나옴.ㄹ

 

validateDuplicateMember -> join -> 테스트 코드 까지와서 터짐.

 

 

이렇게 바꿀 수 있다. 튀어나오는 exception이 IllegalStateException 이면 테스트 성공.

 

 

 

 

 

 

---------------------------------------------------------------------------------------------------------------

테스트 때문에 DB를 외부에 설치하기 귀찮다. 어차피 끝나면 데이터 초기화 되는데,

그래서 자바 띄울 때 자바 안에 DB를 살짝 새로 만들어서 띄우는 방법이있다.=메모리 DB

->스프링 부트에서 제공해줌.

 

 

테스트 폴터에 resources 만들어서 application.yml 만들어두면 테스트할 때는 이게 우선권을 가짐. ( main의 application.yml은 무시됨 )

mem:test로만 바꿔주면 메모리 db로 사용가능.

 

외부H2를 내려도 작동되는 것 확인 가능.

 

 

그런데 

이렇게 해도 메모리db로 됨.. -> 스프링 부트가 기본설정이 메모리모드로 test돌림. ( 이 떄도 자동으로 커넥션이 mem:test 로 돌아감)

 

메모리db는 was(톰켓) 이랑 같이 뜬다.

 

Recent Posts
Popular Posts
Recent Comments