JPA란 무엇인가?
JPA(Java Persistence API)는 자바 애플리케이션과 데이터베이스 사이에서 동작하는 ORM(Object-Relational Mapping) 기술 표준이다.
쉽게 말해 "자바 객체를 DB 테이블에 대신 저장해주는 통역사"라고 생각하면 된다.
실제 코드 차이:
데이터를 저장(save)할 때, 개발자가 작성해야 할 코드는 이렇게 달라진다.
- 기존(JDBC/MyBatis): INSERT INTO MEMBER (ID, NAME) VALUES (...) (SQL 직접 작성)
- JPA: memberRepository.save(member) (메서드 호출 끝)

SQL Mapper vs JPA: 무엇이 다를까? (History)
▪️ 기존 방식: SQL Mapper (MyBatis, JDBC)
과거(JDBC, MyBatis)에는 개발자가 SQL을 직접 작성해서 DB를 다뤘다.
테이블을 만들고, 그에 맞는 객체를 만들고, 둘을 연결하는 SQL까지 다 개발자의 몫이었다.
이 방식은 세밀한 제어가 가능하지만, 치명적인 단점이 있다.
- 무한 반복(노가다): 테이블에 컬럼 하나가 추가되면? DTO 수정, INSERT 쿼리 수정, SELECT 쿼리 수정, UPDATE 쿼리 수정... 모든 코드를 다 고쳐야 한다.
- SQL 의존적: 자바 개발자인데 하루 종일 SQL만 짜고 있는 주객전도 현상이 발생한다.
▪️ 새로운 방식: JPA (ORM)
JPA는 "SQL은 내가 짤 테니, 너는 객체에만 집중해"라는 방식이다.
개발자가 자바 컬렉션(List)에 객체를 넣듯 저장하면, JPA가 적절한 SQL을 생성해서 DB에 날려준다.
- 객체 중심 개발: 테이블 스키마보다 비즈니스 로직(객체) 설계에 집중할 수 있다.
- 유지보수: 컬럼이 추가되어도 객체 필드만 한 줄 추가하면 끝이다. SQL은 JPA가 알아서 고쳐서 날려준다.


ORM과 패러다임의 불일치
JPA를 쓰는 진짜 이유는 단순히 코드가 짧아져서가 아니다. 객체와 RDB의 근본적인 차이를 해결해 주기 때문이다.
1. 객체 vs RDB
- 객체(Java): 추상화, 상속, 다형성, 참조(member.getTeam())를 사용한다.
- DB(RDB): 오직 데이터 위주의 테이블과 외래 키(TEAM_ID)만 존재한다.
이 둘은 서로 사는 세상이 다르다. 그래서 객체를 DB에 억지로 넣으려다 보면 코드가 복잡해지는데, 이를 '패러다임의 불일치'라고 한다.
2. JPA의 해결책
JPA는 이 불일치를 중간에서 해결해 준다.
- 상속: 객체의 상속 관계를 보고 알아서 JOIN 쿼리를 날려 데이터를 가져온다.
- 참조: member.getTeam()을 호출하면, 알아서 외래 키로 조인해서 팀 정보를 가져온다.

JPA 생태계 (JPA vs Hibernate vs Spring Data JPA)
가장 많이 헷갈리는 3가지 개념의 관계를 정리해보자.
1. JPA (인터페이스)
- 자바 진영의 표준 명세서(Interface)이다.
- "운전면허증"과 같다. 면허증만으로는 운전을 할 수 없다.
2. Hibernate (구현체)
- JPA 인터페이스를 실제로 구현한 라이브러리(엔진)이다.
- "실제 자동차"다. 우리가 운전하는 것은 면허증이 아니라 자동차다.
3. Spring Data JPA (모듈)
- 스프링에서 Hibernate를 쓰기 편하게 감싸놓은 껍데기다.
- Repository 인터페이스만 만들면 알아서 구현체를 만들어준다. ("자율주행 모드")


JPA는 언제 써야 할까? (장단점)
✅ JPA가 적합한 경우
- 생산성이 중요한 프로젝트 (CRUD 반복 노동 제거)
- 데이터 구조(컬럼 등)가 자주 변경되는 경우
- 복잡한 비즈니스 로직을 객체지향적으로 풀어야 할 때
❌ JPA가 부적합한 경우 (주의사항)
- 초기 학습 비용: 객체와 DB를 둘 다 깊게 알아야 해서 러닝 커브가 높다.
- 복잡한 통계 쿼리: 수백만 건의 데이터를 조인해서 통계를 낼 때는 SQL(MyBatis나 QueryDSL)이 더 효율적일 수 있다.
- N+1 문제: 잘못 사용하면 쿼리가 수십, 수백 번 나가는 성능 이슈가 발생할 수 있다.

'Archive > Java 풀스택 아카데미' 카테고리의 다른 글
| [TIL] 21. 12월 S3란? (1) | 2025.12.08 |
|---|---|
| [TIL] 20. 12월 Redis란? (0) | 2025.12.02 |
| [TIL] 18. 11월 JWT (0) | 2025.11.18 |
| [TIL] 17. 11월 Spring Security (0) | 2025.11.11 |
| [TIL] 16. 11월 Spring Framework(Controller) (0) | 2025.11.04 |