JPA 5

[JPA] 더티 체킹(Dirty Checking)? + 동시성 이슈/제어

1. 더티 체킹 개념더티 체킹(Dirty Checking): JPA의 기능으로, 영속성 컨텍스트에 담긴 엔티티의 상태 변화를 자동으로 감지하여 트랜잭션 커밋 시점에 변경 사항을 데이터베이스에 반영하는 메커니즘. 2. 영속성 컨텍스트(Persistence Context)정의: 엔티티를 영속성 컨텍스트에 담아 관리하는 일종의 캐시.역할: 엔티티의 상태를 추적하고, 변경된 엔티티를 데이터베이스에 자동으로 반영. 3. 엔티티의 생명주기비영속 상태(New/Transient): 엔티티가 영속성 컨텍스트에 담기지 않은 상태.영속 상태(Managed): 엔티티가 영속성 컨텍스트에 담긴 상태. 더티 체킹의 대상.준영속 상태(Detached): 영속성 컨텍스트에서 분리된 상태.삭제 상태(Removed): 엔티티가 삭제된 ..

JPA 2024.06.13

[JPA] 엔티티 설계시 주의점

엔티티 설계시 주의점 1. 엔티티에는 가급적 Setter를 사용하지 말자 Setter가 모두 열려있다 -> 변경 포인트가 너무 많아서 유지보수가 어렵다 2. 모든 연관관계는 지연로딩(fetch = FetchType.LAZY)으로 설정하자 즉시로딩은 특정 엔티티를 조회할 때(로딩될 떄) 연관된 모든 엔티티를 조회한다. 기본적으로 전부 지연로딩(LAZY)로 셋팅을 하고 필요에 따라 연관된 원하는 엔티티를 같이 조회할 경우 fetch join 또는 엔티티티 그래프로 최적화를 하는 것이 좋다 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다 특히 JPQL을 실행할 떄 N+1 문제가 자주 발생한다 실무에서는 모든 연관관계는 지연로딩(LAZY)로 설정해야 한다 연관된 엔티티를 함께 DB..

JPA 2021.11.26

[JPA] Pageable 사용 시 Page<Entity>를 Page<DTO>로 변환하기(Builder, 람다식 사용)

각 레이어간의 역할을 확실히 분리하기 위해서 클라이언트에 전달 할 객체는 항시 DTO로 변환해서 전달 합니다. 이떄 Spring Data Jpa 에서 제공하는 Pageable을 사용할 경우 반환받은 Page를 Page로 변환하는 상황이 생겨서 기록하였습니다. 1. Repository public interface BoardRepository extends JpaRepository { // Containing : like와 비슷한 문법 Page findByTitleContainingOrContentContaining(String title, String content, Pageable pageable); } 'title'과 'content'를 인자값으로 전달받아 where 검색결과를 return하도록 설정..

JPA 2021.10.26

[JPA] 변경 감지(Dirty Checking) 와 병합(merge)

변경 감지(Dirty Checking) 와 병합( merge ) * 준영속 상태? - 영속 상태였다가 더는 영속성 컨텍스트가 관리하지 않는 상태 - 영속성 컨텍스트로부터 분리된 상태 * 준영속 상태를 만드는 3가지 방법 - em.detach(entity) : 특정 엔티티만 준영속 상태로 전환 - em.clear() : 영속성 컨텍스트를 완전히 초기화 - em.close() : 영속성 컨텍스트를 종료 * 준영속 엔티티? - 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. - 엔티티의 데이터를 가지고 있는 클라이언트 사이드로 넘기기 위한 객체 * 준영속 엔티티를 수정하는 2가지 방법 1. 변경 감지 기능 사용 2. 병합( merge ) 사용 * 변경 감지 기능을 사용하면 원하는 속성만 선택해서 변경할..

JPA 2021.09.16

[JPA] Spring Data JPA를 이용한 페이징 처리

JPA 페이징 관련하여 다양한기능들이나 동작원리, 개념 등 정리가 잘 된 글들이 많다. 추후 참고 해보자. 여기선 예시를 통해 기본으로 간단하게 JPA로 페이징 처리를 해보자. 아래 설명할 예시는 아래의 가이드문서를 참고했습니다. https://docs.spring.io/spring-data/jpa/docs/2.3.1.RELEASE/reference/html/#reference Spring Data JPA - Reference Documentation Example 108. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List..

JPA 2021.08.19