영속성 컨텍스트 : "엔티티를 영구 저장하는 환경"
- Server side와 Database 사이에 엔티티를 저장하는 논리적인 영역
- 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
- 눈에 보이지 않는 논리적인 개념
- 엔티티 매니저를 통해 영속성 컨텍스트에 접근
EntityManager.persist(entity);
준영속 엔티티
- 영속성 컨텍스트가 더는 관리하지 않는 엔티티
- 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있음
준영속 엔티티의 문제: JPA가 관리를 안함, 변경을 해도 update가 안됨
준영속 엔티티를 수정하는 2가지 방법
- 변경 감지 기능 사용
- 병합(merge) 사용
- 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용하는 기능
- 넘어온 모든 데이터를 바꿔치기 함
Merge 병합
public void save(Item item){
if (item.getId()==null){
em.persist(item);
}
else{
Item merge=em.merge(item);
}
}
Merge 시 주의사항
- 변경 감지 기능을 사용하면 원하는 속성만 선택해 변경이 가능하지만, 병합을 사용하면 모든 속성이 변경됨
- 병합시 값이 없으면 null로 업데이트 할 위험 존재 (병합은 모든 필드를 교체)
- 실무에서는 보통 변경가능한 데이터만 노출하기 때문에, 병합을 사용하는 것이 더 번거롭다.
- Merge보다는 변경 감지 기능을 사용하는 것이 더 낫다.
- 변경감지 기능을 사용할 때 setter를 사용하면 추적하기 어려우므로 setter 보다는 메소드를 활용
'Backend > springboot' 카테고리의 다른 글
[SpringBoot] 트랜잭션 @Transactional 정리 및 관리 방법 (0) | 2023.01.12 |
---|---|
[SpringBoot] 스프링부트 구글 로그인 API REST 방식으로 구현하기 (2) | 2023.01.11 |
[SpringBoot] JWT 토큰 인증 방식으로 구글 소셜로그인하기 (로직) (0) | 2023.01.01 |
[SpringBoot] @Autowired, IoC(Inversion of Control), DI(Dependency Injection) (0) | 2022.12.23 |
[SpringBoot] Controller vs RestController / RESTful 웹서비스 (0) | 2022.11.05 |