JPA 는Java Persistence API 로
자바 진영에서 ORM (Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스 모음이다.
ORM 이란?
ORM은 "Object-Relational Mapping"의 약자로, 객체와 관계형 데이터베이스 간의 매핑을 의미합니다. 객체 지향 프로그래밍에서는 객체를 사용하여 데이터를 모델링하고, 관계형 데이터베이스는 테이블을 사용하여 데이터를 저장합니다. ORM은 이 두 세계 간의 불일치를 해결하기 위해 도움을 주는 기술입니다.
JPA의 구현체로는 하이버네이트, EclipseLink, DataNucleus 가 있다.
JPA 의 장점
1. SQL 중심적인 개발에서 벗어나 객체 중심적인 개발
2. 생산성
함수를 불러오는 것만으로 SQL 가 생성되어, 개발자가 직접 SQL 문을 만들 필요가 없다.
Member member = new Member(1L, "newMember");
등록: jpa.persist(member);
조회: Member findMember = jpa.find(memberId);
수정: findMember.setName("oldMember");
삭제: jpa.remove(member);
3.유지보수
만약 전화번호 컬럼을 추가 해야하는 상황에서 JPA 를 사용하면 SQL 문을 수정하지 않고, 해당 객체에 필드만 추가하면
알아서 테이블을 만들고 SQL 문을 변경해준다.
public class Member {
private String memberId;
private String name;
private String tel; // 추가된 컬럼
}
INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES ...
SELECT MEMBER_ID, NAME, TEL FROM MEMBER M
UPDATE MEMBER SET … TEL = ?
4. 패러다임의 불일치를 해결
5. 성능
JPA 는 여러가지 최적화 기능이 있다.
5-1. 1차캐시 와 동일성(identity) 보장
동일한 트랜잭션 안에서는 같은 엔티티를 반환
첫번째 find 에서 sql 문을 던지고 여기서 JPA 는 영속성 컨텍스트 라는 곳에 해당 엔티티를 저장한다.
이후 영속성 컨텐스트에 해당 엔티티가 존재하면, sql문을 던지지 않고 영속성 컨텍스트에서 엔티티를 가져와서
약간의 조회 성능을 향상 시켜준다.
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //true
5-2. 트랜잭션을 지원하는 쓰기 지연(transactional write-begind)
JDBC Batch SQL 기능을 사용해서 한번에 SQL 전송
transaction.begin(); // 트랜잭션 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// 이 시점까지 데이터베이스에 직접 쿼리문을 날리지 않는다.
transaction.commit();
// commit 이후 모아뒀던 쿼리문을 한번에 전송한다.
5-3. 지연로딩(Lazy Loading)
지연 로딩: 객체가 실제 사용될 때 로딩
즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회
6. 데이터 접근 추상화와 벤더 독립성
7. 표준
JPA 단점
- 러닝커브가 크다.
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우에는 속도 저하 및 일관성을 무너뜨리는 문제점이 발생할 수도 있다(개발자가 의도하지 않은 자동으로 생성된 Query로 인해 성능이 저하되기도 함)
- 복잡하고 무거운 쿼리는 별도의 튜닝이 필요하기 떄문에 결국 SQL문을 사용하게 되는 상황이 발생한다.
참조
자바 ORM 표준 JAP 프로그래밍 - 김영한
'Java' 카테고리의 다른 글
JPA Unknown entity 해결방법 (0) | 2024.01.29 |
---|---|
JPA 구현체 하이버네이트 사용방법 (0) | 2024.01.27 |
[Spring] variable not initialized in the default constructor 에러 (0) | 2024.01.11 |
[Java] Reactive Streams 란? (1) | 2024.01.10 |
Spring Webflux 간단하게 알아보기 (0) | 2023.12.25 |