베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • Spring
    • 코드업
    • 스레드
    • 알고리즘
    • C++
    • 자바8
    • 스프링
    • 토비스프링
    • jpa
    • 데이터베이스
    • 이펙티브자바
    • 운영체제
    • 스프링시큐리티
    • BFS
    • 함수형인터페이스
    • java
    • 백준
    • 자바
    • dfs
    • leetcode

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    트랜잭션 전파 레벨 정하기
    프로젝트 기록

    트랜잭션 전파 레벨 정하기

    2023. 7. 25. 04:21

    🔍 이메일 인증 기능

    이메일 인증 기능을 구현하고 있는데 트랜잭션 전파레벨과 관련한 문제가 있어 이를 정리하고자 합니다. 현재 로직은 다음과 같습니다.

    1. 회원가입을 하면 이메일로 UUID를 포함한 URL이 전송된다.
    2. 링크로 접속을 한다.

      2-1. 만료가 되지 않았다면 사용자 인증 처리 된다.

      2-2. 만료되었다면 UUID만 바꿔서 이메일은 재전송한다.

    문제는 2-2에서 발생하였습니다. 이메일에는 바뀐 UUID로 전송이 되지만 DB에는 업데이트가 되지 않았습니다.

     

    🔍 문제의 원인

    문제의 원인은 빨간색 박스에 있습니다. 스프링에서 @Transactional는 같은 트랜잭션 안에서 하나의 쿼리라도 에러가 나면 모두 롤백하는 원자적 특성을 가지고 있습니다.
    EmailToken이 만료가 되면 이를 새로 생성하고 예외를 던지는데, 이 부분에서 모두 롤백이 생깁니다.

    트랜잭션 에러가 난 코드

    만약 이메일 토큰도 새로 생성하고 싶고, 예외로 던지고 싶은데 어떻게 해야 할까?

     

    🔍 트랜잭션 전파 레벨

    트랜잭션 전파 레벨은 총 7가지가 있습니다.

    1. REQUIRED : 트랜잭션이 없다면, 새로운 트랜잭션을 생성한다.
    2. REQUIRES_NEW : 부모의 트랜잭션과 상관없이 항상 새로운 트랜잭션을 생성한다.
    3. SUPPORTS : 현재 트랜잭션이 있으면 이를 따라가고, 없으면 non-transactional하게 동작한다.
    4. NOT_SUPPORED : non-transactional하게 실행되며, 부모 트랜잭션이 존재하면 정지한다.
    5. MANDATORY : 부모 트랜잭션내에서 실행되면, 트랜잭션이 없으면 예외가 발생한다.
    6. NESTED : 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백된다. 부모 트랜잭션이 없는 경우에는 REQUIRED와 동일하게 동작한다.
    7. NEVER : non-transactional하게 실행되며 트랜잭션이 존재하면 예외가 발생한다.

     

    🔍 문제 해결

    @Transactional의 전파 레벨은 REQUIRES_NEW로 설정하여 해결하였습니다.

    트랜잭션 전파 레벨 수정

     

    🔍 테스트 코드

    테스트 코드 작성

    저작자표시 비영리 변경금지 (새창열림)
      '프로젝트 기록' 카테고리의 다른 글
      • Docker Compose를 이용한 Vue 프로젝트 실행
      • Docker Compose를 이용한 프로젝트 실행
      • JWT 토큰 만료 에러 분석
      • OSIV 필터와 지연로딩 에러
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바