반응형
JPA란?
- Java Persistent Api의 약자.
- 자바 ORM에 대한 기술 명세서로, 자바 애플리케이션에서 RDB를 사용하는 방식을 정의한 인터페이스이다.
JPA는 하나의 기술 명세서
- JPA는 특정 기능을 모아 놓은 라이브러리가 아니고,
- 자바 애플리케이션에서 ORM 방식으로 DB에 접근하기 위한 방식을 정의한 인터페이스의 모음이다.
- JPA는 영속성을 통해서 Application과 DB의 데이터를 운반한다.
- 한마디로, JPA는 RDB를 어떻게 사용할지에 대한 정의라고 이해하면 편할듯하다.
JPA 영속성?
- Spring에서는 @Entity 어노테이션을 붙인 클래스를 통해 영속성을 관리(Entity에 대한 추가 글 필요!)
- JPA에서 영속성이란, 하나의 실행 흐름(컨텍스트)이라고 이해하면 될 듯하고, 우리가 흔히 아는 트랜잭션의 범위에 해당되고,
- 이 범위 안에서 영속성은 영속성 컨텍스트를 통해서 관리되는데, 실행 흐름에서 @Entity들의 관계를 정의하고 이 흐름에서 생겨나는 관계와 데이터들을 DB에 반영하는 기능을 한다.
- 이 영속성 컨텍스트를 제어하기 위해서는 EntityManager 클래스를 이용해야한다.
- 기본적으로 ORM을 구현하기 위해서는 이 EntityManager를 통해서 @Entity에 접근해야하지만, Spring JPA와 Hibernate 등의 구현체에서는 이를 지원해주는 특징이 있다.
[EntityManager.java] 내부 구조
package javax.persistence;
import ...
public interface EntityManager {
public void persist(Object entity);
public <T> T merge(T entity);
public void remove(Object entity);
public <T> T find(Class<T> entityClass, Object primaryKey);
// More interface methods...
}
그럼 ORM이란 무엇인가?
- Object Relation Mapping의 약자. 용어 그대로, 객체를 DB 데이터와 매핑시켜주는 역할
- SQL 쿼리가 아닌, 객체의 메서드로 데이터를 조작한다.
- 객체들간의 관계를 바탕으로 SQL문을 자동으로 생성해준다.
- 앞서 얘기한 JPA 인터페이스를 구현한 객체라고 이해하면 될 것같다.
- 대표적인 예로는 Hibernate가 있고, eclipselinke, Datanucleus, OpenJPA, TopLink Essestials 등이 있다.
기존의 SQL mapper와 ORM과의 차이점은?
- SQL mapper는 SQL을 통해 객체의 필드를 매핑시켜준다.
- SQL문으로 직접 DB를 조작한다.
- 객체의 필드와 매핑을 시켜주기 때문에 테이블의 유기적 관계를 설명해주지 못한다는 특징이 있다.
- 대표적인 예로는 MyBatis, Jdbc 등이 있다.
그렇다면, Spring JPA는 뭘까?
- Spring JPA는 개발자가 JPA를 쉽고 편하게 사용할 수 있도록 만든 라이브러리이다.
- JPA를 추상화한 Repository의 메서드를 사용을 통해 Spring이 적합한 쿼리를 보내는 구현체를 Bean으로 만드는 방식이다.
- Repository의 기본 구현체인 SimpleJpaRepository는 내부적으로 JPA 인터페이스에 있는 EmtityManager를 사용한다.
[SimpleJpaRepository.java]의 내부 구조
package org.springframework.data.jpa.repository.support;
import ...
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
private final EntityManager em;
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
if (metadata == null) {
return Optional.ofNullable(em.find(domainType, id));
}
LockModeType type = metadata.getLockModeType();
Map<String, Object> hints = getQueryHints().withFetchGraphs(em).asMap();
return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
}
...
}
JPA를 사용하면 뭐가 좋을까?
- 데이터들간의 관계를 객체 지향적으로 설계하기 때문에 개발자가 비즈니스 로직에 집중할 수 있다.
- 복잡한 쿼리를 지원해주는 JPQL (이 또한 쿼리를 작성할 때, 객체에 접근하므로 직관적이다.)
- 지연로딩이나 즉시로딩 등을 지원하기 때문에 이를 잘 활용하면, SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있다.
- 특히 Spring JPA는 Optional을 지원하므로 Null-Safe한 코드를 작성할 수 있다.
간단하게 표현하자면?
- 객체 중심의 개발
- 생산성 향상 (간단한 메서드로 CRUD 가능)
- 쉬운 유지보수 (해당 객체만 수정하면 나머지는 JPA가 알아서 처리!)
- 객체와 RDB간의 패러다임 불일치 해결
JPA의 동작 과정
- JPA는 Application과 JDBC 사이에서 동작하며(구현체의 동작),
- 개발자가 직접 SQL을 짜는 것이 아닌,
- 프로그램에 의해서 객체를 JDBC API를 호출하여 SQL문을 생성하는 것이다.
- 그러므로, JPA를 사용한다고 해서 JDBC를 사용하지 않는 것이 아니다.
참조
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
https://dev-troh.tistory.com/150
https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html
https://gmlwjd9405.github.io/2019/08/03/reason-why-use-jpa.html
반응형
LIST
'Spring Framework > JPA' 카테고리의 다른 글
JPA @DataJpaTest - 환경구성 (0) | 2023.12.12 |
---|---|
JPA findAll()은 어떻게 쿼리 결과를 객체로 파싱할까? (feat. 메서드 호출 과정) (0) | 2023.11.17 |
Hibernate 6.2 업데이트 시, Kotlin @OneToMany 제네릭 타입 이슈 (0) | 2023.10.24 |
JPA - 환경설정(feat. 스프링 부트) (0) | 2019.08.21 |