Appearance
JPA
Java Persistence API
JPA는 자바 진영의 ORM 표준 명세다.
즉, JPA 자체가 구현체는 아니고, Hibernate, EclipseLink 같은 구현체가 실제 동작을 담당한다.
Spring Boot에서 spring-boot-starter-data-jpa를 사용하면 보통 Hibernate와 Spring Data JPA를 함께 쓰게 된다.
ORM(Object Relational Mapping)
ORM은 객체와 관계형 데이터베이스 테이블을 매핑하는 방식이다.
개발자는 엔티티 객체 중심으로 코드를 작성하고, ORM 구현체가 SQL 생성과 매핑을 도와준다.
다만 "ORM을 쓰면 SQL을 몰라도 된다"는 뜻은 아니다.
실무에서는 아래를 계속 이해해야 한다.
- SQL 실행 방식
- 조인
- 인덱스
- 트랜잭션
- 지연 로딩/즉시 로딩
- N+1 문제
장점
1. 생산성
반복적인 CRUD 코드를 줄일 수 있다.
2. 객체 중심 모델링
테이블 구조만 보는 대신 도메인 객체와 연관관계를 코드로 표현하기 좋다.
3. 변경 추적
영속성 컨텍스트가 관리하는 엔티티는 상태 변경을 감지해서 flush 시점에 반영할 수 있다.
4. 이식성
표준인 JPA 인터페이스를 기준으로 구현하면 특정 구현체 의존을 줄이기 쉽다.
주의할 점
1. JPA가 자동으로 성능을 높여주지는 않는다
1차 캐시, 지연 로딩 같은 기능이 있지만, 잘못 쓰면 오히려 비효율적인 SQL이 많이 발생할 수 있다.
즉, "JPA = 성능 향상"으로 단정하면 틀리다.
2. 복잡한 조회는 별도 전략이 필요할 수 있다
복잡한 통계, 대량 집계, DB 벤더 특화 기능은 JPQL, Querydsl, native query, MyBatis 등을 함께 쓰는 경우가 많다.
3. 엔티티와 API DTO를 그대로 동일시하면 안 된다
엔티티는 영속성 모델이고, API 응답 모델은 별도 DTO로 분리하는 것이 일반적이다.
정리
- JPA는 자바 ORM 표준 명세다.
- Hibernate는 대표 구현체다.
- 생산성을 높여주지만, SQL과 데이터 접근 전략에 대한 이해는 여전히 중요하다.