Spring

JPA가 나오게 된 배경

qwertyv 2024. 1. 7. 14:04

SQL 중심 개발 문제점

지금 시대는 객체를 관계형 데이터베이스에 저장함

그러려면 수많은 SQL를 사용해야함

무한 반복, 지루한 코드가 된다 (ex: crud)

sql에 의존적인 개발이 됨

 

객체 vs 관계형 데이터 베이스 (서로 매칭이 잘 안됨)

객체를 rdb에 저장해도 되고 nosql에 저장해도 된다 

다양한 저장소가 있지만 현실적인 대안은 관계형 데이터베이스

객체를 sql로 변환하는 작업(sql 매퍼)은 개발자가 하게 된다 

 

1. 상속

db에 상속관계를 저장할 수 없다 (슈퍼타입 서브타입 관계로 대안)

존나 복잡해짐 이걸 개발자가 해야함

근데 그냥 자바 컬렉션에 저장하면? 그냥 하면됨

 

2. 연관관계

객체는 참조를 사용 (member.getTeam()), 테이블은 외래 키를 사용 (join on m.tead_id = t.team_id)

보통 객체를 테이블에 맞추어 모델링하게됨

사실 객체다운 모델링이려면 참조로 team을 가져와야함 

그렇게 되면 데이터베이스에 insert할 때는 까다로워짐

근데 그냥 자바 컬렉션에서 관리하면? 쉬워짐

 

객체는 자유롭게 객체 그래프를 탐색할 수 있어야함

데이터베이스에 객체를 보관하다보면 처음 실행하는 sql에 따라 탐색 범위가 결정됨

 

엔티티 신뢰 문제가 생김

모든 객체를 미리 로딩할 수는 없음

결국 진정한 의미의 계층 분할이 어려움

 

3. 비교하기

객체를 비교할 때도 문제가생김

ID로 객체를 가져올 때 sql로 가져오면 결국 객체를 생성해서 반환하기 때문에 데이터 값을 같을지라도 인스턴스는 다르다

근데 그냥 자바 컬렉션에서 조회한다면? 같은 인스턴스를 가져오게됨


결국 객체답게 모델링할수록 매핑 작업(sql 변환 노가다)만 늘어난다

그렇다면 객체를 자바 컬렉션에 저장하듯이 db에 저장할 수는 없을까?

그것을 해결하기 위해 나온 것이 JPA(Java Persistence API) !!!!