본문 바로가기

Java

JPA 란?

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 프로그래밍 - 김영한