JPA는 자바 ORM 기술에 대한 API 표준 명세를 말한다.
ORM은 Object Relational Mapping의 약자로, 객체 관계 DB의 데이터를 자동으로 매핑해주는 것을 말한다.
- 개발자는 DB와의 상호작용을 위한 SQL 코드를 작성할 필요가 없다.
- 대신 JPA 가 객체를 DB에 매핑하고 처리한다.
- DB 종류에 상관없이 사용할 수 있다.
- 다양한 DB에 대한 지원을 제공하기 때문에 → 다른 DB로 이전할 때도 코드를 수정할 필요가 없다.
- DB와의 연결을 관리하기 때문에, 애플리케이션에서의 DB 연결 오버헤드를 줄여준다.
✅ 이러한 이유들로 인해, JPA는 JAVA에서 DB와의 상호작용을 처리할 때 많이 사용되는 기술 중 하나이다.
영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 말한다.
엔티티 매니저를 생성하면 자동으로 영속성 컨텍스트가 생성되고 엔티티를 관리/보관할 수 있다.
영속성 컨텍스트의 속성은 비영속 / 영속 / 준영속 / 삭제 가 있다.
@Id 값을 가지고 있다.
- 1차 캐시를 가지고 있다.
- 내부적으로 1차 캐시를 가지고 있어서 같은 객체를 반복해서 조회할 때 캐시에서 바로 객체를 가져올 수 있다.
- 라이프사이클을 가지고 있다.
- 객체가 영속성 컨텍스트에
추가되면 →영속상태로 변하고, 관리된다.- 이후
수정되면 →준영속상태가 되고삭제되면 →삭제상태가 된다.
- 지연 로딩 제공
- 연관된 객체를 조회할 때, 필요한 시점에서 DB에서 가져와서 객체 그래프를 구성할 수 있다.
- 변경 감지
- 트랜잭션 범위에서 동작하기 때문에 트랜잭션이 커밋되거나 롤백되면
→ 영속성 컨텍스트에서 관리하는 모든 객체의 상태가 적용되거나 취소된다.
- 객체 상태 관리를 자동으로 처리해 준다.
☞ 즉, DB에 변경사항을 반영하기 위해 별도로 코드를 작성하지 않아도 된다.
- 중복된 데이터를 제거해주는 캐시 기능을 제공한다.
☞ 이를 통해 동일한 객체를 여러 번 조회하는 경우, DB에 접근하지 않고 영속성 컨텍스트에서 객체를 가져올 수 있다.
- 트랜잭션을 지원하기 때문에 한 번에 여러 개의 객체를 처리할 수 있다.
✅ 이러한 영속성 컨텍스트의 이점들은 애플리케이션의 성능을 향싱시키고, 개발자의 생산성을 높여준다.
즉시로딩(
Eager)은 엔티티즐 조회할 때, 연관된 엔티티도 함께 조회한다.
- 이 로딩은 DB와의 상호 작용을 줄이고, 성능을 최적화할 수 있다.
지연로딩(
Lazy)은 연관된 엔티티를 실제 사용할 때 조회한다.
- 이 로딩은 메모리 사용량을 줄이고, 성능을 향상시킬 수 있다.
🌷 예를 들어, Question과 그에 해당하는 List를 함께 조회할 때,
더티 체킹은 트랜잭션 안에서 엔티티의 변경이 일어났을 때, 변경한 내용을 자동으로 DB에 반영하는 것을 말한다.
- Dirty = 상태의 변화가 생겼다.
- Checking = 검사해보자 !
더티 체킹을 검사하는 대상은 영속성 컨텍스트가 관리하는 엔티티이다.
수정됐음(dirty) 으로 표시N+1 문제란 JPA를 사용할 때 일부 연관 관계를
Eager(즉시 로딩)으로 설정하고, 이와 연관된 데이터를 가져올 때, SQL 쿼리가 N번 발생하여 성능 문제가 발생하는 현상을 말한다.