스프링 부트(Spring Boot) ORM 및 JPA

유필선·2024년 6월 30일
1

스프링 부트

목록 보기
3/4

ORM(Object-Relational Mapping)

ORM

- 객체와 관계형 데이터베이스의 데이터를 매핑하여 '객체 지향적인 코드'를 작성 가능하게 하는 기술을 의미

  • ORM을 사용하면 개발자는 SQL 쿼리를 직접 작성하는 대신, 자바 객체를 사용하여 데이터베이스의 레코드를 쉽게 생성, 조회, 수정, 삭제할 수 있다. 이로 인해 개발 과정이 단순화되고, 코드의 가독성이 향상 된다.
  • 데이터베이스와 애플레케이션 코드 간의 중간 계층 역할을 하여, 데이터베이스의 구조가 변경되더라도 애플리케이션 코드를 수정하지 않아도 된다. 이는 유지보수 과정을 간소화 시키며, 개발 효율성을 높일 수 있다.

- ORM 참고 예시

  • 아래의 tb-user라는 관계형 데이터베이스의 테이블 및 컬럼이 존재한다. 해당 컬럼과 아래의 Java 소스코드의 객체와 매핑이 된다.
  • 해당 매핑을 통해 Java 객체를 하나의 테이블 컬럼으로 조회, 수정, 삭제할 수 있다.

테이블 컬럼과 매핑된 객체를 아래와 같이 표현합니다.

import lombok.AccessLevel;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.persistence.*;

/**
 * tb_user 테이블과 매핑 객체
 *
 * @author : jonghoon
 * @fileName : UserEntity
 * @since : 2/8/24
 */
@ToString
@Entity
@Table(name = "tb_user")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_sq")
    private int userSq;

    @Column(name = "user_id")
    private String userId;

    // 사용자 패스워드
    @Column(name = "user_pw")
    private String userPw;

    // 사용자 이름
    @Column(name = "user_nm")
    private String userNm;

    // 사용자 상태
    @Column(name = "user_st")
    private String userSt;

    @Column(name = "user_email")
    private String userEmail;

    @Builder(toBuilder = true)
    public UserEntity(int userSq, String userId, String userPw, String userNm, String userSt, String userEmail) {
        this.userSq = userSq;
        this.userId = userId;
        this.userPw = userPw;
        this.userNm = userNm;
        this.userSt = userSt;
        this.userEmail = userEmail;
    }
}

Spring Boot Data JPA(Java Persistence API)

- 데이터베이스를 쉽게 다루기 위한 '데이터 액세스 기술'로 ORM 기법을 사용하여 자바 애플리케이션에서 사용하는 객체와 관계형 데이터베이 사이의 매핑을 관리하는 ORM 기술에 대한 API 표준 명세서(인터페이스)를 의미한다.

  • 이 API를 사용하여 개발자가 직접적인 SQL을 작성하지 않고도 데이터베이스에서 데이터를 저장, 업데이트, 삭제, 조회하는 등의 작업을 수행할 수 있게 해준다.
  • JPA는 표준화된 API를 제공함으로써, 다양한 ORM 프레임워크(예: Hibernate, EclipseLink, OpenJPA 등)와의 호환성을 보장합니다. 이로 인해 개발자는 특정 ORM 프레임워크에 종속되지 않고 필요에 따라 다른 프레임워크로 쉽게 전환할 수 있습니다.

퍼시스턴스 프레임워크(Persistence Framework)

  • 데이터의 저장, 복원, 쿼리, 업테이트등의 작업을 자동화해주는 소프트웨어 라이브러리이다.
  • 이를 사용하면 개발자는 데이터베이스에 대한 복잡한 코드를 작성하지 않아도 되며 이로 인해 개발시간을 단축하고 코드의 품질을 향상할 수 있다.
  • 대표적인 퍼시스턴스 프레임워크로는 Hibernate, MyBatis 등이 있다.

JPA 인터페이스 구조

  • JpaRepository를 사용하면 상속받고 있는 PagingAndSortingRepository, CRUDRepository, Repository 인터페이스를 사용할 수 있다.
  • PagingAndSortingRepository를 사용하면 상속받고 있는 CRUDRepository, Repository 인터페이스를 사용할 수 있다.
  • CRUDRepository를 사용하면 상속 받고 있는 Repository 인터페이스를 사용할 수 있다.

