ORM, JPA, Spring Data JPA

SaGo_MunGcci·2022년 8월 4일
0

스프링

목록 보기
7/31

Definition Access

  • ORM : object Relatrional Mapping의 약자로, 객체와 관계형 데이터베이스를 매핑해주는 것을 말한다.

  • JPA : JPA는 Java Persistence API의 약자로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다

  • Spring Data JPA : JPA를 쓰기 편하게 만들어놓은 모듈이다.



Mechanism

1.ORM


이미지 출처 : https://spicycookie.me/Nodejs/sequelize/

  • 자바는 객체 지향 패러다임으로 만들어졌고, 관계형 데이터베이스는 데이터를 정규화해서 잘 보관하는 것을 목표로 한다. 객체를 데이터베이스에 넣기 위해서는 SQL문을 통해 변환해서 저장해야 하고, 데이터베이스에서 객체를 다시 꺼내오기 위해서는 복잡한 SQL문을 작성해야 한다. 결국 객체를 단순히 데이터 전달 목적으로 사용할 뿐 객체지향적으로 프로그래밍을 할 수 없다. 이는 객체지향과 관계형 데이터베이스 간의 패러다임이 불일치하기 때문이다. 이를 해결하기 위해서서 나온 기술이 ORM이다.

2.JPA

  • JPA는 Java Persistence API의 약자로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. 여기서 중요하게 여겨야 할 부분은, JPA는 말 그대로 인터페이스라는 점이다. JPA는 특정 기능을 하는 라이브러리가 아니다. 마치 일반적인 백엔드 API가 클라이언트가 어떻게 서버를 사용해야 하는지를 정의한 것처럼, JPA 역시 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 한 방법일 뿐이다.

  • JPA는 단순히 명세이기 때문에 구현이 없다. JPA를 정의한 javax.persistence 패키지의 대부분은 interface, enum, Exception, 그리고 각종 Annotation으로 이루어져 있다. 예를 들어, JPA의 핵심이 되는 EntityManager는 아래와 같이 javax.persistence.EntityManager 라는 파일에 interface로 정의되어 있다.

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...
}
  • 대표적인 JPA는 Hibernate,EclipsLink,DataNucleus,OpenJpa,TopLink등이 있다.

3.Spring Data JPA

  • JPA를 쓰기 편하게 만들어놓은 모듈이다.

  • DB에 접근할 필요가 있는 대부분의 상황에서는 Repository를 정의하여 사용한다. 이 Repository가 바로 Spring Data JPA의 핵심이다.

  • Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다. 이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
  • Spring Data JPA가 JPA를 추상화했다는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것이다. 예를 들어, Repository 인터페이스의 기본 구현체인 SimpleJpaRepository의 코드를 보면 아래와 같이 내부적으로 EntityManager을 사용하고 있는 것을 볼 수 있다.
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));
    }

    // Other methods...
}
  • JPA의 특징

      1. 특정 데이터베이스에 종속되지 않음
      1. 객체지향적 프로그래밍을 할 수 있다.
      1. 생산성 향상
      1. 복잡한 쿼리를 처리를 가진다.
      1. 성는 저하 위험이 있다.
      1. 학습시간이 오래 걸린다.

    ORM, JPA, Spring Data JPA를 통한 활용 예시.

참고 : https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/



Retrospection

  • 비슷한 용어이지만 각 개념의 특징이 있고 그 특징들이 연결되어 있다.
  • 이해하려고 하니까 너무 복잡한 것같다.


profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글