[JPA] Spring Data JPA의 findById
https://akira6036.tistory.com/62
Spring Data JPA에서의 Transaction 및 수정 작업
오늘의 주제는 다음과 같다. 다음 문장을 읽고 바로 그 질문에 대한 해답이 떠오른다면 본 게시글을 굳이 읽지 않아도 될 것이다. "Spring Data JPA에서, Service나 Repository 계층에 트랜잭션(Transaction)을
akira6036.tistory.com
일반적으로 Spring Data JPA의 findById 같은 리포지토리 메서드는 기본적으로 읽기 전용 트랜잭션 안에서 실행ehla.
- 메서드 호출 시점: 리포지토리 메서드(findById)가 호출되면 스프링이 내부적으로 읽기 전용 트랜잭션을 시작하여 데이터베이스에서 해당 엔티티를 조회.
- 메서드 종료 시점: 조회가 완료되면 트랜잭션이 종료되고, 엔티티는 영속성 컨텍스트에서 분리(detached).
따라서, 별도의 서비스 계층에서 트랜잭션을 관리하지 않고 단순히 findById만 호출한다면,
메서드 실행이 끝나면서 트랜잭션도 종료됨.
추가 고려사항:
- 만약 조회한 엔티티의 연관관계가 LAZY로 설정되어 있고, 트랜잭션 종료 후에 해당 연관관계를 접근하려고 하면 LazyInitializationException이 발생할 수 있음.
- 이런 경우에는 필요한 연관 데이터를 미리 로딩.
- 서비스 계층에서 명시적으로 @Transactional을 사용하여 트랜잭션 범위를 넓게 잡아두는 방법을 고려.
https://chaemin0707.tistory.com/38
[TIL] JPA와 트랜잭션
public CommentResponseDto createComment(User user, Long todoId, CommentRequestDto requestDto) { Todo todo = todoRepository.findById(todoId).orElseThrow( () -> new NoExistTodoException() ); Comment comment = new Comment(requestDto, user, todo); commentRepos
chaemin0707.tistory.com
@Transactional 사용 시 주의점
1. 트랜잭션을 적용하려는 메서드는 반드시 public으로 선언되어야 한다.
- @Transactional의 동작 방식은 AOP를 통해서 이루어진다.
즉, 프록시 객체를 생성하여 해당 메서드에 접근하는데 private이나 protected로 선언되어 있다면 프록시 객체가 생성될 때 해당 메서드에 접근할 수 없다.
private이나 protected로 되어 있다고 오류가 나는 것은 아니지만 @Transactional이 동작하지 않는다.
2. 다른 AOP 기능과의 충돌을 고려해야 한다.
앞서 말했듯이 @Transactional은 AOP를 이용한다.
3. Service 계층에서 사용하자.