JPA의 필요성
JPA는 언제 필요하고 언제 필요하지 않은지 설명해주실 수 있나요?
JPA 이전
반복적인 코드
현대 웹 애플리키이션에서는 대부분 관계형 데이터베이스(RDB)가 쓰인다.
그러다 보니 객체를 관계형 데이터베이스에서 관리하는 것이 무척 중요해졌다.
하지만 코드의 대부분이 어플리케이션 코드보다 SQL로 가득차게 됐다는 것이다.
이는 관계형 데이터베이스가 SQL만 인식할 수 있었기 때문이다. 그렇기 때문에 CRUD SQL을 매번 생성해야 했다.
이런 문제로 인해 자바 클래스는 아무리 잘 설계한다고 해도 결국은 SQL을 통해 저장, 조회가 가능했고 SQL들이 늘어났다.
패러다임 불일치 문제
객체와 관계형 DB의 차이가 생기는 것을 말한다. 관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임이 서로 다른데 객체를 데이터베이스에 저장하려고 할 때 발생한다. 만약 객체에서 필드 수정 시 SQL도 수정이 필요하다.
객체 | RDB | |
상속 | 상속 관계 O | 상속 관계 X 유사한 물리모델로, Table 슈퍼타입 서브타입 관계 존대 |
연관 관계 | 참조를 사용하여 연관관계 단방향으로만 관계 존재 |
외래키(FK)와 join쿼리를 통해 연관관계 |
이러한 문제들은 개발 생산성 저하, 복잡한 코드, 유지보수의 어려움 등의 문제가 발생한다.
그렇기 때문에 객체-관계 매핑을 자동화하고, 객체 지향 프로그래밍의 장점을 활용할 수 있는 ORM기술이 필요해졌고 JPA가 등장하게 된다.
ORM(Object-Relational Mapping)
ORM은 어플리케이션 Class와 관계형 데이터베이스의 테이블을 매핑(연결)한다는 의미이며, 기술적으로 어플리케이션의 객체를 관계형 데이터베이스 테이블에 자동으로 영속화(Persistence) 해주는 것이다.
JPA의 등장
- 자바 진영의 ORM 표준
- Java 애플리케이션과 JDBC API 사이에서 동작
- JPA는 ORM 기술 표준으로 인터페이스의 모음 구현체는 Hibernate, EclipseLinke, DataNucleus가 있음.
- 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임 워크 (실질적 구현X)
개발자가 객체를 데이터베이스에 영속화(저장)하고, 데이터베이스의 데이터를 객체로 변환하는 작업을 자동으로 처리하여 개발 생산성을 향상한다.
이는 객체 지향적인 방식으로 데이터베이스와 상호작용할 수 있도록 도와주는 기술이다.
JPA 사용 이유
- SQL 중심적인 개발에서 객체중심적인 개발이 가능해 생산성이 증가한다.
- DDL문 자동 생성
- 간단한 메서드로 CRUD가 가능해진다.
- SQL을 작성하고, JDBC API를 사용하는 반복적인 일을 대신 처리해준다.
- 유지보수성 향상
- 기존 : 필드 변경 시 모든 SQL 수정
- JPA : 필드만 추가하면 된다. SQL은 JPA가 처리한다.
- 엔티티(Entity)라는 개념을 통해 데이터베이스 스키마와 애플리케이션의 객체 모델을 연결
- Object와 RDB간의 패러다임 불일치 해결
- 객체 상속 시 SQL은 JPA가 알아서 처리하므로 고려하지 않아도 된다.
- 연관 관계 저장 가능 및 객체 그래프 탐색 지원
- 동일 트랜젝션에서 조회한 엔티티는 같음을 보장
- 성능 최적화
- 영속성 컨텍스트(Persistence Context)라는 메모리 내의 객체 저장소를 제공
- 1차 캐시와 동일성 보장
- 트렌젝션을 지원하는 쓰기 지연
- 지연 로딩, Lazy Loading
- 캐시, 배치 처리
JPA는 메서드를 통해 DB 조작이 가능하기 때문에, 객체 모델을 이용하여 비즈니스 로직을 구성하는데 집중 할 수 있으며 객체지향적인 코드 작성이 가능해지며 유지보수 및 리팩토링에 유리합니다.
하지만 프로젝트 규모가 크고 복잡해 설계가 잘못된 경우에는 속도 저하 및 일관성을 무너뜨리는 문제점이 발생하거나 복잡한 동적 Query문 같이 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 쓰는게 나은 상황이 생길 수 있습니다.