JPA와 Hibernate 그리고 Spring Data JPA

2023. 6. 4. 15:00·🥑 Web Technoloy

💡 JPA(Java Persistent API)란?

  • JPA는 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세를 뜻합니다.
  • ORM 기술이란 말 그대로 객체와 관계형 데이터베이스를 매핑해주는 기술을 말합니다.
    • 즉, 객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하고, ORM 프레임워크가 중간에서 매핑을 해주는 것을 의미합니다.
  • 이러한 JPA는 인터페이스의 모음 즉, 단순한 명세이기 때문에 구현이 없습니다.
  • 그저 자바 애플리케이션에서 관계형 데이터베이스를 어떻게 사용할지를 정의하는 하나의 방법일 뿐입니다.
  • 따라서 이러한 JPA의 구현체가 있어야 JPA를 사용할 수 있습니다.

💡 JPA를 사용하는 이유

  • SQL문이 아닌 메서드를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데에만 집중할 수 있습니다.(내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도 됨)
  • Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높일 수 있습니다.
  • 객체 지향적인 코드 작성이 가능합니다. 따라서 오직 객체 지향적 접근만 고려하면 되기 때문에 생산성이 증가합니다.
  • 매핑하는 정보가 Class로 명시 되어있기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리합니다.
    • 예를 들어, 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생기게 되는데, 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없어집니다.

💡 Hibernate

  • Hibernate는 JPA를 구현한 구현체 중 하나입니다.
  • 개발된 지 10년이 넘었으며 대중적으로 많이 이용되는 JPA 구현체입니다.
  • JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction 등을 상속받아 구현하며, 내부적으로 JDBC를 이용해 관계형 데이터베이스와 커넥션을 맺고 상호작용합니다.
  • JPA를 구현하는 다른 구현체들로는 EclipseLink나 DataNucleus 등이 있습니다
  • 만약 JPA를 구현하는 구현체들이 마음에 들지 않는다면 개발자가 직접 JPA 구현체를 만들어 사용할 수도 있습니다.

💡 Spring Data JPA

  • Spring Data JPA는 JPA를 더 쉽게 사용하기 위한 Spring Data 프레임워크의 한 파트로, JPA를 이용한 구현체를 한 단계 더 추상화시켜 더 쉽고 간편하게 JPA를 이용한 프로젝트를 개발할 수 있게 해 주는 Spring 모듈입니다.
  • 필자는 Spring으로 개발을 하면서 강의 내용을 따라하는 경우를 빼고는 단 한 번도 EntityManager를 직접 다뤄본 적이 없습니다.
  • 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와 Hibernate 그리고 Spring Data JPA

  • 아래 그림은 위의 내용을 요약하여 JPA, Hibernate, 그리고 Spring Data JPA의 전반적인 개념을 표현한 것입니다.
  • 아래 그림을 이해하여 셋을 혼동하지 않고 사용하는 것이 중요합니다.


📌 References

  • https://code-lab1.tistory.com/288
  • https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
저작자표시 (새창열림)

'🥑 Web Technoloy' 카테고리의 다른 글

URI와 URL  (0) 2023.06.06
JPQL과 QueryDSL  (0) 2023.06.04
Lombok이란?  (1) 2023.06.04
Spring AOP(Aspect Oriented Programming)  (0) 2023.06.03
SpringBoot에서 SMTP를 활용한 메일 전송 구현하기  (0) 2022.11.16
'🥑 Web Technoloy' 카테고리의 다른 글
  • URI와 URL
  • JPQL과 QueryDSL
  • Lombok이란?
  • Spring AOP(Aspect Oriented Programming)
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
JPA와 Hibernate 그리고 Spring Data JPA
상단으로

티스토리툴바