SQL 중심적인 개발의 문제점

숭맹이·2025년 4월 21일
0

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 정리

SQL 중심 개발의 한계

1. 반복적이고 지루한 CRUD

애플리케이션은 객체지향 언어(Java, Kotlin 등)로 개발하지만, 데이터 저장은 관계형 DB에 SQL로 합니다. 회원 하나 등록할 때마다 INSERT, 조회할 때마다 SELECT, 수정할 때마다 UPDATE... 무한 반복입니다.

INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES (?, ?);
SELECT MEMBER_ID, NAME FROM MEMBER WHERE MEMBER_ID = ?;
UPDATE MEMBER SET NAME = ? WHERE MEMBER_ID = ?;

2. 객체-관계형 데이터베이스 패러다임 불일치

  • 객체는 상속, 캡슐화, 다형성 등 복잡한 구조를 가진다.
  • DB는 단순한 테이블 구조, 외래 키로 연관관계를 맺는다.

객체는 참조로 관계를 맺지만, DB는 외래키로 연결합니다.

3. 모델링의 한계

객체지향적으로 설계할수록 SQL 매핑이 기하급수적으로 늘어납니다.

  • 상속 구조 저장 시 테이블 분리 + 조인 필요
  • 연관관계 설정 시 외래키 관리 필요
  • 객체 그래프 탐색(member -> order -> orderItem) 복잡
  • 동일 ID 객체 비교 시 참조 다름 (== 실패)

현실적인 고민

객체답게 모델링할수록 맵핑 작업만 증가하고,
결국 SQL 중심 개발으로 회귀하는 악순환.

"DB에 객체를 자바 컬렉션처럼 쉽게 저장할 수는 없을까?"

이런 고민 끝에 나온 것이 바로 JPA입니다.


JPA가 해결하는 것

1. 객체-DB 매핑 자동화

  • 엔티티 객체를 만들고, JPA가 자동으로 SQL 생성 & 실행
  • @Entity, @Id, @OneToMany 같은 어노테이션으로 매핑 설정

2. 연관관계 관리

  • 객체 레퍼런스(참조) 기반으로 연관관계 관리 가능
  • 필요한 시점에 필요한 데이터만 조회 (지연 로딩, 즉시 로딩)

3. 1차 캐시와 동일성 보장

  • 같은 트랜잭션 내 동일 ID 조회 시 같은 객체 반환 (== 비교 가능)

4. 객체 그래프 탐색 가능

Member member = memberRepository.findById(1L);
Team team = member.getTeam();
List<Order> orders = member.getOrders();

객체 그래프를 자연스럽게 탐색할 수 있습니다.

profile
👨🏻‍💻 Backend Developer

0개의 댓글