본문 바로가기

JPA5

[JPA] N + 1 문제 N + 1 문제 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상입니다. 🏷️ 예시 위와 같이 DB가 만들어져 있었을 때, EAGER(즉시 로딩)으로 한 경우와 LAZY(지연 로딩)으로 한 경우를 살펴보겠습니다. ✅ Fetch 모드를 EAGER(즉시 로딩)으로 한 경우 // User 엔티티 @Entity public class User { @Id @GeneratedValue private long id; private String firstName; private String lastName; @ManyToOne(fetch = FetchType.EAGER)// 즉시 로딩 @JoinColumn(name = "team_id.. 2024. 4. 23.
[JPA] findById와 getReferenceById 🏷️ 데이터를 가져오는 방식 ✅ findById Optional findById(ID id) ▪️ Optional: 조회된 엔티티를 Optional로 감싼 반환 타입입니다. Optional은 엔티티가 존재하지 않을 수도 있는 경우에 사용됩니다. ▪️ ID: 조회할 엔티티의 식별자(ID) 타입입니다. ▪️ 조회된 엔티티 객체를 Optional로 감싸서 반환합니다. ▪️ CrudRepository와 JpaRepository 인터페이스에서 모두 제공되는 메소드입니다 ✅ getReferenceById public T getReferenceById(ID id) ▪️ T: 반환 타입으로 엔티티의 클래스 타입입니다. ▪️ ID: 조회할 엔티티의 식별자(ID) 타입입니다. ▪️ 엔티티가 영속성 컨텍스트에 없으면 Ent.. 2024. 3. 9.
[JPA] 영속성 컨텍스트 영속성 컨텍스트 영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻으로 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 합니다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리하게 됩니다. // 엔티티 매니저를 사용해 사용자 엔티티를 영속성 컨텍스트에 저장한다는 의미입니다. em.persist(user); 🏷️ 특징 ✅ 영속성 컨텍스트 생성 시점 엔티티 매니저를 생성할 때 하나 만들어집니다. ✅ 영속성 컨텍스트관리 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있습니다. ✅ 영속성 컨텍스트의 식별자 값 영속성 컨텍스트는 엔티티를 식별자 값으로 구분하기 때문에 영속 상태는 식별자 값이 반드시 있.. 2024. 3. 2.
[JPA] JPA Auditing JPA Auditing Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고 있는 필드나 컬럼들이 존재합니다. 대표적으로 생성일, 수정일같은 필드 및 컬럼으로 데이터베이스에서 누가, 언제하였는지 기록을 잘 남겨놓아야 하기 때문에 이 컬럼은 대단히 중요한 데이터 입니다. 또한 도메인마다 공통으로 존재한다는 의미는 결국 코드가 중복된다는 말과 일맥상통합니다. 그래서 JPA에서는 Audit이라는 기능을 제공하고 있습니다. Audit은 감시하다, 감사하다라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터.. 2024. 2. 11.
[JPA] @Entity는 기본 생성자를 왜 가져야 하는가? @Entity는 기본 생성자를 왜 가져야 하는가? @Entity(name = "user_datails") public class User { @Id @GeneratedValue private Integer id; private String name; private LocalDate birthDate; @OneToMany(mappedBy = "user") private List posts; public User(Integer id, String name, LocalDate birthDate) { this.id = id; this.name = name; this.birthDate = birthDate; } public User() { } // getter, setter, toString 생략 } 위와 같이 .. 2023. 11. 22.