즉, JpaRepository > PagingAndSortingRepository > CRUDRepository > Repository 라고 생각하면 알기 쉽다.

Repository<T, ID>

  • 데이터 접근 계층(DAO)을 쉽고 간결하게 구현할 수 있는 Spring Data JPA의 핵심 구성 요소이다. 이 인터페이스를 이용하면 개발자는 CRUD(Create, Read, Update, Delete) 연산을 위한 기본적인 메서드를 직접 구현할 필요 없이 공통적으로 사용되는 데이터 접근 로직을 제공받을 수 있습니다.

예를 들어, UserRepository라는 인터페이스가 Repository를 상속하고, 이 인터페이스 안에 findByUsername(String username)이라는 메서드를 정의하면, Spring Data JPA는 "SELECT * FROM User WHERE username =?"라는 SQL 쿼리를 자동으로 생성하고 실행합니다.

CRUDRepository <T, ID>

- Spring Data JPA에서 제공하는 인터페이스로 기본적인 CRUD 작업에 필요한 많은 메서드를 미리 정의해 놓고 있다.

  • 이를 상속받아 사용하면 개발자는 별도의 기본적인 데이터 액세스 로직을 작성하지 않고도 데이터베이스에서 데이터를 읽고쓰는 작업을 수행할 수 있다.

    주요 메서드는 save(), findOne(), findAll(), count(), delete() 등이 있습니다.

PagingAndSortingRepository <T, ID>

- Spring Data Repository의 하나로, 페이징 및 정렬 기능을 제공합니다. 이 인터페이스를 사용하면 개발자는 페이징 및 정렬 기능이 포함된 CRUD 작업을 수행할 수 있다.

JpaRepository와 같은 다른 Spring Data Repository와 달리, 특정 도메인 클래스에 대한 추가 쿼리 메서드를 제공하지 않습니다.

JpaRepository <T, ID>

- Spring Data JPA에서 제공하는 인터페이스로, 개발자가 JPA를 더 쉽게 사용할 수 있도록 도와줍니다.

  • JpaRepository를 상속받는 인터페이스를 만들면, 개발자는 별도의 구현 없이도 기본적인 CRUD 작업을 수행할 수 있는 여러 메서드를 사용할 수 있다.
  • 이는 Spring Data JPA가 제공하는 프록시 기반의 기술을 활용하여 가능하다. 이외에도, JpaRepository는 페이징과 정렬, 플러시 등의 JPA의 고급 기능을 쉽게 사용할 수 있도록 지원한다.

PagingAndSortingRepository, CRUDRepository 의 기능을 가지고 있다.

JPA(JapaPersistence API 구현체 - Hibernate

Hibernate

- JPA(Java Persistence API)의 API 표준 명세서(인터페이스)를 구현한 구현체 중 하나로 JPA 표준을 따르면서 자체적인 기능을 제공하는 ORM 프레임워크이다.

  • 데이터베이스와 개겣 지향 프로그래밍 사이의 호환성 문제를 해결하기 위해 설계되었다. 자바 객체를 데이터베이스 테이블에 매핑하기 위해 JDBC를 사용한다.
  • 데이터베이스의 테이블을 Java 클래스로 매핑하고, 테이블의 레코드를 클래스의 인스턴스로 매핑함으로써 이를 가능하게 한다. 이러한 매핑을 통해 개발자는 SLQ 쿼리 없이도 데이터베이스에서 데이터를 읽고 쓸 수 있다.
    Spring Boot JPA를 설치하면 Hibernate 라이브러리가 포함되어 있다. 또한 Hibernate를 사용하면 HQL, JPQL, Criteria API를 사용이 가능하다. (HQL → JPQL → Criteria API 순으로 나왔다.)

출처 : [Java/JPA] Spring Boot Data JPA 이해하기 -1: ORM, JPA, Hibernate, QueryDSL 이론

profile
이해해버려라!

0개의 댓글