[JPA] Repository 커스텀 메서드 트랜잭션 처리 @Transactional

Junseo Kim·2020년 4월 19일
0

간단한 Tip

목록 보기
10/20

기본적으로 JpaRepository가 제공하는 메서드들은 모두 트랜잭션 처리가 되어있다.

그렇지만, 우리가 만들어서 추가한 메서드들은 트랜잭션 처리가 안되어 있기 때문에, repository에 @Transactional을 붙여주거나, 각각 메서드에 @Transactional을 붙여줘야한다.

이렇게 repository는 항상 트랜잭션 처리를 해주는 것이 좋다.

트랜잭션 처리를 한 repository를 사용해서 데이터를 가져오면, 그 객체는 persistent 상태이다. 즉 영속성 컨텍스트에서 관리하는 객체가 된다.

이 트랜잭션 안에서 상태값을 변경하면 영속성 컨텍스트가 객체 상태의 변경을 감지하고 있다가 트랜잭션이 끝났을 때 DB에 sync를 하는 것이다.

주의점

만약 http 세션에 들어있던, 인증 정보 안에 들어있던 principal 객체의 정보를 이용하려 하면, 이 정보는 이미 트랜잭션이 끝난 상태이기 때문에 detached 상태이다. 따라서 영속성 컨텍스트에서 관리하지 않는다. 따라서 값을 변경하여도 DB에 반영되지 않는다.

이런경우는 다시 repository를 사용하여 save 해주던가 해야한다.

따라서 JPA 사용할 때는 수정하고 있는 객체의 상태와, 트랜잭션이 있는 지 잘 확인해야한다.

0개의 댓글