Loading...

Spring/Tistory / / 2022. 6. 9. 01:25

블로그-V3. JUnit 트랜잭션

반응형

 

 

mockmvc 트랜잭션이랑 스프링으로 직접 save한 트랜잭션 두 개가 같이 돌고있다.

 

카테고리가 아직 save 커밋이 안되어서 인식을 못하기때문에 오류가 나는거야

 

1. 같은 트랜잭션을 태우거나

2. 카테고리도 mockmvc로 save하거나

 

 

레파지토리 save, find하는거 다 따로 트랜잭션을 가지고있어

 

서비스라는 곳에서 내가 만약에 hello 메서드에서 두ㄱㅏ지 일을 할거야.

a레파지토리.save( )

b레파지토리.save( )

 

따로 트랜잭션이  도는데 이 두개의 따로노는 트랜잭션을 하나의 트랜잭션으로 묶기 위한 @Transactional

 

지금문제는 mockmvc로 post를 save하는 트랜잭션 하나,

직접 repository에 카테고리를 save하는 트랜잭션 하나 따로따로 돌고있음

 

카테고리는 하나 세이브해서 카테고리 아이디를 들고와야하는데 얘는 디비에 실제로 save는 됐는데

아직 커밋이 안됐어.

 

만약 두개가 같은 트랜잭션이라면 커밋안되도 보이는데 그게 아니라서 안보여.

mockmvc입장에서는 커밋이 안된 데이터를 볼 수 없다. mysql, mriadb의 기본전략

커밋된 데이터만 보인다.

팬텀이 (유령 데이터) 보이게 되는 것

 

같은 트랜잭션에서 돌게 하든지, 커밋안된 데이터만 보이게 전략을 바꾸던지.

 

혹은 ! DB 이니셜라이저로 데이터를 초기화해두고 사용.

여기서 유저와 카테고리를 하나씩 save해주고 test일때만 실행하게 프로파일 설정해주고

@BeforeEach 해주면 되겠다.

 

이게 고립성이다. isolation.

 

이미지 파일은 회원가입시에 키값 자체가 존재하지 않는다. 나중에 수정하는 로직인데

서비스에는 isEmpty로 되어있다. 키값자체가 없는건 null이니까 본코드를 수정해주자.

 

그리고 write 컨트롤러는 리다이렉션해주니까 3XX으로 검증해주면 되겠다.

 

단위테스트 하면서 의존성 분리해서 해보고

통합테스트 하면서 가짜로 시큐리티 세션도 넣어보고

 

이건 다 정상적인, 안정적인 본코드를 짜기 위해 하는 것이다.

 

우리가 섬네일 로직이 잘못됐다는걸 안것처럼!

 

반응형