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

Catalina Kim님의 프로필 이미지

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

정리

트랜잭션 전파2 활용에서 질문

22.11.25 07:30 작성

·

315

0

1. 강의 내용과 관련된 질문인가요? 네
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네

[질문 내용]
여기에 질문 내용을 남겨주세요.

 

질문1.

리포지토리안의 각 메소드에서만 @트랜잭션 했을때

joinV2 메소드 사용하면

/**
 * MemberService    @Transactional:OFF
 * MemberRepository @Transactional:ON
 * LogRepository    @Transactional:ON Exception
 */
@Test
void outerTxOff_fail_My() {
    //given
    String username = "로그예외_outerTxOff_fail_my";
    //when
    memberService.joinV2(username); //예외 터짐
    //then: member는 저장, 로그는 안남음
    assertTrue(memberRepository.find(username).isPresent());
    assertTrue(logRepository.find(username).isEmpty());
}

테스트 성공하는데,

이렇게 해도 요구사항에 만족하는거 아닐까요?

이렇게 했을 때의 문제는 어떤거 인가요?

 

질문2.

위 테스트 전에

Log레포에 @트랜잭션 안써주면, 되지 않을까? 해서

/**
 * MemberService    @Transactional:ON
 * MemberRepository @Transactional:ON
 * LogRepository    @Transactional:OFF EX
 */
@Test
void Mytest_ex_success() {
    //given
    String username = "로그예외_mytest_success";
    //when
    memberService.joinV2(username);
    //then: member 저장, log 롤백
    assertTrue(memberRepository.find(username).isPresent());
    assertTrue(logRepository.find(username).isEmpty());
}

정상 유저시 -> 정상 커밋 -> 정상 저장 (유저 존재, 로그 존재)

-> 이때 로그가 왜 정상 저장?

로그예외 유저시 -> 서비스에서 예외 잡아 처리 -> 로그 정상 커밋됨 -> 로그 없길 기대, but 존재

-> 이때도 로그가 왜 정상 저장? - 로그보면 트랜잭션에 참여하진 않음

 

그래서, 디버깅을 해봤는데

엔티티 매니저가 없어서, 멤버가 쓰는 매니저 공유해서 썼고, 트랜잭션에 참여하지 않고, 동기화 매니저에 있는 커넥션으로, 수동 커밋 설정없이 그냥 저장했나? 했는데

검색해보니까

SimpleJpaRepository에서 @트랜잭션 한다고 해서 디버깅 걸어보니 걸리더라구요

SimpleJpaRepository 클래스에도 @트랜잭션 되있고,

여기의 save메소드에도 @트랜잭션 되있더라구요.

 

그럼 레포지토리 메소드에 @트랜잭셔널 안써줘도

그 윗단에 올라가면 SimpleJpaRepository가 있고, 여기에 @트랜잭션이 있어서 트랜잭션이 작동한다.

 

맞게 이해한 건지 궁금해서 여쭤봅니다.

감사합니다.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

2022. 11. 27. 22:59

안녕하세요. Catalina Kim님

코드의 설명만으로는 정확한 확인이 어렵습니다.

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.