53DAYS) [Spring MVC] 트랜잭션 - JTA 방식을 이용한 분산 트랜잭션 적용, 트랜잭션 적용 실습

nacSeo (낙서)·2023년 1월 2일
0

◉ 학습목표

1. 분산 트랜잭션을 샘플 애플리케이션에 적용시킬 수 있다.
  1. JTA를 이용한 분산 트랜잭션 적용

⦿ 학습내용

☞ 분산 트랜잭션

✔︎ 서로 다른 데이터 소스를 사용하는 한 개 이상의 데이터베이스를 하나의 트랜잭션으로 묶어 처리하는 것

☞ Atomikos

✔︎ Spring Boot에서 스타터로 지원하는 가장 인기있는 오픈 소스 트랜잭션 관리자

  1. 트랜잭션 적용 실습

⦿ 학습내용

☞ 회원 가입 시 이메일 전송에 실패할 경우

✔︎ 이메일 전송에 실패하더라도 사용자가 회원가입 절차를 다시하는 번거로움을 없애기 위해 저장된 회원정보를 삭제(rollback)하지 않는 방법
✔︎ 회원 가입 완료 이메일에 회원이 확인해야할 중요 정보가 담겨있기 때문에, 이메일 전송 실패 시 회원정보 삭제(rollback) 또는 회원가입 상태를 미완료로 유지하는 방법
✔︎ 이메일 전송에 실패하더라도 삭제(rollback)하지 않고, 메신저나 문자서비스로 회원 가입 추가 메세지를 전송하는 방법

❗️ 실습에 적용하는 방법은 2번째 방법!

☞ 실습 내용

✔︎ 회원이 등록되었다는 사실을 알리는 이벤트 역할을 하는 MemberRegistrationEvent 클래스 생성
✔︎ MemberRegistrationEvent 클래스 객체 생성 시, 이벤트에 포함될 회원 정보를 파라미터로 넘김
✔︎ MemberService 클래스의 createMember 메서드에 이벤트를 담아 publish 실시
✔︎ 이벤트가 발생하면 리스닝해서 처리하는 MemberRegistrationEventListener 클래스 생성
✔︎ MemberRegistrationEventListener 클래스 내에서는 비동기 처리를 위해 클래스에 @EnableAsync, 메서드에 @Async 애너테이션 활용
✔︎ Member 클래스의 Stamp 객체와 일대일 매핑 애너테이션의 cascade 애트리뷰트 값으로 CascadeType.REMOVE 추가

❗️ 결론 : 애플리케이션을 실행하여 postman을 통해 멤버를 생성해주면, 201 OK가 뜨지만, 이메일 전송에 실패함으로써 rollback되어 H2 웹 콘솔을 통해 Member를 확인해보면 정상적으로 삭제됨

☞ 실습 과제를 통해 배울 수 있는 점

✔︎ 비동기, 트랜잭션은 데이터베이스에 국한된 게 아님!
✔︎ Spring에서 Application Event PublisherEvent Listener를 이용한 이벤트 퍼블리싱

  • ApplicationEventPublisher
  • @EventListener

✔︎ Spring에서 비동기적으로 스레드를 생성하는 방법

  • @EnableAsync
  • @Async

◉ 느낀 점

☞ 단일 데이터베이스에 대한 트랜잭션 적용 방식인 로컬 트랜잭션 학습에 이어서 분산 트랜잭션에 대해 학습해봤다. 그 동안 사용해왔던 H2 인메모리 DB와 같은 경우는 분산 트랜잭션에서 정상적으로 동작하지 않을 수 있기 때문에 MySQL DB를 활용하며 좀 더 친해지기 위해 사용법을 익히는 시간도 가져봤다.
학습 후 트랜잭션에 대한 실습 과제를 진행했는데, 이벤트 퍼블리싱 등 학습하지 않은 내용들을 사용해야 해서 처음엔 많이 당황하기도 했지만, 라이브 세션을 통해 강사님의 설명을 들으며 열심히 이해해보려 노력했다..!! 그래도 내 생각과 같이 동작하게 만드니 뿌듯함은 이로 말할 수 없었다 ☺️
내일부터는 테스팅 파트에 들어간다. QA 직군에 대해 알아본 적도 있고, 정보처리기사를 준비하며 많이 접했던 테스트에 관한 내용이므로 얼마나 중요한 내용들인지 잘 알고 있다! 지치지말고 부단히 노력해보자 :)

◉ 내일의 키워드

・ 단위 테스트
・ JUnit
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글