본문 바로가기
개발 지식/Spring

스프링의 ORM 표준과 JPA

by 김이월 2025. 4. 5.

 

ORM의 탄생

요즘은 대부분의 서비스를 개발할 때 데이터를 저장하고 빠르게 읽어오기 위해 데이터베이스를 사용하는데 사용되는 데이터베이스의 대부분은 RDB(관계형 데이터베이스)이다.

객체를 관계형 데이터 베이스에 빠르게 저장하는 방법이 없을까 하는 개발자들의 고민의 ORM의 시작이었다.

ORM

Object-relational mapping

객체 지항 프로그래밍 언어에서 사용되는 객체를 데이터베이스 테이블과 자동으로 Mapping 해주느 기술이다.

JPA

자바에서 ORM을 사용할 수 있도록 표준화된 인터페이스이다.

Hibernate

JPA가 인터페이스라면 Hibernate는 그걸 구현한 클래스이다.

가장 널리 쓰이는 JPA 구현체이다.

 

대충 이런 느낌

ORM: 개념
  └─ JPA: Java 진영의 ORM 표준 인터페이스
        └─ Hibernate: JPA의 구현체

 

JPA의 장점과 단점

장점

  1. 생산성 향상
    SQL을 직접 작성하지 않고도 CRUD 작업이 가능하여 반복적인 코드 작성이 줄어든다.
  2. 유지보수 용이
    도메인 중심의 코드 작성이 가능하고, 비즈니스 로직과 데이터 접근 코드가 분리되어 구조가 명확해진다.
  3. 데이터베이스 독립성
    JPQL(Java Persistence Query Language)을 사용하면 특정 DB에 종속되지 않아 다양한 DB로의 전환이 용이하다.
  4. 1차 캐시 지원
    EntityManager는 트랜잭션 범위 내에서 동일한 엔티티에 대해 중복 쿼리를 방지할 수 있다.
  5. 지연 로딩(Lazy Loading)
    연관된 엔티티를 실제로 사용할 때 로딩하여 성능 최적화에 도움이 된다.
  6. 변경 감지(Dirty Checking)
    엔티티의 상태가 변경되면 자동으로 업데이트 쿼리가 반영되어 코드가 간결해진다.
  7. 트랜잭션 관리
    트랜잭션 처리를 선언적으로 설정할 수 있어 안정적인 데이터 처리에 유리하다.

단점

  1. 복잡한 쿼리 작성의 한계
    복잡한 통계, 다중 조인, 서브쿼리 등은 JPQL이나 Criteria API로 작성하기 어렵고 가독성도 떨어진다.
  2. N+1 문제
    연관된 엔티티가 많은 경우 잘못된 설정으로 인해 불필요한 쿼리가 여러 번 발생할 수 있다.
  3. 학습 곡선
    영속성 컨텍스트, 엔티티 생명주기, Fetch 전략 등 이해해야 할 개념이 많다.
  4. 디버깅 어려움
    내부에서 SQL이 자동 생성되기 때문에 디버깅과 성능 튜닝이 쉽지 않다.
  5. 직접적인 SQL 제어 어려움
    SQL 최적화가 필요한 경우 Native Query를 사용해야 하며, 이는 JPA의 장점을 일부 상쇄할 수 있다.

 

백문이 불여일견 일단 코드를 까보자

JpaRepository의 코드이다.

보이듯이 각종 ORM 함수들이 정의돼있는 것을 볼 수 있다.

부모 인터페이스들도 타고 들어가보면 다 이런식으로 ORM 함수들이 정의돼있다.

 

실제 구현체인 Hibernate는 까봤다가 심연을 봤다..

 

여러 구현체 파일 중 하나인데 2343줄,,

새삼 선배 개발자분들의 대단함을 느낀다.

나도 언젠간 이런 거대한 흐름에 기여할수 있기를!