• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

무조건적인 @Transactional?

23.08.31 00:45 작성 조회수 335

0

@Service
@RequiredArgsConstructor
public class SignUpMemberService implements SignUpMemberUseCase {
    private final MemberRepository memberRepository;

    @Override
    public Long invoke(final Command command) {
        validateEmailIsUnique(command.email());
        validateNicknameIsUnique(command.nickname());
        validatePhoneIsUnique(command.phone());

        final Member member = command.toDomain();
        return memberRepository.save(member).getId();
    }
}

@Service
@Transactional
@RequiredArgsConstructor
public class SignUpMemberService implements SignUpMemberUseCase {
    private final MemberRepository memberRepository;

    @Override
    public Long invoke(final Command command) {
        validateEmailIsUnique(command.email());
        validateNicknameIsUnique(command.nickname());
        validatePhoneIsUnique(command.phone());

        final Member member = command.toDomain();
        return memberRepository.save(member).getId();
    }
}

사용자 가입 UseCase에 대한 구현에서 앞단에서는 unique field에 대한 validation을 진행합니다

그 후에 memberRepository.save(member)를 진행하는데 (memberRepository는 Data Jpa Repo)

아시다시피 SimpleJpaRepository의 save흐름에는 @Transactional이 적용되어 있습니다

따라서 이 SignUpMemberService의 invoke 흐름부터 굳이 @Transactional을 걸어야 하는 생각이 듭니다

물론 붙임으로써 이 메소드가 writable한 로직을 가진다고 코드레벨에서 알고 JPA를 모르는사람은 SimpleJpaRepository의 구조를 모르기 때문에 가독성?적인 측면에서는 붙이는게 이해에 수월하다고 생각하는데 tx scope를 최대한 짧게 가져가는게 좋다는 생각이 들어서 약간의 고민을 하게 되었습니다

 

답변 1

답변을 작성해보세요.

1

y2gcoder님의 프로필

y2gcoder

2023.08.31

안녕하세요. avenue님, 공식 서포터즈 y2gcoder입니다.

avenue 님께서 말씀하신 부분을 듣고 생각해봤을 때는 @Transactional 을 굳이 붙일 필요 없을 것 같다고 생각했습니다.

  1. writable 한 로직임을 보여주기 위해: 제가 avenue님의 동료 개발자라고 생각했을 때, @Transactional 을 보고 해당 로직이 writable한 로직을 파악할 수도 있지만 메서드 이름이나 memberRepository.save() 와 같은 사용하는 의존성의 메서드 이름을 보고 파악할 수도 있다고 생각했습니다.

  2. 그리고 작성하신 UseCase를 봤을 때, 해당 부분은 application 헥사곤에서 usecase를 구현한 service라고 판단했습니다. 해당 서비스에서 영속성 구현체를 뭘 쓰는지에 대해 알 필요는 없다고 생각합니다.

  3. @Transactional 이 필요한 메서드로 보이지 않습니다. 하나의 트랜잭션으로 묶어야 하는 작업이라면 메서드 위에 @Transactional을 붙이는 것을 말씀드릴 것 같은데, 해당 로직만을 봤을 때는 @Transactional로 묶어줘야할 작업으로 보이진 않았습니다! 그래서 해당 케이스라면 말씀하신 것처럼 트랜잭션 스코프를 차라리 짧게 가져가는 게 좋아보였습니다!

 

감사합니다.