본문 바로가기

Development/Spring

[Spring] JPA (Java Persistence API), Hibernate, Spring Data JPA

JPA (Java Persistence API) 

  • 자바 진영의 ORM 기술 표준을 채택된 인터페이스의 모음
  • ORM이 큰 개념이라면 JPA는 더 구체화된 스펙을 포함함
  • 즉 JPA는 실제로 동작하는 것이 어떻게 동작해야 하는지 메커니즘을 정리한 표준 명세

이미지 출처: https://velog.velcdn.com/images/wltn9169/post/1fccf7c4-2a69-4733-a4df-888bea705587/image.png

JDBC

  • JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접근할 수 있게 해주는 API
  • JDBC는 관계형 데이터베이스를 사용하기 위한 표준 인터페이스를 제공하며, SQL 쿼리를 실행하거나 결과를 검색하는 등의 데이터베이스 관련 작업을 수행할 수 있음
  • JPA의 메커니즘은 내부적으로 JDBC를 사용
  • 개발자가 직접 JDBC를 구현하면 SQL에 의존하게 되어 개발 효율성이 떨어지는 문제 발생
  • JPA는 개발자 대신 적절한 SQL을 생성하고 데이티ㅓ베이스를 조작해서 객체를 자동 매핑하는 역할 수행

JDBC를 사용한 DB 조작 코드 예시 (*뤼튼 AI가 생성한 코드이므로, 정확하지 않을 수 있습니다.)

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;

@Service
public class MyService {
    private final JdbcTemplate jdbcTemplate;

    public MyService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @PostConstruct
    public void createTable() {
        jdbcTemplate.execute("CREATE TABLE customers(id SERIAL, name VARCHAR(255))");
    }

    public void insertData() {
        jdbcTemplate.execute("INSERT INTO customers(name) VALUES ('John')");
    }

    public void fetchAllCustomers() {
        jdbcTemplate.query(
                "SELECT id, name FROM customers",
                (rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("name"))
        ).forEach(customer -> System.out.println(customer.toString()));
    }
}

JPA의 대표적인 구현체

  • 하이버네이트(Hibernate)
  • 이클립스 링크(EclipseLink)
  • 데이터 뉴클리어스(DataNucleus)

하이버네이트(Hibernate)

자바의 ORM 프레임워크로, JPA가 정의하는 인터페이스를 구현하고 있는 JPA 구현체중 하나

하이버네이트를 편하게 사용하도록 모듈화한 것이 Spring Data JPA

 

Spring Data JPA

  • JPA를 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나
  • CRUD 처리에 필요한 인터페이스를 제공하며, 하이버네이트의 엔티티 매니저(EntityManager)를 직접 다루지 않고 리포지토리를 정의해 사용하여 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작함

이미지 출처: https://velog.velcdn.com/images/tkrhdrhkdduf/post/a57b269f-82cd-48c5-9f5a-79ba6d936f7e/image.png

참고 자료

스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022