일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 리코쳇로봇
- 전적 검색
- 최주호
- 스프링부트
- 인프런
- java
- 테크잇
- 김영한
- 백엔드 스쿨3기
- JPA
- 영속성
- 포트 죽이는법
- 라이엇 API
- 인텔리제이 에러
- 멋쟁이사자차럼
- 백준
- 프로그래머스
- 알고리즘
- already use
- 시소 짝꿍
- BFS
- 엔에첸
- 올리브영 고객센터
- 더티체킹
- DFS
- 조회수중복
- 카카오2023신입공채
- 자바
- 스프링 입문을 위한 자바 객체 지향의 원리와 이해
- 자바ORM표준JPA프로그래밍
Archives
- Today
- Total
My Blog
스프링부트 JPA update,save에 대해서 본문
댓글 수정 기능을 구현하다가 처음에는 댓글을 수정하려는 Comment에 객체를 받아와서 다시 저장하는 방식을 했었다.
public Comment update(Comment comment) {
return commentRepository.save(comment);
}
하지만 이렇게 하면 DB에 반영을 해줘야하기 때문에 영속성 컨텍스트, 더티 체킹을 제대로 활용하지 못하고 결국 비효율적이라는 판단이 된다.
@Transactional
public Comment update(Long id, String content) {
Comment updateComment = findOne(id);
updateComment.setContent(content);
return updateComment;
}
이 코드가 동작하는 이유는 JPA는 더티체킹을 지원한다.
JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영함.
JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태를 스냅샷으로 만들어서 저장함.
트랜잭션이 끝나는 시점에 스냅샷과 비교해서 변경이 있으면 Update Query를 발생 시킴
더티 체킹 대상은 영속성 컨텍스트가 관리하는 엔티티에만 적용한다.
따라서 댓글을 조회했으니 조회 상태를 스냅샷으로 저장하고.
그 값을 변경시켰고, 트랜잭션이 끝났으니 변경 사항을 update Query를 보낸 것이다.
더티 체킹으로 인한 update는 모든 필드에 대해서 업데이트가 된다
엔티티에 필드가 20~30개가 넘어가면 업데이트를 할 때 부담스러울 수 있다.
그럴때는 @DynamicUpdate 어노테이션을 엔티티에 달아주자.
728x90
Comments