[JPA] Spring Data Access 정리

su_y2on·2022년 5월 14일
0

JPA

목록 보기
15/17

Spring Data Access 정리

스프링에서 유저가 DB에 있는 데이터를 이용해야하는 요청을 보낼 때 어떤 일이 일어나는지 정리해보겠습니다!



1. JDBC (Java DataBase Connectivity)

JDBC는 데이터를 다루는 것을 도와주는 자바 표준 인터페이스입니다. 그리고 JDBC의 구현체로 각 DBMS에 맞는 Driver가 있습니다. 따라서 프로그램을 할때 DBMS의 종류에 상관없이 동일한 코드를 짤 수 있는 장점이 있습니다. 이를 위해서 커넥션풀을 관리하는 DataSource를 등록합니다. 그리고 커넥션을 이용해 쿼리를 날리고 결과를 받아옵니다.




2. JPA (Java Persistence API)

JPA는 Java ORM 명세서이며 DB를 다루는 것을 도와주는 자바 인터페이스입니다. ORM은 DB의 테이블과 자바 객체를 매핑해서 객체지향적으로 DB를 관리할 수 있게 도와줍니다. 이와 비슷한 것으로는 SQL Mapper가 있는데 이는 단순히 DB테이블과 객체를 연결해주는 것으로 SQL을 직접 명시해줘야힙니다. 예로는 Mybatis, jdbcTemplate가 있습니다

2-1. Hibernate

JPA와 함께 자주 등장하는 Hibernate는 JPA의 구현체입니다! JPA의 EntityManagerFactory, EntityManager, EntityTransaction을 각각 SessionFactory, Session, Transaction으로 상속받은 뒤 이에대한 각각의 구현체를 갖고있습니다.




3. Spring Data JPA

Spring Data JPA는 JPA를 더 추상화시켜 더더욱 편리하게 JPA를 사용할 수 있게 해줍니다! Repository를 제공하고 이를 상속받아서 적절한 인자를 전달해주면 각 Entity에 맞는 Repository로 만들어 Bean으로 등록해줍니다. JpaRepository를 타고가면 아래와 같이 결국 JPA로 이뤄져있습니다.


@Repository
@Transactional(
    readOnly = true
)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
      private static final String ID_MUST_NOT_BE_NULL = "The given id must not be null!";
      private final JpaEntityInformation<T, ?> entityInformation;
      private final EntityManager em;
      private final PersistenceProvider provider;
      @Nullable
      private CrudMethodMetadata metadata;
      private EscapeCharacter escapeCharacter;

    			......
    
       public Optional<T> findById(ID id) {
            Assert.notNull(id, "The given id must not be null!");
            Class<T> domainType = this.getDomainClass();
            if (this.metadata == null) {
                return Optional.ofNullable(this.em.find(domainType, id));
            } else {
                LockModeType type = this.metadata.getLockModeType();
                Map<String, Object> hints = new HashMap();
                this.getQueryHints().withFetchGraphs(this.em).forEach(hints::put);
                return Optional.ofNullable(type == null ? this.em.find(domainType, id, hints) : this.em.find(domainType, id, type, hints));
            }
        }

    
    }



정리해보면 아래와 같은 계층을 이루고있습니다.

0개의 댓글