Jam's story

1)DataRestTest 클래스에서 통합테스트로 작성하는 이유 2) @Transactional을 붙이는 이유 본문

Spring

1)DataRestTest 클래스에서 통합테스트로 작성하는 이유 2) @Transactional을 붙이는 이유

애플쩀 2022. 10. 20. 14:14

1)DataRestTest 클래스에서 통합테스트로 작성하는 이유 

1번, @WebMvcTest 가 controller와 연관된 내용만 테스트하는 목적을 가지고 있는 것은 맞지만
auto configuration 을 읽지 않는 것이 아닙니다.
controller 와 연관된 auto configuration 들을 읽습니다.

애노테이션 @WebMvcTest 가 어떤 자동 설정을 읽어들이는지 찾아보세요. 정답을 찾아 댓글로 달아주시면 제가 확인해 드리겠습니다.
해당 내용을 적어놓은 스프링 부트 공식 문서를 찾아 링크를 남겨주시면 정답으로 인정해 드리겠습니다.

위에서 찾으신 컨트롤러 관련 설정 외에 다른 자동 설정을 읽지 않고 빈 스캐닝을 하지 않으므로
서비스 로직 빈이나 repository layer 로 접근하는 빈을 읽지 않습니다.
따라서 sql 샘플 데이터를 자동으로 테스트 db에 넣지도, 이것을 repository interface 를 통해 읽어들이지도 못합니다.

거기에 컨트롤러를 읽어들이는 설정마저도 뜻대로 동작하지 않습니다. data rest 에서 작성한 테스트 대상 api 들은
실제로는 우리 컨트롤러 코드에 존재하지 않습니다. 그렇지요?
해당 api 들은 Spring Data Rest 가 자동으로 만들어준 것입니다.
그러니 @WebMvcTest 의 기본 동작대로 컨트롤러 빈만 읽으려고 해서는
data rest 가 만들어준 api를 찾아서 읽어낼 수 없습니다.

data rest 테스트를 통합 테스트 스타일로 작성하는 이유입니다.

 

2) @Transactional을 붙이는 이유

테스트가 트랜잭션이 되도록 하려고 붙인 것 맞습니다.
그런데 그런 정도는 "Transactional" 영어를 읽은 사람이라면 누구나 해석으로 말할 수 있겠죠?
'테스트가 트랜잭션이 된다'는게 어떤 의미인지를 정확히 알고 있는가가 더 중요합니다.

정확히는 각 단위 테스트를 트랜잭션으로 감싸서,
그 안에서 일어난 영속성 컨텍스트의 변화가 테스트 실행 후 롤백되도록 만들기 위해서 붙입니다.
테스트 코드에서 사용한 @Transactional 애노테이션은 기본적으로 롤백 모드로 동작합니다.
스프링 부트 테스트의 편리한 기능 중 하나입니다.

스프링 부트의 테스트에 @Transactional 을 쓰면 롤백 모드로 동작한다는 사실이 적혀있는 부분을
스프링 부트 공식 문서에서 찾아서 링크를 댓글로 남겨주세요. 제가 정답인지 확인해 드리겠습니다.

두 숙제의 기한은 이번 주 금요일(10/21)까지로 하겠습니다.
기한을 굳이 설정한 이유는, 여기가 질문이 계속 올라오는 질문 게시판이어서 그렇습니다.
질문이 계속 올라오면 이 글이 아래로 점점 묻힐 거고 제가 추적하기 어렵게 됩니다.
때문에 제가 이 글을 추적해서 답변을 또 드릴 수 있는 기한을 설정한 것입니다.
금요일 저녁에 제가 이 글을 기억하고 다시 찾아와서 답글이 달렸는지 한 번 더 확인하도록 하겠습니다.
그 때 답이 달려있다면 피드백을 드리겠습니다.
숙제는 질문자분을 위해서 드린 것이니 필요하지 않으시다면 하지 않으셔도 됩니다.
이 숙제가 레퍼런스로부터 답을 찾아내는 좋은 연습의 기회가 되길 바랍니다.

Comments