이 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 수강하며 정리한 글입니다.
🐰 SQL 중심적인 개발의 문제점
애플리케이션을 개발할 때 흔히 객체 지향 언어를 사용하나, 데이터베이스에서는 관계형 DB가 많이 사용된다.
- 객체를 관계형 DB를 통해 관리하면 SQL에 의존적인 상황이 발생한다. 만약에 기획이 달라져서 객체에 필드가 하나 추가된다면 모든 쿼리문을 수정해야 할 것이다.
- 객체지향과 관계형 DB는 패러다임이 불일치 하다.
- 객체의 상속 관계를 DB에 표현하려면 부모 테이블과 자식 테이블 사이의 조인 과정이 필요하다.
- 연관 관계를 객체에서는 참조로 표현하지만, 테이블에서는 외래키를 사용하여 조인을 해야 한다.
- 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다. 그러나 데이터베이스에 데이터를 조회할 때 처음 실행하는 SQL에 따라 탐색 범위가 결정되기 때문에 엔티티 신뢰 문제가 발생한다.
개발자가 객체와 DB 사이에서 많은 시간을 들여 SQL 매퍼 역할을 해야 한다는 것은 비효율적이고, SQL은 계층형 아키텍처의 진정한 계층 분할이 어렵다. 객체답게 모델링 할수록 매핑 작업만 늘어나게 된다고 할 수 있다. 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 있다면 어떨까?
🐰 Java Persistence API
자바 진영의 ORM(Object-relational mapping) 기술의 표준이다. ORM은 객체와 RDB 두 기둥 위에 있는 기술이다. JPA는 인터페이스 모음이라고 볼 수 있고, 구현체로 오픈 소스인 하이버네이트 등이 있다. 이를 사용하면 SQL 중심 개발에서 객체 중심으로 개발을 할 수 있다.
- 유지보수성이 좋아진다. 기존에는 필드를 변경하려면 개발자가 SQL 영역까지 다 변경해 주어야 했다.
- 패러다임 불일치가 해결된다. 상속, 연관 관계, 객체 그래프 탐색, 비교하기 → SQL 영역의 일을 JPA가 담당한다.
- 성능 최적화 기능이 제공된다.
- 생산성이 증가한다.
- 저장:
jpa.persist(member)
- 조회:
Member member = jpa.find(memberId)
- 수정:
member.setName("변경할 이름")
- 삭제:
jpa.remove(member)
- 저장:
- 1차 캐시 동일성 보장 - 같은 트랜잭션 안에서는 같은 엔티티를 반환하여 조회 성능이 향상된다. DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read를 보장한다.
- 트랜잭션을 지원하는 쓰기 지연 - 트랜잭션을 커밋 할 때까지 INSERT SQL을 모아 두고, JDBC BATCH SQL 기능을 사용해서 한번에 SQL을 전송한다. 네트워크 비용이 줄어든다.
- 지연 로딩과 즉시 로딩 - 객체가 실제 사용될 때 로딩되도록 하거나, JOIN SQL로 한번에 연관된 객체까지 미리 조회할 수 있다. 예를 들어서 Member 객체와 Team 객체가 함께 사용되는 빈도가 적으면 지연 로딩을 사용하고, 빈번하게 함께 사용되면 즉시 로딩되도록 하여 조인 쿼리가 작성되도록 한다.
'Back-End > JPA' 카테고리의 다른 글
[JPA] 엔티티 매핑 (0) | 2022.09.04 |
---|---|
[JPA] 영속성 관리 및 내부 동작 방식 (0) | 2022.09.04 |
Spring Data JPA (0) | 2022.09.01 |
[JPA] 엔티티 매핑과 연관 관계 매핑 : 단일 엔티티를 DB 테이블과 매핑하기 (0) | 2022.08.31 |
JPA 기반 데이터 액세스 계층 (0) | 2022.08.31 |
댓글