JPA 책을 이제 막 다 읽었다.
ORM을 처음 공부한다는 생각에 긴장이 많이 됐지만, DB 공부도 하고, 객체지향에 대한 공부를 충분히 한 상태여서 그런지 생각보다 기존에 읽었던 real mysql, 토비의 스프링 3.1보다 잘 읽혔다.
기존에 database layer는 Mybatis 프레임워크를 이용해 구현했지만, 이는 문제가 있었다. SQL 중심의 개발이 되는 것이다.
앞으로 할 일이 많이 남았으므로, JPA로의 리팩터링을 슬슬 시작해보자.
JPA
- Java Persistence API
- 자바 진영의 ORM 표준 기술
ORM
- Object Relational Mapping
- 객체와 관계형 데이터를 매핑
- 데이터를 객체에 저장할 수 있다.
Hibernate
- 가장 많이 사용되는 ORM 프레임워크
- JPA 인터페이스를 구현한 것이 Hibernate
JPA 탄생 배경
JDBC를 이용한 개발은 객체 중심이 아닌 데이터를 중심으로 구조화되어있다.
객체와 데이터베이스와의 패러다임 불일치로 인해 상당히 개발 과정이 번거로울 수밖에 없다. 예를 들어
- 데이터를 매핑할 객체를 정의
- 매퍼 정의
- SQL 작성
이러한 SQL 중심적인 개발은 변경사항이 생길 경우 저 과정을 무한 반복한다.
개발자인지, SQL 매퍼인지 헷갈릴 지경이다.
보다 객체지향적인 개발에 집중하기 위해 자바 진영은 JPA를 만들었다.
JPA의 동작
JPA 장점
1. 생산성 및 유지보수에 용이하다.
특정 데이터베이스에 종속되지 않고, 객체지향적인 프로그래밍이 가능하다.
2. 데이터와 객체 간의 패러다임 불일치가 해결된다.
상속과 연관관계, 객체 그래프 탐색 및 비교의 패러다임 불일치를 해결한다.
Entity Manager Factory & Entity Manager
Entity
데이터베이스의 자료 한건을 구성하는 레코드
유, 무형의 서로 구별되는 객체
Entity Manager Factory
- Entity Manager를 생성
- 데이터베이스 당 한 개를 생성
- Thread-safe 하다.
Entity Manager
- Entity를 저장하는 메모리 상의 데이터베이스
- Entity의 조회, 저장, 수정, 삭제 관련 일
- 동시성 문제가 있기 때문에, Spring에서는 proxy로 감싸 Thread-safe를 보장한다.
PersistenceContext
- Entity를 영구히 저장하는 환경
- Entity Manager를 이용해 Entity를 보관하고 관리한다.
- Entity Manager 생성 시 같이 만들어짐
장점
- Entity의 동일성 보장
- 변경 감지
- 지연 로딩
- 1차 캐시 기능
- 쓰기 지연
지연 로딩과 즉시 로딩
즉시 로딩
특정 entity 조회 시 연관 entity를 같이 로딩하는 것
수많은 조인을 하므로 성능 저하를 일으킴
잘 사용하지 않는 편
N+1 문제를 일으킴
지연 로딩
연관 entity를 사용할 때가 돼서야 조회
훨씬 적은 로딩 시간과 적은 메모리 소비
N+1 문제
연관 관계가 설정된 entity를 조회할 때 조회된 데이터 개수만큼 연관 관계에 있는 데이터의 조회 쿼리가 추가로 실행된다. 이를 N+1 문제이며 주로 즉시 로딩 시에 문제를 일으킨다.
JPQL 입장에서 연관관계에 있는 데이터를 무시하고, Entity를 기준으로만 쿼리를 실행하기 때문에, FetchType으로 지정해줘야 한다.
해결 방안
Fetch Join으로 해결 가능하다.
반응형
'📗 JPA' 카테고리의 다른 글
MapStruct! JPA Entity 매핑 간 주의해서 사용하자 (0) | 2024.03.24 |
---|---|
JPA 집계함수 sum 은 long 을 반환한다. (0) | 2023.07.26 |
[Spring Data JPA] JPA Enum 필드에 관한 문제 (1) | 2023.02.21 |
[Spring Data JPA] 한방 쿼리의 효능 (feat : JPQL) (0) | 2023.02.01 |
[Spring Data JPA] Transaction 없이 읽기 (0) | 2023.01.30 |