본문 바로가기

자바 ORM 표준 JPA 프로그래밍

JPA 기초(2) - JPA란?

1) JPA란?

- JPA는 Java Persistence API의 줄임말로, 자바 진영의 ORM 표준입니다.

  ORM이란 Object-Relational Mapping의 줄임말로, 

  객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하면,

  ORM 프레임웤이 중간에서 매핑해줍니다. 

  대중적인 언어에는 대부분 ORM기술이 존재합니다. 

 

- JPA는 애플리케이션과 JDBC 사이에서 동작합니다. 

  Java 애플리케이션이 JPA에 명령을 하면, JPA가 JDBC API를 활용해서 SQL을 호출하고,

  그 결과를 받아서 동작합니다.  

 

- 예를 들어, MemberDAO에서 객체를 저장하고 싶다면,   

  과거에는 JDBC API, JDBC Template, Mybatis 등을 썼다면,

  JPA를 쓰게 되면 JPA에게 멤버 객체를 넘기면, JPA가 멤버 객체를 분석합니다. 

  그 다음 JPA가 INSERT 쿼리를 생성해서 JDBC API를 통해 DB에 보냅니다. 

  여기서 중요한 건 JPA가 쿼리를 직접 만들어준다는 것입니다. 

  그리고 이 과정에서 '패러다임의 불일치'를 해결해줍니다. 

 

2) JPA는 표준 명세

- JPA는 인터페이스의 모음입니다. JPA 스펙을 구현한 구현체가 여러가지가 있는데,

  그 중에 대표적인 것이 Hibernate입니다. 

 

3) JPA를 왜 사용해야 하는가?

- JPA를 사용해야 하는 이유에는 다음과 같은 것들이 있습니다.

   (1) SQL 중심적인 개발에서 객체 중심적인 개발

   (2) 생산성

   (3) 유지 보수

   (4) 패러다임의 불일치 해결

   (5) 성능

   (6) 데이터 접근 추상화와 벤더 독립성

   (7) 표준

   이 중 몇 가지만 좀 더 깊이 있게 살펴보겠습니다.

 

(1) 생산성

- JPA의 CRUD는 메소드가 이미 다 만들어져 있습니다. 

(2) 유지보수

- 기존에는 필드를 변경하면 모든 SQL을 수정해야 했습니다. 

- 이 때, JPA를 사용하면 필드만 추가하면, SQL은 JPA가 처리해줍니다. 

 

(3) 패러다임의 불일치 해결

- 객체지향에는 상속이 존재하지만, RDB에는 상속이 존재하지 않습니다. 

 

- 이 때, 개발자가 JPA를 사용하면, 나머지는 JPA가 처리해줍니다.  

- 마찬가지로, JPA는 연관관계와 객체 그래프 탐색과 관련한 문제도 해결해줍니다. 

  JPA는 객체 그래프를 자유롭게 탐색할 수 있는데, 이는 지연 로딩(lazy loading)이라는 기능과 연관이 있습니다. 

 

4) JPA로 비교하기

- JPA는 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장합니다. 

 

5) JPA의 성능 최적화 기능

- 계층과 계층 사이에 중간 계층이 있으면, 항상 버퍼(buffer)와 캐시(cache)를 사용할 수 있습니다. 

  JPA의 성능 최적화 기능은 대표적으로 3가지가 있습니다.

  (1) 1차 캐시와 동일성(identity) 보장

  (2) 트랜잭션을 지원하는 쓰기 지연(Transactional Write behind)

  (3) 지연 로딩(Lazy Loading)

 

(1) 1차 캐시와 동일성 보장

- JPA에서는 같은 트랜잭션에서는 같은 엔티티를 반환하는데, 이것은 약간의 조회 성능 향상으로 이어집니다.

  또한, DB Isolation level이 Read Commit이어도, 애플리케이션에서 Repeatable Read를 보장합니다. 

(2) 트랜잭션을 지원하는 쓰기 지연

- JPA는 트랜잭션을 커밋할 때까지 INSERT SQL을 모으고,

  JDBC BATCH SQL기능을 사용하여 한 번에 SQL을 전송합니다. 

(3) 지연 로딩

- 지연 로딩은 연관된 객체를 실제로 사용할 때 로딩하는 것을 의미합니다. 

  반면, 즉시 로딩은 JOIN SQL로 한 번에 연관된 객체까지 미리 조회하는 것을 의미합니다. 

 

참고

김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편