회원 가입 기능에 대해 고민하고 구현하며 발생했던 일들을 기록해보았습니다.
목차
1. 회원 가입 로직
2. 트랜잭션 관리
3. 트랜잭션에서 발생한 예외에 대해 롤백하지 않도록 설정
회원 가입 로직
회원 가입 로직에 대해 설명하기 앞서 회원 가입과 관련된 의사 결정을 소개하겠습니다.
(1) 이메일 회원 가입을 구현한다.
(2) 본인 인증은 이메일을 활용한다.
이제 제가 생각해본 회원 가입 로직 2가지를 설명드리겠습니다.
회원 가입 로직 1안
1안 채택 시
- 회원 가입을 진행했지만 미인증으로 마무리된 회원 레코드는 사용도가 떨어질 것입니다.
- 계정 활성화를 나타내는 속성을 테이블에 추가 되어야 합니다. 또한 로그인마다 활성화 속성을 확인해야 합니다.
회원 가입 로직 2안
2안 채택 시
- 인증 코드가 독자적으로 존재할 수 있어야 합니다. 즉, 인증 코드는 엔티티가 되어야 합니다.
- 인증 코드 엔티티에서 이메일 속성을 테이블에 가지고 있어야 합니다.
결론 : 백앤드 측면만 고려했을 때는 2안이 더 좋은 의사 결정이라고 생각합니다. 2안은 우선 테이블 관점에서 2가지 이점과 애플리케이션 레벨에서 3가지 이점을 누릴 수 있습니다.
테이블 관점
1. 미인증된 사용자의 계정 생성 방지
2. 계정 활성화 플래그 컬럼 불필요
애플리케이션 레벨
1. 사용자 로그인 요청 시, 활성화 플래그를 검증 여부 생략 가능
2. 검증에 따라 활성화 플래그가 거짓일 때 해야하는 예외 처리
3. 트랜잭션 처리
2안으로 의사 결정을 내렸지만 우선은 1번으로 개발을 진행했습니다. 1번에서 2번으로 옮겼을 때 발생하는 이점을 직접 체감하기 위함입니다.
트랜잭션 처리
1안의 경우 트랜잭션 처리에 대해 고민해야 합니다.
위 로직을 보면 알다시피 회원 가입이는 회원 가입, 인증 코드 전송이라는 두 가지 로직이 존재하는데요.
이런 상상을 해봅시다. 회원 가입 성공 / 인증 코드 전송 실패
이 경우에는 어떻게 트랜잭션을 처리해야 할까요?
저는 인증 코드 전송이 실패했다고 계정 자체의 생성을 롤백시키면 사용자가 피로하지 않을까? 라는 생각을 했습니다.
이러한 문제를 해결해보도록 합시다. 참고로 현재 이메일 전송 시 발생하는 예외는 MailException 입니다. 해당 예외는 부모는 RunntimeException(언체크 예외)입니다.
제가 알고 있는 이 문제를 해결하는 방법 3가지 입니다.
1. 트랜잭션에서 발생한 예외에 대해 롤백하지 않도록 설정 (채택)
2. 이메일 전송 실패 시 체크 예외 발생
3. 스레드 분리
이제 한 번 문제를 해결해보도록 하겠습니다.
트랜잭션에서 발생한 예외에 대해 롤백하지 않도록 설정
우선 저는 1번을 선택하려고 합니다. (2) 이메일 전송에서 예외 발생하면 인증 코드도 저장되지 않는 것이 바람직하다고 판단합니다. 하지만 회원 계정은 생성해야 합니다. 그렇기 때문에 이 sendAuthCode()에서 시작되는 트랜잭션은 롤백 옵션을 기존 상태로 두어야 합니다.
트랜잭션 처리를 변경해야할 곳은 회원 가입 로직입니다. 아래 빨간 줄 부분을 통해 MailException 이 발생했을 때는 트랜잭션이 롤백되지 않도록 처리하겠습니다.
회원 가입 요청을 보내봅시다. jsmtmt@naver.com 라는 이메일로 요청을 보낼 경우 MailException이 터지도록 해놓았습니다.
MEMBER 테이블
계정이 잘 생성된 것을 확인할 수 있습니다.
MEMBER_AUTH_CODE 테이블
인증 코드는 생성되지 않은 것을 볼 수 있습니다. 생성되었다면 member_id=58 레코드가 존재할 것입니다.
예전에 트랜잭션에 대해 공부했던 내용을 프로젝트에 적용해볼 수 있어서 좋았습니다.
또한 평상시에 당연하게 생각했던 로직들에 대해 고민해보면서 더 바람직한 비즈니스 로직을 만들 수 있어 고민의 중요성을 알게 되었습니다.
'개발일기장' 카테고리의 다른 글
환경에 따라 properties 파일 분리 및 빌드하기 (0) | 2023.05.07 |
---|---|
xuni - 시간과 관련된 테스트는 어떻게 하면 좋을까? (0) | 2023.05.05 |
Xuni - StudyGroup 테이블 Index 도입 배경 (0) | 2023.04.27 |
xuni - Spring Rest Docs 도입하기 (0) | 2023.04.27 |
실행 분석 계획을 통해 인덱스 성능을 알아보자(삽질했어요.) (0) | 2023.04.24 |