
ORM의 탄생
요즘은 대부분의 서비스를 개발할 때 데이터를 저장하고 빠르게 읽어오기 위해 데이터베이스를 사용하는데 사용되는 데이터베이스의 대부분은 RDB(관계형 데이터베이스)이다.
객체를 관계형 데이터 베이스에 빠르게 저장하는 방법이 없을까 하는 개발자들의 고민의 ORM의 시작이었다.
ORM
Object-relational mapping
객체 지항 프로그래밍 언어에서 사용되는 객체를 데이터베이스 테이블과 자동으로 Mapping 해주느 기술이다.
JPA
자바에서 ORM을 사용할 수 있도록 표준화된 인터페이스이다.
Hibernate
JPA가 인터페이스라면 Hibernate는 그걸 구현한 클래스이다.
가장 널리 쓰이는 JPA 구현체이다.
대충 이런 느낌
ORM: 개념
└─ JPA: Java 진영의 ORM 표준 인터페이스
└─ Hibernate: JPA의 구현체
JPA의 장점과 단점
장점
- 생산성 향상
SQL을 직접 작성하지 않고도 CRUD 작업이 가능하여 반복적인 코드 작성이 줄어든다. - 유지보수 용이
도메인 중심의 코드 작성이 가능하고, 비즈니스 로직과 데이터 접근 코드가 분리되어 구조가 명확해진다. - 데이터베이스 독립성
JPQL(Java Persistence Query Language)을 사용하면 특정 DB에 종속되지 않아 다양한 DB로의 전환이 용이하다. - 1차 캐시 지원
EntityManager는 트랜잭션 범위 내에서 동일한 엔티티에 대해 중복 쿼리를 방지할 수 있다. - 지연 로딩(Lazy Loading)
연관된 엔티티를 실제로 사용할 때 로딩하여 성능 최적화에 도움이 된다. - 변경 감지(Dirty Checking)
엔티티의 상태가 변경되면 자동으로 업데이트 쿼리가 반영되어 코드가 간결해진다. - 트랜잭션 관리
트랜잭션 처리를 선언적으로 설정할 수 있어 안정적인 데이터 처리에 유리하다.
단점
- 복잡한 쿼리 작성의 한계
복잡한 통계, 다중 조인, 서브쿼리 등은 JPQL이나 Criteria API로 작성하기 어렵고 가독성도 떨어진다. - N+1 문제
연관된 엔티티가 많은 경우 잘못된 설정으로 인해 불필요한 쿼리가 여러 번 발생할 수 있다. - 학습 곡선
영속성 컨텍스트, 엔티티 생명주기, Fetch 전략 등 이해해야 할 개념이 많다. - 디버깅 어려움
내부에서 SQL이 자동 생성되기 때문에 디버깅과 성능 튜닝이 쉽지 않다. - 직접적인 SQL 제어 어려움
SQL 최적화가 필요한 경우 Native Query를 사용해야 하며, 이는 JPA의 장점을 일부 상쇄할 수 있다.
백문이 불여일견 일단 코드를 까보자

JpaRepository의 코드이다.
보이듯이 각종 ORM 함수들이 정의돼있는 것을 볼 수 있다.
부모 인터페이스들도 타고 들어가보면 다 이런식으로 ORM 함수들이 정의돼있다.
실제 구현체인 Hibernate는 까봤다가 심연을 봤다..

여러 구현체 파일 중 하나인데 2343줄,,
새삼 선배 개발자분들의 대단함을 느낀다.
나도 언젠간 이런 거대한 흐름에 기여할수 있기를!
'개발 지식 > Spring' 카테고리의 다른 글
| JWT 인증의 보안 고도화 전략 – 단순 토큰에서 실전 대응까지 (1) | 2025.05.20 |
|---|---|
| Spring Boot SSR 환경에서 JWT 사용의 적절성에 대한 고찰 (1) | 2025.04.24 |
| Spring Boot로 로그인을 구현해보기 1 (0) | 2025.04.16 |
| 스프링 annotation, 의존성 정리 (1) | 2025.04.12 |
| [Spring] MVC와 REST API 차이 (0) | 2025.04.05 |