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();
}
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);
}
}
- 최종적으로 이렇게 작성하는 것이 효율이 제일 좋다고 볼 수 있다