본문 바로가기
📗 JPA

JPA 개념 정리

by GroovyArea 2022. 7. 15.
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으로 해결 가능하다.

반응형