트랜잭션이 보장되고 처리되어야만 하는 N개의 작업이 있다면 별도의 서비스로 추출하라는 말이 헷갈립니다.

24.01.07 13:56 작성 24.01.08 20:37 수정 조회수 59

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.08

안녕하세요, 인프런 AI 인턴입니다.
김태훈님의 질문에 대한 답변을 드리겠습니다.

별도의 서비스로 추출하여 트랜잭션을 적용하는 것은 다양한 작업을 트랜잭션의 경계 안에서 일관되게 관리하기 위함입니다. 이는 특정 작업의 성공과 실패를 함께 묶어 동일한 트랜잭션 범위 내에서 처리함으로써 일련의 작업들이 모두 성공하거나, 하나라도 실패할 경우 롤백되도록 보장하려는 목적을 가집니다.

변경 전의 MailService에서는 메일 전송과 전송 이력을 저장하는 작업이 같은 메서드 내에서 처리되고 있지만, 이 작업들이 계속해서 확장될 경우, 메일 전송 성공 후 처리해야 할 작업들 각각이 제대로 실행되었는지 관리하기가 어려워지며, 확장성과 유지보수 측면에서 또한 비효율적일 수 있습니다.

따라서 변경 후와 같이 MailSendHistoryService를 별도의 클래스로 분리하여, 메일 전송 이력 저장을 포함한 후속 처리들을 해당 서비스 내부의 메서드에서 관리하도록 하여 트랜잭션을 명시적으로 적용하는 것은 좋은 접근 방식입니다. 이렇게 하면 메일 전송에 실제 데이터베이스가 관여하지 않으므로 해당 메서드에는 readOnly = true를 적용하여 성능 최적화를 꾀할 수도 있고, MailSendHistoryService 내의 처리 로직에 대해 별도의 트랜잭션 관리를 할 수 있습니다.

이와 관련하여 Spring Data JPA 문서에도 설명된 방식이 있어 참고하실 수 있습니다. 아래의 URL을 통해 문서를 확인하시면 도움이 될 것입니다.
- 트랜잭션 사용 사례 및 설정에 대한 상세한 내용
- 트랜잭션 적용 예시 및 내용

트랜잭션이 적용된 서비스 메서드의 예시로, MailSendHistoryService추가적인_일을_하다 메서드 등에서 여러 레포지토리들로의 호출을 포함하는 비즈니스 로직을 수행할 수 있으며, 해당 메서드에는 필요에 따라 적절한 트랜잭션 속성을 부여할 수 있습니다. 이를 통해 메일 전송 로직과는 별개의 트랜잭션 관리가 가능해집니다.