CS

[JPA] ORM, JPA

KJihun 2023. 10. 30. 15:27
728x90

 

 

ORM(Object-Relational Mapping)

Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며,

어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이다.

 

장점

  • SQL문이 아닌 Method를 통해 DB를 조작하여 개발자는 비즈니스 로직을 구성하는데만 집중할 수 있다
  • Query의 선언문, 할당 등 부수적인 코드가 줄어 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높일 수 있다
  • 객체지향적인 코드 작성이 가능하여 객체지향적 접근만 고려하면 되기때문에 생산성이 증가될 수 있다
  • 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리하다
  • 기존 방식에서 MySQL에서 PostgreSQL로 변환 시 새로 쿼리를 수정해야 하지만 ORM을 사용하면 수정할 필요가 없다

 

단점

  • 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있다
  • 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야한다

 

JPA

자바에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 

실제적으로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이며

JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다.

 

 

 

JPA 장점

 

1. 간편한 매핑

JPA는 자바 객체 - BD 테이블 매핑을 자동으로 처리한다.

복잡한 SQL문을 작성하지 않아도 객체를 데이터베이스에 저장하고 조회할 수 있으나, 네이티브 SQL 기능을 제공하여

관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성하여 사용할 수 있다.

 

2. 유지보수 용이성

DB 스키마의 변경에 유연하게 대응할 수 있다. 객체 모델을 변경해도 JPA가 DB 스키마를 갱신한다.

4. 쿼리 언어(JPQL) 제공

JPA는 객체를 대상으로 하는 쿼리 언어인 JPQL(Java Persistence Query Language)을 제공한다.

이는 SQL과는 다르게 객체를 기준으로 쿼리를 작성할 수 있다.

 

JPA - Object Mapping 방식

1. 엔티티 매핑 정보 분석 및 관리
애플리케이션이 시작될 때, 엔티티 클래스를 분석하여 데이터베이스 테이블과의 매핑 정보를 생성한다.

엔티티 메타데이터(ex: 어노테이션)를 통해 엔티티의 필드와 DB의 컬럼이 매핑되는지를 이해한다.

  • `@Entity`, `@Table`, `@Column` 등

 

2. 영속성 컨텍스트와 엔티티 매니저
DB와 객체 간 상호작용은 엔티티 매니저(EntityManager)를 통해 이루어진다.

엔티티 매니저는 영속성 컨텍스트에 객체를 저장하고 관리하며, DB와 통신하여 SQL을 생성하고 실행한다.

 

[JPA] 영속성 컨텍스트, 엔티티 매니저

JPA(Java Persistence API)에서 영속성 컨텍스트(Persistence Context)영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻이다.영속성 컨텍스트는 애플리케이션과 DB 사이에서 객체를 보관하는 가

developerhun.tistory.com

 

 

3. 객체와 관계형 데이터 간의 변환 (ORM 매핑 방식)
JPA는 엔티티와 DB의 불일치를 해결하기 위해 ORM 매핑 규칙을 사용한다.

객체의 속성을 테이블의 컬럼에 매핑하고,

객체 간의 관계(예: @ManyToOne, @OneToMany)를 테이블 간의 관계(외래 키 등)로 매핑한다.

4. SQL 생성 및 실행

개발자가 SQL문을 직접 작성하지 않도록 하기 위해 JPA는 DB에 접근 시 SQL 쿼리를 자동으로 생성한다.

 

  • 영속성 컨텍스트에 저장된 엔티티의 상태 변화를 추적하여 상태가 변경되면 SQL을 생성하여 DB에 적용한다.
    • ex: `EntityManager.persist()' 를 호출 시, `INSERT` 쿼리를 생성한다.

  • JPQL을 사용해 객체 기반의 쿼리를 작성 후, JPA는 작성된 쿼리를  SQL문으로 변환하여 DB에 전달한다.
       
  • DB의 변경 작업은 트랜잭션 내에서 이루어지며, JPA는 엔티티 매니저를 통해 트랜잭션을 관리하여 데이터의 일관성과 무결성을 유지한다.
    • ex: 'EntityManager.persist()'는 트랜잭션이 커밋될 때까지 변경 사항을 반영하지 않으며, 커밋 시점에 SQL 쿼리를 실행하여 DB에 반영한다.

 

5. 캐싱 및 성능 최적화

JPA는 영속성 컨텍스트를 통해 1차 캐시를 제공하여 동일한 트랜잭션 내에서 동일한 데이터를 다시 조회할 때 DB에 쿼리를 보내지 않고 캐싱된 데이터를 사용한다. (2차 캐시를 통해 트랜잭션 간 DB 쿼리 성능을 최적화 할 수도 있다.)

6. 객체의 생명주기 관리
JPA는 엔티티 객체의 생명주기를 관리한다. 

객체는 다음과 같은 생명주기를 거치며, 상태에 따라 데이터베이스와 상호작용한다.
- 비영속(Transient): 영속성 컨텍스트에 저장되지 않은 상태로, 아직 데이터베이스와 관련이 없는 상태.
- 영속(Persistent): 영속성 컨텍스트에 관리되는 상태로, 데이터베이스에 저장되었거나 저장될 상태.
- 준영속(Detached): 한 번 영속성 컨텍스트에서 관리되었지만, 더 이상 관리되지 않는 상태.
- 삭제(Removed): 삭제된 상태로, 데이터베이스에서도 제거될 상태.

 

 

요약


JPA는 영속성 컨텍스트를 사용해 객체의 상태를 추적하고, 객체와 데이터베이스 테이블 간의 매핑 정보를 기반으로 SQL 쿼리를 자동으로 생성 및 실행한다.

개발자는 객체 모델을 사용하여 데이터를 조작하며, JPA는 내부적으로 JDBC를 사용해 DB와 통신하고, 객체지향적 접근 방식으로 관계형 데이터베이스와의 상호작용을 추상화하여 개발 편의성을 높인다.

'CS' 카테고리의 다른 글

[Network] websocket & stomp, 실시간 통신  (0) 2023.11.07
[JPA] N+1  (0) 2023.10.30
[JPA] Propagation  (0) 2023.10.27
[DB] 트랜잭션(Transaction, ACID)  (0) 2023.10.27
[JPA] 영속성 컨텍스트, 엔티티 매니저  (0) 2023.10.27