작성
·
171
0
@Test
@Transactional
@Rollback(value = false)
void testMember() {
// given
Member member = new Member();
.....
}
@Test
@Transactional
@Commit
void testMember() {
// given
Member member = new Member();
.....
}
JUnit에서 테스트 할 때 @Transactional이 붙어있으면 자동으로 롤백되기 때문에 기본 동작을 방지하기 위해(테스트 후에 persist한 데이터를 확인할 수 있도록 하기 위해) @Rollback(value = false)를 사용한다고 알고있습니다.
그렇다면 @Rollback(value = false) 대신 @Commit을 사용해도 같다고 봐도 될까요?
답변 2
0
안녕하세요. Jaesang Yoon님, 공식 서포터즈 OMG입니다.
네, 동일하다고 보셔도 됩니다.
아래에서 차이를 설명드릴게요.
롤백 어노테이션의 구현 코드를 보면 boolean 타입 value의 true를 기본값으로 갖고 있습니다.
@RollBack
커밋 어노테이션은 롤백어노테이션의 value가 기본값 true가 아닌 false로 설정된 어노테이션이
별도로 추가된 어노테이션으로 보시면됩니다.
@Commit
이해하기 쉽게 함수로 비유하면 rollback
의 참/거짓 상태를 기본 참인 변수를 갖는 클래스에서
이 변수 자체를 반환하는 롤백 메서드와 롤백의 상태값에 대한 역
을 출력하는 커밋 메서드로 비유할 수 있을 것 같습니다 😀
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
Jaesang Yoon님께서 질문하신 @Transactional
시 @Rollback(value = false)
와 @Commit
의 차이에 관련된 질문에 대해서, 스프링 프레임워크에서 제공하는 어노테이션 사용에 있어서 기본적인 차이점 및 용도를 설명드릴 수 있습니다. @Transactional
어노테이션은 테스트 메서드를 실행할 때 일어난 변경 사항이 데이터베이스에 반영되지 않도록 기본적으로 롤백을 수행합니다. 이는 수행된 테스트가 데이터베이스에 영구적인 변화를 주지 않게 하여, 테스트의 독립성을 보장합니다.
@Rollback(value = false)
와 @Commit
어노테이션은 이 기본적인 롤백 동작을 수정하여, 테스트를 수행한 뒤에 데이터베이스에 데이터를 실제로 반영하고자 할 때 사용됩니다. 즉, 두 어노테이션 모두 테스트의 결과를 데이터베이스에 커밋하여 반영하게 합니다. 그러나 문맥에 따라 명시적으로 의미를 전달하는 측면에서 차이점을 가질 수 있습니다.
@Rollback(value = false)
는 특히 테스트에서만 사용되는 것으로, 테스트 메서드가 종료된 이후 롤백하지 않는다를 명확히 합니다. 반면, @Commit
어노테이션은 테스트 메서드가 성공적으로 종료된 뒤 커밋을 실행하여 변경사항을 데이터베이스에 반영하도록 합니다.
두 어노테이션의 기능적인 측면에서는 같은 결과를 갖게 되며, 사용 목적에 따라 선택할 수 있습니다. 이와 관련된 더 자세한 사례와 설명을 원하신다면, 이전에 비슷한 질문에 대한 답변을 참고하실 수 있습니다.
@Commit
과 @Rollback(value = false)
가 실제로는 같은 동작을 하는 것을 설명하고 있으며, 테스트 코드 내에서 이 두 어노테이션을 어떻게 사용하는지에 대한 좀 더 깊은 이해를 돕습니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
결국 Commit 애너테이션은 Rollback 애너테이션의 멤버변수에 논리부정연산자를 붙여준것과 같군요 ㅎㅎㅎㅎ 오늘 두번이나 뵙네요!! 감사합니다 🙂