
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줄,,
새삼 선배 개발자분들의 대단함을 느낀다.
나도 언젠간 이런 거대한 흐름에 기여할수 있기를!