ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] JPA
    Backend/개발 2021. 8. 3. 12:28
    반응형
    TIL 34일차 

    h2, JPA, hibernate, orm.. 개념이 너무 헷갈려서 찾으면서 가볍게만 좀 정리했다.

    JPA에 대해서는 자소서에 JPA를 이용해서 데이터베이스를 관리했다고 쓴게 민망할정도로 별로 몰랐던 것 같다.. ;_; 글에 써진 내용도 아주 간단한 정리이다,, 여기 써진 만큼의 개념은 자주 보면서 계속 머릿속에 넣고 이해안될때마다 다시 찾아봐야겠다.



    Spring 프로젝트에서는 JPA <- Hibernate <- Spring Data JPA 이렇게 단계를 거쳐 JPA가 구현되어있다.

    Data Access Layers

    이건 그냥 hibernate에 관련한 그림 ..

     

    JDBC

    여러 DB에 맞는 Driver를 만들어 DriverManager만 변경하면 우리가 사용하는 API를 변경하지 않아도 DB를 사용할 수 있게 도와준다.

    JDBC는 중복코드가 많고 connection을 계속 관리해줘야했던 단점이 있고, 그래서 SQL mapper가 등장했다.

     

    SQL Mapper

    SQL Mapper에는 Spring jdbc와 Mybatis등이 있는데, Mybatis는 java코드에서 SQL을 분리해내기 위해 쿼리를 XML로 이동시켰다.

     

    하지만 엔티티가 변경되었을 때 여전히 SQL를 수정해 주어야 한다. 코드의 위치를 분리했지만, 의존관계를 끊지는 못했다.



    이때 JPA가 등장했다.

    JPA란

    Java Persistence API

     

    자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스, Java SE와 Java EE에서 자바의 영속성 관리와 ORM을 위한 표준 기술.

     

    인터페이스이므로 구현이 없고 javax.persistence 도 대부분 interface, enum, Exception, Annotaion 으로 이루어져 있다.

     

    Hibernate

    Hibernate는 JPA 인터페이스의 구현체이다. 직접 구현한 라이브러리.

     

    즉, 구현체 중 하나이므로 JPA를 사용하기 위해서 반드시 Hibernate를 사용할 필요가 없다. 다른 JPA구현체나 직접 구현해 사용할 수가 있다는 뜻

     

    Spring Data JPA

    JPA를 쓰기 편하게 만들어놓은 모듈이다. 우리는 Spring 개발을 하면서 EntityManager를 사용해본 적이 없다. 왜냐면 Repository를 정의해서 사용했기 때문

    JPA를 한단계 추상화 시킨 Repository라는 인터페이스를 제공함으로 써 Spring에서 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어 Bean으로 등록해준다.

     

    @Repository
    public interface ParticipantsRepository extends JpaRepository<ParticipantsEntity, Long> {
    
    }
    
    @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;
    

    JpaRepository의 기본 구현체인 SimpleJpaRepository의 코드를 보면 내부적으로 EntityManager를 사용하고 있는 것을 볼 수 있다.

    EntityManager는 Entity를 관리해주는 역할을 하는데, 쿼리를 개발자가 관리하지 않고 EntityManager에게 맡긴다.

     

    JPA 특징
    • Lazy Loading
    • Dirty Checking
    • Caching

     

    JPA vs Mybatis

    JPA 장점
    • 구현체 교체의 용이성
      : 언젠가 hibernate가 아닌 다른 구현체로 교체할 때 Spring Data JPA 내부에서 매핑을 지원해 줄 것
    • 저장소 교체의 용이성
      : 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함 ( 의존성만 교체해주면 됨)
    • 코드 재활용 용이
    • 기본 CRUD, 페이징이 제공되어 개발에 집중할 수 있음
    JPA 단점
    • 어렵다 .. 연관관계가 있는 엔티티를 대할 때 특히 !
    • 성능저하가 올 수 있다.
    관련 된 개념 : N+1문제, Fetch 문제
    Mybatis

    쉽다. SQL을 그대로 사용하므로

    DB 변경시 쿼리를 다 변경해야하고, Mapper를 작성하는것이 번거롭다.

    그래서 프로젝트 규모가 크다면 Select는 mybatis를 사용해 섞어 사용하는 경우도 있다.

    출처

    JPA 특징 읽어보기

    댓글

Designed by Tistory.