개발자

Transactional 어노테이션 관련

2023년 08월 14일조회 755

스프링 부트의 Transactional 어노테이션 관련 질문입니다. 저희 회사 서비스는 선생님들과 학생 대상으로 제공하고 있습니다. 관리자 페이지에서 선생님이 학생을 등록하는 API에서 Transactional 어노테이션 관련 오류가 생겨 질문드립니다. 먼저 학생 등록 api의 플로우를 말씀드리면 jwt 토큰을 통해 선생님 권한을 인증서버에서 확인 한 뒤 파라미터로 넘어온 학생 정보를 바탕으로 회원가입을 진행합니다. 회원가입 시 회원 테이블에 정보가 생겨 해당 테이블의 PK값을 학생 테이블에 외래키로 지정하여 학생정보를 등록하게 됩니다. 근데 이 과정에서 Transactional 어노테이션을 사용하면 회원가입 이후 PK값을 가져오는 과정에서 commit이 안되어 회원 테이블에 값이 없는 상태여서 오류가 발생합니다. 간단히 정리하면 권한인증 -> 회원 테이블 등록-> 학생 테이블 등록 순입니다.이 상황에서는 어떤 방식으로 처리를 해야될까요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

인기 답변

이양일님의 프로필 사진

안녕하세요! @Transactional 어노테이션을 어떻게 적용하셨는지, 그리고 에러가 어떻게 발생을 하는건지를 명확하게 알수는 없어 정확한 답변을 드리긴 어려울것 같고 힌트가 될수 있는 내용을 말씀드려보겠습니다. 아마도 Isolation Level 이 힌트가 되지 않을까 싶은데요, Isolation Level 은 동시에 서로 다른 트랜잭션이 수행될 때 다른 트랜잭션이 동일한 데이터에 대해서 어떻게 보일지에 대한 범위를 나타냅니다. 만약 회원 테이블에 데이터를 주입하는 로직과 학생 테이블에 데이터를 주입하는 로직의 트랜잭션이 나뉘어져 있고 이때 isolation level 을 기본값으로 잡았다면 commit 되지 않은 데이터를 읽어들일 수 없게 되어 말씀하신 에러가 발생할 수 있습니다.(DBMS 에 따라 다르지만 대부분의 isolation level default 값이 commit 되지 않은 데이터는 가지고 오지 못하는 형태로 정의됩니다.) 만약 이게 맞다면 isolation level 을 commit 되지 않은 데이터도 읽을 수 있는 가장 느슨한 형태인 READ_UNCOMMITTED 로 설정하면 해결하실 수 있습니다. 위 내용에 대한 연장선으로 회원 테이블에 데이터를 주입하는 로직과 학생 테이블에 데이터를 주입하는 로직의 Transaction 이 나뉘어진게 맞다면, Transaction 이 나뉘지 않고 동일한 Transaction 으로 묶여지도록 지정해 주는것도 방법일것 같습니다. 이 부분은 Transaction Propagation 이란 키워드로 검색을 해보시면 힌트를 얻으실 수 있을것 같습니다. 마지막으로 회원 테이블 등록에 대한 commit 이 완료된 뒤 학생 테이블 등록을 진행하는 즉, Transaction 을 각 로직별로 명확하게 분리하고 순차적으로 진행시키도록 로직을 구성하는 방법이 있습니다. 기능에 대한 정확한 스펙을 몰라 이렇게 해도 될지는 스스로 판단을 하셔야할듯 합니다만, 회원 테이블과 학생 테이블 등록에 대한 rollback 이 반드시 같이 발생하지 않아도 된다면 (회원 테이블엔 데이터가 있지만 학생 테이블엔 데이터가 없는 상황이 발생해도 괜찮다면) 이것도 방법이 되지 않을까 싶네요. 앞서 설명드린 Isolation Level 과 Propagation 에 대해 이전에 정리한 글이 있어 공유드립니다. - https://careerly.co.kr/comments/87869?utm_campaign=self-share 부디 저의 짧은 지식이 도움이 되시길 바라겠습니다.

seungcho님의 프로필 사진

seungcho

작성자

컴퓨터정보학과2023년 08월 16일

정말 필요한 정보였는데 감사합니다!!말씀하신대로 commit되지 않은 데이터를 읽어올수없어 생긴 오류였습니다. READ_UNCOMMITTED를 사용하여 해결 할수 있을것 같습니다. 또한 현재 두개의 트랜잭션이 한번에 롤백이 되어야 해서 동일한 Transaction으로 묶어주어야 할것 같습니다. 이해하기 쉽게 답해주셔서 다시 한번 감사드립니다!!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!