Spring Data JPA

띠로리·2024년 7월 30일

ORM (Object Relational Mapping)

JPA를 이해하기 위해 알아야 하는 개념이다.

간단히 말하자면 객체지향 패러다임을 관계형 데이터베이스에 보존하는 기술이다. 패러다임 입장에서 생각하면 '객체지향 패러다임을 관계형 패러다임으로 매핑해주는 개념'이라고 볼 수 있다.

ORM의 시작은 '객체지향'의 구조가 '관계형 데이터베이스'와 유사하다는 점에서 시작한다. 객체지향 언어 중에서 클래스(Class)를 사용하는 언어는 특히 그러하다.

관계형 데이터 베이스를 다루는 입장에서는 클래스는 아니지만 '테이블'을 설계한다. 새로운 테이블에 칼럼을 정의하고 칼럼에 맞는 데이터 타입을 지정해서 데이터를 보관하는 틀을 만든다는 의미에서 클래스와 상당히 유사하다.

이런 특징에 기초해서 객체지향을 자동으로 관계형 데이터베이스에 맞게 처리해 주는 기법에 대해서 아이디어를 내기 시작했고, 그것이 ORM의 시작이었다.

JPA (Java Persistence API)

Java 언어를 통해서 데이터베이스와 같은 영속 계층을 처리하고자 하는 '스펙'

JPA는 ORM을 Java 언어에 맞게 사용하는 스펙이다. 여러 프레임워크가 있지만 그중에서 가장 유명한 건 Hibernate이다.

Spring Data JPA와 JPa

스프링 부트는 JPA의 구현체 중에서 Hibernate라는 구현체를 이용한다. Hibernate는오픈소스로 ORM을 지원하는 프레임워크이다.

Hibernate는 단독으로 프로젝트에 적용이 가능한 독립된 프레임워크이다. 따라서 스프링 부트가 아닌 스프링만을 이용한다고 해도 Hibernate와 연동해서 JPA를 사용할 수 있다.

엔티티 클래스와 JpaRepository

Spring Data JPA가 개발에 필요한 것은 단지 두 종류의 코드만으로 가능하다.

  • JPA를 통해서 관리하는 객체를 위한 엔티티 클래스
  • 엔티티 객체들을 처리하는 기능을 가진 Repository
    이 중에서 Repository는 Spring Data JPA에서 제공하는 인터페이스로 설계하는데 스프링 내부에서 자동으로 객체를 생성하고 실행하는 구조라 개발자 입장에서는 단순히 인터페이스를 하나 정의하는 작업만으로 충분한다.
  1. @Entity
    엔티티 클래스는 Spring Data JAP에서는 반드시 어노테이션을 추가해야만 한다. 해당 클래스가 엔티티를 위한 클래스이며, 해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체라는 것을 의미한다.

  2. @Table
    데이터베이스상에서 엔티티 클래스를 어떠한 테이블로 생성할 것인지에 대한 정보를 담기 위한 어노테이션이다. 단순히 테이블의 이름뿐만 아니라 인덱스 등을 생성하는 설정도 가능하다.

  3. @Id, @GeneratedValue
    엔티티 어노테이션이 붙은 클래스는 PK에 해당하는 특정 필드를 @Id로 지정해야만 한다. @Id가 상요자가 입력하는 값을 사용하는 경우가 아니면 자동으로 생성되는 번호를 사용하기 위해 @GeneratedValue를 활용한다.
    `@GeneratedValue(strategy = GenerationType.IDENTITY) 부분은 PK를 자동으로 생성하고자 할 때 사용한다. (키 생성 전략)

  • AUTO(default) : JPA 구현체가 생성 방식을 결정
  • IDENTITY : 사용하는 데이터베이스가 키 생성을 결정 (auto increment 등 ..)
  • SEQUENCE : 데이터베이스의 시퀀스를 이용해서 키 생성. @SequenceGenerator와 같이 사용
  • TABLE : 키 생성 전용 테이블을 생성해서 키 생성. @TableGenerator와 함께 사용
  1. @Column
    추가적인 필드(칼럼)가 필요할 경우 사용하는 어노테이션. @Column을 이용해서 다양한 속성을 지정할 수 있다. 주로 nullable, name, length 등을 이용해서 데이터베이스의 칼럼에 필요한 정보를 제공한다.

JpaRepository 인터페이스

Spring Data JPA에는 여러 종류의 인터페이스의 기능을 통해서 JPA 관련 작업을 별도의 코드 없이 처리할 수 있게 지원한다. 예를 들어 CRUD 작업이나 페이징, 정렬 등의 처리도 인터페이스의 메서드를 호출하는 형태로 처리하는데 기능에 따라 상속 구조로 추가적인 기능을 제공한다.

일반적인 기능만을 사용할 때는 CrudRepository를 사용하는 것이 좋고, 모든 JPA관련 기능을 사용하고 싶을 때는 JpaRepository를 이용한다. 하지만 특별한 경우가 아니라면 JpaRepository를 이용하는 것이 가장 무난하다.

profile
차곡 차곡 기록 쌓기

0개의 댓글