SpringFramework와 JPA (2)

Pu_DDung·2021년 7월 24일
1

Spring-JPA

목록 보기
2/5

저번 첫 번째 시간에서는 JPA가 무엇인지 간단하게 알아보는 시간을 가졌다.
이번 시간에는 JPA와 관련된 용어와 전체적인 구조를 짚고 넘어간다.

🏳 JPA 구현체

첫 번째 시간에서 JPA는 인터페이스이고 이를 활용하기 위해서는 구현체가(class)가 필요하다고 언급했다.
그렇다면, JPA 인터페이스를 활용할 수 있도록 구현체 역할을 하는 것은 무엇이 있을까?

구현체 종류에는 Hibernate, EclipseLink, DataNucleus, OpenJPA, ObjectDB, TopLink Essential 와 같은 ORM 프레임워크가 있다.

이 중에서 가장 널리 사용되는 Hibernate에 대해서 공부한다.

Hibernate 특징

  1. 생산성
  • SQL을 직접 사용하지 않고, 메소드 호출만으로 쿼리가 수행된다.
  1. 유지보수
  • 테이블 컬럼이 변경되었을 경우, JPA가 알아서 수정 작업을 대신해준다.
  1. 특정 벤더에 비종속적
  • 여러 DB벤더(MySQL, Oracle, MariaDB) 마다, SQL문이 조금씩 다른데, JPA는 추상화된 데이터 접근 계층을 제공하기 떄문에 애플리케이션이 특정 벤더에 종속적이지 않도록 할 수 있다.
  1. 성능
  • SQL을 직접 작성하는 것보다는 성능이 떨어질 수 있다. 그러나, 현재는 많이 발전하여 좋은 성능을 보여주고 있다.
  1. 세밀함
  • 복잡한 쿼리를 메소드만으로 해결하는 것은 힘들다. 이것을 보완하기 위해, SQL과 유사한 기술인 JPQL을 지원하고 SQL 자체 쿼리를 작성할 수 있도록 지원도 하고 있다.

🌼 Spring Data JPA

Spring Framework에서 제공하는 모듈 중 하나로, JPA를 편리하게 사용할 수 있도록 지원해주는 라이브러리이다.

Spring Data JPA는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스 제공한다.
Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.

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...
}

Repository 인터페이스의 기본 구현체인 SimpleJpaRepositroy의 코드를 보면 위와 같이 내부적으로 EntityManager를 사용하고 있는 것을 볼 수 있다.

🐱 전체적인 구조

JPA, Hibernate, Spring Data JPA의 전반적인 구조를 그림으로 표현한 것이다.

🚩 결론

  1. 가장 널리 JPA 구현체로 사용되는 프레임워크는 Hibernate이다.
  2. Spring Data JPA는 Repository라는 인터페이스를 사용하여 JPA를 더욱 추상화하여 간편하게 사용할 수 있게 한다.
  3. 추상화 단계는 Spring Data JPA > JPA > Hibernate > JDBC 로 전체적인 그림을 잡으면 된다.
profile
_푸뚱_~^^

0개의 댓글