• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

안녕하세요 강사님 강의하신 내용중에 궁금한 것이 있어 질문 남기게 되었습니다.

20.12.28 15:27 작성 조회수 261

2

Test에서 사용한 @Transactional 어노테이션은 테스트 이후 db에 변경된 내용을 반영하지 않고 롤백을 한다고 설명되어 있고 Main에서 사용한 Transactional 어노테이션은 변경된 db내용을 커밋한다고 설명되어 있는데, 좀 더 구체적인 설명을 해주시면 감사하겠습니다.

답변 1

답변을 작성해보세요.

5

안녕하세요. 호세님

@Transactional은 기본적으로 해당 메서드가 실행될 때 트랜잭션을 시작하고 해당 메서드가 끝날 때 커밋을 해서 데이터베이스에 전달된 내용을 확정합니다.

그런데 테스트 코드에서 @Transactional을 사용하면 커밋을 하는게 아니라 데이터베이스에 롤백을 해서 데이터베이스에 전달된 데이터를 모두 삭제됩니다.

왜냐하면 테스트 코드는 여러번 반복해서 실행해도 되도록 설계해야 하기 때문입니다.

예를 들어서 다음 테스트를 생객해보시면, 회원을 저장하고 조회합니다. 여기서 커밋을 해버리면 데이터베이스에 userA가 남아있게 됩니다. 그리고 또 테스트를 실행하면 이미 userA가 있기 때문에 중복으로 저장되거나 문제가 발생합니다. 그래서 스프링을 테스트에 대해서 트랜잭션을 마지막에 롤백해서 동일한 테스트를 계속 실행할 수 있게 도와줍니다.

save(new Member("userA"))

findMember("userA")

도움이 되셨길 바래요^^