인프런 커뮤니티 질문&답변

Jaesang Yoon님의 프로필 이미지
Jaesang Yoon

작성한 질문수

실전! Querydsl

수정, 삭제 벌크 연산

@Transactional 시 @Rollback(value = false)와 @Commit의 차이

작성

·

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

image

커밋 어노테이션은 롤백어노테이션의 value가 기본값 true가 아닌 false로 설정된 어노테이션이

별도로 추가된 어노테이션으로 보시면됩니다.

@Commit

image

이해하기 쉽게 함수로 비유하면 rollback의 참/거짓 상태를 기본 참인 변수를 갖는 클래스에서

이 변수 자체를 반환하는 롤백 메서드와 롤백의 상태값에 대한 역을 출력하는 커밋 메서드로 비유할 수 있을 것 같습니다 😀

image

 

감사합니다.

Jaesang Yoon님의 프로필 이미지
Jaesang Yoon
질문자

결국 Commit 애너테이션은 Rollback 애너테이션의 멤버변수에 논리부정연산자를 붙여준것과 같군요 ㅎㅎㅎㅎ 오늘 두번이나 뵙네요!! 감사합니다 🙂

네 맞습니다 ^^

강의 수강 중 궁금한 사항은 언제든 질문 남겨주세요 😀

0

안녕하세요, 인프런 AI 인턴입니다.

Jaesang Yoon님께서 질문하신 @Transactional@Rollback(value = false)@Commit의 차이에 관련된 질문에 대해서, 스프링 프레임워크에서 제공하는 어노테이션 사용에 있어서 기본적인 차이점 및 용도를 설명드릴 수 있습니다. @Transactional 어노테이션은 테스트 메서드를 실행할 때 일어난 변경 사항이 데이터베이스에 반영되지 않도록 기본적으로 롤백을 수행합니다. 이는 수행된 테스트가 데이터베이스에 영구적인 변화를 주지 않게 하여, 테스트의 독립성을 보장합니다.

@Rollback(value = false)@Commit 어노테이션은 이 기본적인 롤백 동작을 수정하여, 테스트를 수행한 뒤에 데이터베이스에 데이터를 실제로 반영하고자 할 때 사용됩니다. 즉, 두 어노테이션 모두 테스트의 결과를 데이터베이스에 커밋하여 반영하게 합니다. 그러나 문맥에 따라 명시적으로 의미를 전달하는 측면에서 차이점을 가질 수 있습니다.

@Rollback(value = false)는 특히 테스트에서만 사용되는 것으로, 테스트 메서드가 종료된 이후 롤백하지 않는다를 명확히 합니다. 반면, @Commit 어노테이션은 테스트 메서드가 성공적으로 종료된 뒤 커밋을 실행하여 변경사항을 데이터베이스에 반영하도록 합니다.

두 어노테이션의 기능적인 측면에서는 같은 결과를 갖게 되며, 사용 목적에 따라 선택할 수 있습니다. 이와 관련된 더 자세한 사례와 설명을 원하신다면, 이전에 비슷한 질문에 대한 답변을 참고하실 수 있습니다.

  • @Rollback(false)와 @Commit의 차이에서 김영한 강사님이 답변한 내용입니다. 이 자료는 @Commit@Rollback(value = false)가 실제로는 같은 동작을 하는 것을 설명하고 있으며, 테스트 코드 내에서 이 두 어노테이션을 어떻게 사용하는지에 대한 좀 더 깊은 이해를 돕습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Jaesang Yoon님의 프로필 이미지
Jaesang Yoon
질문자

지식공유자님의 답변을 기다립니다.

Jaesang Yoon님의 프로필 이미지
Jaesang Yoon

작성한 질문수

질문하기