더티체킹이란
"상태변경검사"라고 생각을 하면 쉽다
public void update(Long id, String status) {
User user = userRepository.findById(id).orElse....;
user.setStatus(status);
userRepository.save(user);
}
User의 아이디로 데이터를 불러온 뒤 수정한다음, 수정한 User객체를 save메서드로 저장하였다.
save()메서드는 새로운 데이터를 만들어서 저장할 때 쓰이기도 하지만, 위와 같은 상황에서 쓴다면 update쿼리가 수행된다.
JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해준다.
변화의 기준은 최초 조회 상태 이다.
JPA에서 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 기억을 해 놓는다.
그리고 트랜잭션이 끝나는 시점에 기억해 놓은 것과 다른점이 있으면 update 쿼리를 데이터베이스로 전달한다.
컬럼이 엄청 많으면 어떡해
위에서 설명했듯이 JPA는 변화가 있는 엔티티 객체를 반영하는데 필드가 하나만 바뀌더라도 모든 필드를 업데이트한다.
그런데 필드가 진짜 엄청 많다면 그 많은 필드를 다한다는 것은 성능의 저하가 올수도 있다.
(물론 필드가 20~30개 이상 되는 것은 정규화가 잘못된 확률이 크고, 보통 15개 넘는 필드를 가진 테이블은 없다.)
내가 원하는 필드의 값만 update하고 싶다면 아래와 같이 @DynamicUpdate 어노테이션을 선언해주면 된다.
@Entity
@Table(name = "user")
@Builder
@DynamicInsert
@DynamicUpdate // 변경한 필드만 대응되게 함
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String password;
@Column(name = "user_email", nullable = false, unique = true)
private String email;
@Column(name = "user_name", nullable = false)
private String name;
}
참고
https://jojoldu.tistory.com/415
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
IT 커리어 성장 코스 항해99, 첫 취업부터 현직자 코스까지
항해99는 실무에 집중합니다. 최단기간에 개발자/PM으로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.
hanghae99.spartacodingclub.kr
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
[항해 취업코스] 개발자 취준 기록 6 - Java의 컴파일 과정(JVM) (0) | 2024.03.05 |
---|---|
[항해 취업코스] 개발자 취준 기록 5 - JVM의 구성과 특징 (0) | 2024.03.05 |
[항해 취업코스] 개발자 취준 기록 3 - JPA는 무조건 좋은가 (0) | 2024.03.04 |
[항해 취업코스] 개발자 취준 기록 2 - 오버로딩, 오버라이딩 (0) | 2024.03.04 |
[항해 취업코스] 개발자 취준 기록 1 - Call by Reference (0) | 2024.03.04 |