JPA 무엇인가? Java Persistence API는 자바 ORM 기술 표준입니다. JPA는 자바 애플리케이션과 JDBC 사이에서 동작합니다.
ORM은 무엇인가? Object Relational Mapping 객체와 관계형 데이터베이스를 매핑해주는 의미입니다.
ORM 프레임워크는 객체와 테이블을 매핑합니다. 그리고 이것이 패러다임 불일치를 해결해주는 역할 맡고 있습니다. ORM 프레임워크를 사용하면 객체를 데이터베이스에 저장한다면 INSERT SQL을 개발자가 작성하지 않고도 자바 컬렉션에 저장하는 것처럼 ORM 프레임워크에 저장하면 됩니다.
JPA INSERT 흐름
DAO > Persist (Entity Object) > JPA (JDBC API) > INSERT SQL > DB
JPA SELECT 흐름
DAO > find(id) > JPA (JDBC API) > SQL > DB > RESPONSE
생산성
JPA 사용하면 자바 컬렉션에 객체를 저장하는 것처럼 JPA에게 객체를 전달하면 됩니다. INSERT SQL을 작성하고 JDBC API를 사용하는 소스코드를 작성하기 위한 개발자의 고생이 필요하지 않습니다.
jpa.persist(member);
jpa.find(memberId);
JPA로 간단하게 처리할 수 있어 기능을 개발할 때 데이터베이스를 중심으로 설계하는 것이 아닌 객체 설계 중심으로 진행할 수 있습니다.
유지보수
SQL을 직접 작성한다면 객체의 필드 하나만 추가되어도 수정해야할 SQL문은 조회, 저장, 수정 등 상당할 것입니다. 하지만 JPA를 사용하면 객체만 전달해주면 앞서 말한 일련의 과정을 JPA가 대신 처리해주기 때문에 개발자가 필드를 추가, 수정할 유지보수 업무가 발생하지 않습니다.
패러다임 불일치
JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임 불일치 문제들을 해결합니다.
성능
애플리케이션과 데이터베이스 사이에서 JPA는 성능 최적화를 제공합니다. JPA는 애플리케이션과 데이터베이스 사이에서 동작합니다. 그리고 이 사이에 계층이 하나 더 있으면 최적화 관점에서 할 수 있는 것들이 많아집니다.
Member member1 = jpa.find(memberId)
Member member2 = jpa.find(memberId)
Member member3 = jpa.find(memberId)
하나의 트랜잭션에서 동일한 회원을 세 번 조회하는 코드가 있습니다. 개발자가 조회 SQL 코드를 직접 작성했다면 회원을 조회할 때마다 SELECT SQL을 사용해서 데이터베이스와 세 번 통신을 하게 됩니다.
반면, JPA를 이용한다면 SELECT SQL을 한 번만 데이터베이스에 전달하고 두 번째는 조회된 회원 객체를 재사용 합니다. 이것이 가능한 이유는 객체의 주소값이 동일성이 일치하므로 한 번의 조회로 해당 주소값을 재사용할 수 있습니다.
데이터 접근 추상화와 벤더 독립성
관계형 데이터베이스는 벤더사 마다 사용방법이 다를 때가 있습니다. 예를 들어 페이징 처리는 데이터베이스 마다 사용하는 방법이 다르기 때문에 매번 사용 방법을 배워야만 합니다. 결국 이러한 점들로 한번 선택한 데이버테이스 기술에 종속되는 현상이 발생하게 됩니다. 하지만 JPA를 사용하면 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공하여 특정 기술에 종속되지 않고도 유연하게 다양한 데이터베이스나 기술을 사용할 수 있습니다.
JPA에 사용하는 데이터베이스만 알려준다면 선택한 데이터베이스에 맞게 코드의 변경 없이 이용할 수 있습니다.
MySQLDialect, OracleDialect, H2Dialect ...
표준
JPA는 자바 ORM 기술 표준이므로 다른 구현 기술로 변경하는데도 용이합니다.
JPA 영속성 관리 (컨텍스트와 생명주기) (0) | 2024.01.02 |
---|---|
JPA 엔티티 CRUD(조회 등록 수정 삭제) (1) | 2024.01.01 |
JPA 패러다임 불일치 문제해결 (지연로딩) (0) | 2023.12.29 |
[JUnit5] 모듈 구조 - Platform, Jupiter, Vintage (0) | 2021.08.02 |
[Stream] collect method (0) | 2020.08.04 |
댓글 영역