JPA란 무엇인가
JPA(Java Persistence API)는 javax.persistence
패키지에 정의되어 있는 자바 진영의 ORM 기술 표준이다. ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매팡한다는 것인데, 쉽게 말하면 객체를 데이터베이스에 저장할 때 마치 자바 컬렉션에 저장하듯이 SQL문을 직접 작성하지 않고도 프로그래밍할 수 있도록 도와주는 기술이다.
JPA는 자바 ORM 기술에 대한 API 표준 명세, 즉 인터페이스의 집합이다. 따라서 JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 사용해야한다. 대표적으로 하이버네이트, EclipseLink, DataNucleus 등이 있다.
왜 JPA를 사용해야 하는가
SQL 중심 개발의 문제점
현대의 애플리케이션은 대부분 객체지향 언어로 개발한다. 근데 데이터베이스는 관계형 데이터베이스가 주류를 이루고 있다. 이 둘을 사용해서 프로그램을 개발하려면 결국 개발자가 중간에서 객체를 테이블로 변환하는 작업을 해주어야한다. 또 DB의 데이터를 가져다 쓰려면 이를 다시 객체로 변환해서 사용해야한다. 문제는 이 작업이 생산성과는 관계없는 지루하고 반복적인 작업이라는 것이다.
- CRUD 무한 반복
- 자바 객체 -> SQL, SQL -> 자바 객체
- 객체에 필드 추가 -> 쿼리문 수정
- 개발자가 객체와 SQL 사이에서 변환 작업을 계속 해주어야함 -> 너무나 반복적인 작업
또 객체와 RDB는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다. 이를 패러다임 불일치 문제라고 한다.
- 패러다임의 불일치
- 상속: 객체는 상속관계가 있지만, RDBMS는 슈퍼타입-서브타입을 사용한다. 상속 관계의 객체를 DB에 저장하려면 INSERT 문을 두 번 작성해야한다.
- 연관관계: 객체는 참조로, RDBMS는 외래키로 연관관계를 표현한다. 객체는 참조가 있는 방향으로만 조회가 가능하지만, RDBMS는 외래키를 통해 양방향 조회 가 가능하다.
- 객체 그래프 탐색: 객체는 객체 그래프를 자유롭게 탐색 가능하다. 그러나 RDBMS는 처음 실행하는 SQL에 따라 탐색 범위가 결정된다.
- 비교: 객체는 동일성(identity) 비교와 동등성(equality) 비교를 사용한다. RDBMS는 기본 키를 통한 ROW 구분으로 비교한다.
객체를 마치 자바 컬렉션에 저장하듯이 DB에 저장할 수 없을까? 하는 고민에서 탄생한 것이 바로 JPA이다.
JPA를 사용하면…
JPA는 자바 객체를 RDB에 저장하기 위한 SQL 매핑과 패러다임 불일치 문제를 모두 해결해준다!
즉 JPA를 사용하면 다음과 같은 장점이 있다.
- SQL 중심적 개발을 벗어나 객체 중심 개발을 할 수 있다.
- 반복적인 쿼리문 작성에서 벗어나 생산성을 높일 수 있다.
- 객체지향적 코드로 유지보수하기가 더 편해진다.
- RDBMS와 객체지향의 패러다임 불일치 해결
- 상속
- 연관관계
- 객체 그래프 탐색
- 비교 - 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
- 성능상의 이점
- 1차 캐시와 동일성 보장
- transactional write-behind
- Lazy Loading
- 데이터 접근 추상화와 벤더 독립성 - 사용하는 DB 제품을 바꿔도 코드를 수정할 일이 없다.
- Java 진영의 ORM 표준
'웹 개발 > JPA' 카테고리의 다른 글
deleteAllByIdInBatch는 영속성 컨텍스트를 동기화하지 않는다 (feat.문서를 잘 읽자…) (0) | 2022.07.18 |
---|
댓글