본문 바로가기
Dev/JPA

[JPA] JPA 소개

by dev_jsk 2021. 7. 13.
728x90
반응형

JPA를 소개하기 앞서 JPA가 나오게 된 이유에 대해 알아보자.

SQL 중심적인 개발의 문제점

1. 데이터베이스 세계의 헤게모니는 아직까지도 관계형 DB(Oracle, MySQL ...)가 가지고 있다.

2. 애플리케이션 개발 시 무한반복, 지루한 코드 (CRUD, Java 객체 -> SQL / SQL -> Java 객체) 문제점 발생

예를들어 객체에 필드 추가 시 해당 객체를 사용하는 SQL에 하나씩 다 추가가 필요하여 SQL에 의존적인 개발을 피하기 어렵다.

3. 객체와 관계형 데이터베이스의 차이

  • 상속 : 객체에는 상속관계가 존재하지만 관계형 DB에는 상속관계가 없고 그나마 유사한 Table 슈퍼타입 서브타입 관계라는 논리모델이 존재한다. 상속관계 객체 제어는 부모, 자식 객체를 생성하여 저장, 조회 등 복잡한 과정이 이뤄지기 때문에 DB에 저장할 객체에는 상속관계를 사용하지 않는다.
  • 연관관계 : 객체는 참조를 사용하여 단방향 연관관계이고 관계형 DB는 PK(기본키)와 FK(외래키)로 조인하여 사용하여 양방향 연관관계이다. 객체를 DB 테이블에 맞춰 모델링 할 경우 연관관계에 있는 테이블의 PK를 필드로 구성하여 사용하고 객체다운 모델링을 할 경우 참조로 연관관계를 맺어 A 객체 안에서 B 객체를 필드로 구성하여 사용한다. 이때 객체 저장시엔 큰 문제가 되지 않지만, 조회 시 각 객체별로 데이터 조회 후 두 객체의 연관관계를 직접 설정해줘야 하기 때문에 생산성이 떨어진다. 그렇기 때문에 일반적으로 생산성을 높이기 위해 두 객체의 필드를 모두 포함하는 슈퍼 객체를 만들어 사용한다.
  • 데이터 타입 : 처음 실행하는 SQL에 따라 데이터 타입(탐색 범위)가 결정된다. 따라서 다른 사람이 작성한 DAO 내 함수를 SQL을 직접 보지 않고 연관관계가 있는 객체를 사용하면 엔티티 신뢰 문제가 발생한다. 그렇다 해서 모든 객체를 미리 로딩할 수는 없고 상황에 따라 동일한 객체 조회 함수를 여러벌 생성하여 사용해야 한다. 결과적으로 계층형 아키텍처 진정한 의미의 계층 분할이 어렵다.
  • 데이터 식별 방법 : 일반적인 SQL을 사용하여 조회 시 같은 타입의 두 객체는 다르지만 Java Collection을 이용하여 조회 시 두 객체는 같다.

4. 객체답게 모델링 할 수록 매핑 작업만 늘어난다.

 

JPA

Java Persistence API로 Java 진영의 ORM 기술 표준

 

ORM

1. Object-relational mapping(객체 관계 매핑) 으로 객체는 객체대로 관계형 DB는 관계형 DB대로 설계하는 것을 말한다.

2. ORM 프레임워크가 중간에서 매핑하며 대중적인 언어에는 대부분 ORM기술이 존재한다.

 

JPA 소개

 

JPA 특징

1. JPA는 애플리케이션과 JDBC 사이에서 동작한다.

기본 구성

※ JPA 동작 (저장 / 조회)

저장 / 조회

2. JPA는 인터페이스의 모음으로 JPA 표준 명세를 구현한 3가지 구현체(Hibernate, EclipseLink, DataNucleus)가 있다.

 

3. JPA를 사용하는 이유

(1) SQL 중심적인 개발에서 객체 중심으로 개발

(2) 생산성 : JPA를 이용한 CRUD

  • Create : jpa.persist(object)
  • Read : Object obj = jpa.find(object.id)
  • Update : object.setId("변경할 ID")
  • Delete : jpa.remove(object)

(3) 유지보수 : 기존에는 필드 변경 시 해당 객체를 사용하는 모든 SQL을 수정해야 했지만 JPA는 개발자가 객체에 필드만 추가하고 SQL은 JPA가 생성, 실행처리 한다.

(4) 패러다임의 불일치 해결

  • 상속
    저장 : jpa.persist(object)를 하면 JPA가 상속관계에 있는 객체들을 각각의 Table에 맞게 insert 쿼리를 생성한다.
    조회 : Object obj = jpa.find(Object.class, objId)를 하면 JPA가 각각의 Table을 Join 하여 select 쿼리를 생성한다.
  • 연관관계, 객체 그래프 탐색
    연관관계 저장 : object.setTeam(team), jpa.persist(object)를 하면 JPA가 연관관계에 있는 객체들을 각각의 Table에 맞게 insert 쿼리를 생성한다.
    객체 그래프 탐색 : Object obj = jpa.find(Object.class, objId), Team team = object.getTeam()을 하면 JPA가 각각의 Table을 Join 하여 select 쿼리를 생성한다.
  • 신뢰할 수 있는 엔티티, 계층
    JPA를 통해 객체 조회 시 지연 로딩이라는 기능이 있어서 계층 관계에 있는 객체 사용 시에 해당 타입의 객체를 조회하는 SQL이 생성, 실행되어 자유롭게 계층 관계에 있는 객체를 사용할 수 있다. (=객체 그래프를 탐색할 수 있다)
  • JPA와 비교하기
    Java Collection을 이용하여 조회하는 것처럼 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.

(5) 성능

  • 1차 캐시와 동일성(identity) 보장
    같은 트랜잭션 안에서는 같은 엔티티를 반환 (약간의 조회 성능 향상)
  • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
    저장(Insert) : 트랜잭션을 커밋할 때까지 insert SQL을 모음, JDBC Batch SQL 기능을 사용해서 한번에 SQL 전송
    수정(Update) : Update, Delete로 인한 행(row)락 시간 최소화, 트랜잭션 커밋 히 update, delete SQL 실행하고 바로 커밋
  • 지연 로딩(Lazy Loading)
    지연 로딩 : 객체가 실제 사용될 때 로딩
    즉시 로딩 : Join SQL로 한번에 연관된 객체까지 미리 조회
    지연 로딩과 즉시 로딩은 JPA 옵션을 사용하여 변경 가능하다.

(6) 데이터 접근 추상화와 벤더 독립성

(7) 표준

728x90
반응형

'Dev > JPA' 카테고리의 다른 글

[JPA] 실습 - 요구사항 분석과 기본 매핑  (0) 2021.08.03
[JPA] 엔티티 매핑  (0) 2021.08.02
[JPA] 영속성 관리  (0) 2021.07.20
[JPA] JPA 시작하기  (0) 2021.07.17
[JPA] 강좌 소개  (0) 2021.07.13

댓글