Transactional

정하윤·2023년 9월 4일
0

Transactional

  • Service에서 mapper로 여러 SQL쿼리를 처리할 때 그 중 하나가 오류가 난 경우 그 전에 실행되었던 SQL 쿼리들이 다 롤백되어야한다.
    이를 트랜잭션 처리라고 부른다.
    // 회원 전체 조회
    @Transactional(readonly =true)
    public List<Member> findMembers(){
         return memberRepository.findAll();
    }
    @Transactional(readonly =true)
    public Member findOnd(Long memberId){
         return memberRepository.findOne(memberId);
    }
}
  • 이와 같이 조회하는 경우에는@Transactional(readonly =true)일떄 효율성이 더높다.
  /*
   *  회원가입
   * */
    @Transactional
    public Long join(Member member){
        validateDuplicateMember(member);
        memberRepository.save(member);
        return member.getId();
    }
  • 회원가입처럼 정보가 변화할 경우에는 @Transactional을하여 true가 아닌 false로 해주어야 문제가 생기지 않는다.(@Transactional의 기본값은 false이다.)
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class Memberservice {

    private final MemberRepository memberRepository;

   /*
   *  회원가입
   * */
    @Transactional
    public Long join(Member member){
        validateDuplicateMember(member);
        memberRepository.save(member);
        return member.getId();
    }
    // 다시 @Transactional을 사용하여 클래스 위에 있는 @Transactional(readOnly=true)보다 우선권을 가짐

    // 존재하는 회원인지 확인하기 위한 코드
    private void validateDuplicateMember(Member member){
        List<Member> findMembers = memberRepository.findByname(member.getUsername());
        if (!findMembers.isEmpty()){
            throw new IllegalStateException("이미 존재하는 회원입니다!");
        }
    }

    // 회원 전체 조회
    public List<Member> findMembers(){
         return memberRepository.findAll();
    }

    public Member findOnd(Long memberId){
         return memberRepository.findOne(memberId);
    }
}
  • 최종적으로 이렇게 작성하는 것이 효율이 제일 좋다고 볼 수 있다

0개의 댓글