트랜잭션 전파 시 체크 예외를 활용한 복구 처리 관련 문의
644
작성한 질문수 4
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
"회원 가입을 시도한 로그를 남기는데 실패하더라도 회원 가입은 유지 되어야 한다." 이 요구사항을 만족하기 위한 방법1.2 이외에 체크 예외를 활용하는 방법3 관련 문의입니다.
방법1. REQUIRES_NEW로 선언해서 물리 트랜잭션 분리
방법2. MemberFacade 구조를 사용하여 물리 트랜잭션 분리
방법3. 체크 예외를 던져서 오류 관련 내용 커밋(9.스프링 트랜잭 션 이해 / 예외와 트랜잭션 커밋, 롤백 - 활용)
질문. 체크예외를 활용하면 코드에 명시적으로 오류 상황에 대 한 처리를 할 수 있어서 개발자가 오류를 코드 레벨에서 인지할 수도 있고 오류를 받을 때 로그 상태를 저장할 수 도 있다는 장점 이 있을 것 같은데 비즈니스 적으로 의미가 있는 경우에는 체크예외를 사용하고 그 외에는 방법1,2를 선택하면 되는지 궁금합니 다. (오류 처리로 서비스 코드를 지저분하게 만들게 하고 싶지 않 는 경우 방법1,2를 사용하는지?)
참고) 아래는 위 내용을 테스트 할 때 작성한 코드 입니다.
체크예외를 사용하는 서비스 메소드 내용
@Transactional
public void joinV3(String username) throws Exception {
Member member = new Member(username);
Log logMessage = new Log(username);
log.info("== memberRepository 호출 시작 ==");
memberRepository.save(member);
log.info("== memberRepository 호출 종료 ==");
log.info("== logRepository 호출 시작 ==");
try {
logRepository.saveV2(logMessage);
} catch (Exception e) {
log.info("log 로그 저장에 실패했습니다. logMessage={}", logMessage.getMessage());
logRepository.saveV2(new Log("체크예외발생!!"));
log.info("joinV3: 체크 예외가 발생하였습니다!!!");
}
log.info("== logRepository 호출 종료 ==");
}체크예외를 던지는 logRepository.saveV2 내용
@Transactional
public void saveV2(Log logMessage) throws Exception {
log.info("log 저장");
if (logMessage.getMessage().contains("로그예외")) {
log.info("log 저장시 예외 발생");
throw new Exception("예외 발생");
}
em.persist(logMessage);
}회원가입요청 서비스를 테스트하는 코드 내용
/**
* MemberService @Transactional: ON
* MemberRepository @Transactional: ON
* LogRepository @Transactional Checked Exception
*/
@Test
void recoverCheckedException_success() throws Exception {
// given
String username = "로그예외_outerTxOn_fail";
String errorUsername = "체크예외발생!!";
// when
memberService.joinV3(username);
// then: member 저장, log 오류내용 저장
assertTrue(memberRepository.find(username).isPresent());
assertTrue(logRepository.find(errorUsername).isPresent());
}
답변 1
2
안녕하세요. YUNHA PARK님
생각하신 것 처럼 진행하셔도 됩니다.
참고로 꼭 체크 예외가 아니어도 강의에서 설명드린 것 처럼 @Transactional에 커밋하고 싶은 예외를 지정할 수 있습니다.
감사합니다.
RepositoryTest의 패키지 위치가 domain인 이유
0
29
2
REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!
0
29
1
update()에 사용하는 setter 질문드립니다.
0
47
1
SQL 중심적 개발의 문제점에 대한 질문
0
72
1
혹시 Containing 을 안쓰신 이유가 있을까요?
0
83
2
[공유] 스프링부트 4.x 버전 mybatis 연동
0
173
1
@repository 어노테이션
0
89
3
ItemService
0
58
1
논리 커밋, 물리 커밋 질문드립니다.
0
54
1
내부 트랜잭션 커밋은 필수인가요?
0
57
1
프록시 커넥션 객체를 반환할 때 생성하는건가요?
0
54
1
Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)
2
178
2
JPQL 대신 네이티브 쿼리를 사용해야 하는 경우
0
77
1
@EventListener(ApplicationReadyEvent.class) 관련
0
88
1
트랜잭션 동기화 매니저와 데이터 소스
0
76
1
DB 관련 강의 개설 계획은 없으신건가요?
0
133
2
물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요
0
94
1
스프링 3 버전 이상 rollbackFor 변경된듯요
1
112
1
트랜잭션 전파 질문.
0
87
1
프로젝트 오픈 에러
0
126
1
외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다
0
83
2
같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환
0
72
1
h2 인메모리 테스트중 예약어 충돌날 경우 대처방법
0
102
1
커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문
0
98
2





