inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

무조건적인 @Transactional?

해결된 질문

521

avenue

작성한 질문수 16

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를 최대한 짧게 가져가는게 좋다는 생각이 들어서 약간의 고민을 하게 되었습니다

 

java jpa @transactional SimpleJpaRepository

답변 1

1

y2gcoder

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

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

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

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

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

 

감사합니다.

inheritance startegy 선택시 고려사항

0

11

0

Entity 동등성 비교

0

14

1

실무 조언 관련 질문입니다.

0

41

1

H2데이터베이스 파일 생성

0

52

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

49

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

48

1

JPQL 메소드와 락

0

53

1

Delivery @OneToOne

0

57

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

89

2

UnsupportedOperationException 발생

0

82

3

H2 Database 연결이 안됩니다.

0

89

2

연관관계 매핑 질문드립니다.

0

82

2

h2데이터베이스 실행오류

0

105

2

persistence.xml

0

103

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

77

1

영속성 컨텍스트

0

62

1

JPA 프록시

0

90

1

Native Query와 MyBatis

0

63

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

84

1

임베디드 타입 예시 코드 관련 질문

0

112

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

91

3

인텔리제이 패키지 커서 단축키 질문

0

106

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

138

1

양방향 연관관계 시 연관관계 주인을 설정하는 이유

0

68

1