본문 바로가기
Archive/Java 풀스택 아카데미

[TIL] 19. 11월 JPA란

by Lseing 2025. 11. 25.

JPA

JPA란 무엇인가?

JPA(Java Persistence API)는 자바 애플리케이션과 데이터베이스 사이에서 동작하는 ORM(Object-Relational Mapping) 기술 표준이다.

쉽게 말해 "자바 객체를 DB 테이블에 대신 저장해주는 통역사"라고 생각하면 된다.

실제 코드 차이:

데이터를 저장(save)할 때, 개발자가 작성해야 할 코드는 이렇게 달라진다.

  • 기존(JDBC/MyBatis): INSERT INTO MEMBER (ID, NAME) VALUES (...) (SQL 직접 작성)
  • JPA: memberRepository.save(member) (메서드 호출 끝)

ORM의 작동 원리 (통역사 역할)


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가 알아서 고쳐서 날려준다.

데이터 접근기술 타임라인

 

JDBC vs MyBatis vs JPA 코드 복잡도 비교


ORM과 패러다임의 불일치

JPA를 쓰는 진짜 이유는 단순히 코드가 짧아져서가 아니다. 객체와 RDB의 근본적인 차이를 해결해 주기 때문이다.

1. 객체 vs RDB

  • 객체(Java): 추상화, 상속, 다형성, 참조(member.getTeam())를 사용한다.
  • DB(RDB): 오직 데이터 위주의 테이블과 외래 키(TEAM_ID)만 존재한다.

이 둘은 서로 사는 세상이 다르다. 그래서 객체를 DB에 억지로 넣으려다 보면 코드가 복잡해지는데, 이를 '패러다임의 불일치'라고 한다.

2. JPA의 해결책

JPA는 이 불일치를 중간에서 해결해 준다.

  • 상속: 객체의 상속 관계를 보고 알아서 JOIN 쿼리를 날려 데이터를 가져온다.
  • 참조: member.getTeam()을 호출하면, 알아서 외래 키로 조인해서 팀 정보를 가져온다.

패러다임 불일치 해결 (상속 vs 조인)


JPA 생태계 (JPA vs Hibernate vs Spring Data JPA)

가장 많이 헷갈리는 3가지 개념의 관계를 정리해보자.

1. JPA (인터페이스)

  • 자바 진영의 표준 명세서(Interface)이다.
  • "운전면허증"과 같다. 면허증만으로는 운전을 할 수 없다.

2. Hibernate (구현체)

  • JPA 인터페이스를 실제로 구현한 라이브러리(엔진)이다.
  • "실제 자동차"다. 우리가 운전하는 것은 면허증이 아니라 자동차다.

3. Spring Data JPA (모듈)

  • 스프링에서 Hibernate를 쓰기 편하게 감싸놓은 껍데기다.
  • Repository 인터페이스만 만들면 알아서 구현체를 만들어준다. ("자율주행 모드")

JPA 생태계 포함 관계
Spring Data JPA의 내부 호출 구조

 


JPA는 언제 써야 할까? (장단점)

✅ JPA가 적합한 경우

  • 생산성이 중요한 프로젝트 (CRUD 반복 노동 제거)
  • 데이터 구조(컬럼 등)가 자주 변경되는 경우
  • 복잡한 비즈니스 로직을 객체지향적으로 풀어야 할 때

❌ JPA가 부적합한 경우 (주의사항)

  • 초기 학습 비용: 객체와 DB를 둘 다 깊게 알아야 해서 러닝 커브가 높다.
  • 복잡한 통계 쿼리: 수백만 건의 데이터를 조인해서 통계를 낼 때는 SQL(MyBatis나 QueryDSL)이 더 효율적일 수 있다.
  • N+1 문제: 잘못 사용하면 쿼리가 수십, 수백 번 나가는 성능 이슈가 발생할 수 있다.

JPA 장단점 밸런스 차트

 

'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