JPA 소개

숭맹이·2025년 4월 21일

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

JPA란 무엇인가?

  • Java Persistence API의 약자
  • 자바 ORM 기술 표준
  • 객체와 관계형 데이터베이스(RDB) 사이를 매핑
  • 애플리케이션과 JDBC API 사이에서 동작

핵심: SQL 중심 개발이 아닌, 객체 중심 개발이 가능하도록 지원합니다.


JPA의 배경과 탄생 스토리

과거 자바 진영에서는 EJB(Entity Bean)라는 무거운 ORM 기술을 사용했지만, 너무 복잡하고 성능이 좋지 않아 대중화되지 못했습니다.

이때 등장한 것이 오픈소스 ORM 프레임워크 Hibernate입니다. Gavin King이라는 개발자가 "차라리 내가 만들겠다"는 심정으로 개발했고, 엄청난 인기를 끌었습니다.

결국 Java 진영은 Hibernate를 개발한 Gavin King을 영입하여, Hibernate 기반으로 새로운 표준 ORM 명세를 만들었는데, 그 결과가 바로 JPA입니다.

- 즉, JPA는 실용성 있는 오픈소스 기반 위에 만들어진 자바 표준 ORM입니다.


JPA와 ORM 개념 정리

ORM(Object-Relational Mapping)란?

  • 객체(Object)와 관계형 데이터베이스(Relational Database) 간의 매핑
  • 각각의 설계 방식을 유지하면서 중간 매핑을 ORM이 담당

JPA는 어떻게 동작하는가?

  • 저장: jpa.persist(member) ➔ 객체 저장 ➔ INSERT SQL 자동 생성 및 실행
  • 조회: jpa.find(Member.class, id) ➔ 객체 조회 ➔ SELECT SQL 자동 생성 및 실행

개발자는 SQL을 직접 작성하지 않고, 마치 컬렉션에 저장하듯이 객체를 다루기만 하면 됩니다.


JPA = 인터페이스, Hibernate = 구현체

JPA는 인터페이스의 집합입니다. 직접 동작하지 않고, 이를 구현한 구현체가 필요합니다.

대표 구현체:

  • Hibernate (가장 많이 사용, 사실상 표준)
  • EclipseLink
  • DataNucleus

실무에서는 Hibernate를 거의 표준처럼 사용합니다.


JPA 주요 버전 역사

버전특징
JPA 1.0 (2006)초창기, 기능 부족
JPA 2.0 (2009)대부분 ORM 기능 포함, Criteria API 추가
JPA 2.1 (2013)Stored Procedure, Converter, Entity Graph 지원

Note: JPA 2.0 이후로 큰 틀은 변하지 않았기 때문에, 지금 배우면 장기적으로 유효합니다.


JPA를 써야 하는 이유

1. 생산성

  • 저장: jpa.persist(member)
  • 조회: jpa.find(Member.class, id)
  • 수정: 객체 필드 수정만 하면 됨
  • 삭제: jpa.remove(member)

SQL 작성 없이 CRUD 가능 ➔ 개발 속도 상승

2. 유지보수성

  • 필드 추가 시 SQL 수정 필요 없음
  • JPA가 SQL 생성/수정 자동 처리

3. 패러다임 불일치 해결

  • 상속 매핑 지원
  • 연관관계 매핑 지원
  • 객체 그래프 탐색 지원

4. 성능 최적화 기능 제공

  • 1차 캐시
  • 트랜잭션을 지원하는 쓰기 지연
  • 지연 로딩(Lazy Loading)
  • 즉시 로딩(Eager Loading)

5. 데이터 접근 추상화

  • DBMS 종류 변경시 영향 최소화 (ex. Oracle ➔ MySQL)

6. 표준 기반 ➔ 미래 지향적

  • 특정 벤더 종속 최소화

JPA 성능 최적화 핵심 기능

1. 1차 캐시와 동일성 보장

  • 같은 트랜잭션 내 동일 엔티티 == 동일 인스턴스
  • SQL을 한번만 실행 ➔ 조회 성능 최적화
Member m1 = jpa.find(Member.class, "100"); // SQL 발생
Member m2 = jpa.find(Member.class, "100"); // 캐시에서 조회
System.out.println(m1 == m2); // true

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

  • 트랜잭션 커밋 시점에 INSERT/UPDATE SQL 일괄 처리
  • 네트워크 비용 절감

3. 지연 로딩 (Lazy Loading)

  • 실제 사용할 때 DB 조회 쿼리 실행

4. 즉시 로딩 (Eager Loading)

  • 조회 시 연관된 객체까지 JOIN하여 가져옴
profile
👨🏻‍💻 Backend Developer

0개의 댓글