Inflearn Community Q&A
@Transactional
Written on
·
390
1
안녕하세요
강의 중 @Transactional 처리를 Repository에서 하신 적은 없으신데 저 같은 경우는 em.persist()만 하는데도 Repository에 @Taransactional이 필요하더라구요 없으면
cannot reliably process 'persist' call 와 같은 에러가 발생합니다.
제가 사용하는 코드 입니다.
@Transactional
@Override
public Long save(Member member) {
em.persist(member);
return member.getId();
}
// 아래 코드는 서비스 클래스 입니다
// 구글 사용자 정보가 업데이트 되었을 때를 대비하여 update 기능 구현(이름만 반영)
@Transactional
public Member saveOrUpdate(OAuthAttributes attributes) {
Member member = memberRepository.findByEmail(attributes.getEmail());
if (member == null) {
Long id = memberRepository.save(attributes.toEntity());
return memberRepository.findOne(id);
}
return member.update(attributes.getName());
}
웹앱JPAspring-bootspringjava
Quiz
61% of people got it wrong. Give it a try!
회원 가입 시 화면 입력 데이터를 엔티티 객체 대신 별도의 Form 객체로 받는 주된 이유는 무엇일까요?
데이터베이스 성능을 최적화하기 위해서
화면 종속적인 데이터나 유효성 검증 로직을 분리하기 위해서
JPA 영속성 컨텍스트와 직접적인 관계를 맺기 위해서
코드의 자동 생성 기능을 활용하기 위해서
Answer 2
6
yh
Instructor
안녕하세요. lbd4946님
JPA의 모든 데이터 변경은 트랜잭션 안에서 발생해야 합니다. 따라서 트랜잭션이 없으면 데이터 변경에 실패합니다.
트랜잭션 애노테이션이 서비스에 있으면 해당 서비스의 메서드가 종료될 때 까지 모든 곳에 영향을 미칩니다.
예를 들어서 서비스에서 리포지토리를 호출해도 서비스에서 시작한 트랜잭션은 계속 유지가 되면서 리포지토리를 사용합니다.
따라서 리포지토리에 꼭 트랜잭션 애노테이션이 없어도 됩니다.
도움이 되셨길 바래요^^
1





