[JPA] JPA

Bam·2025년 5월 13일
0

Spring

목록 보기
50/73
post-thumbnail

JPA

JPA (Java Persistence API)는 자바 객체와 데이터베이스 테이블을 매핑(ORM)하기 위한 기능들을 제공하는 기능입니다.

ORMObject-Relational Mapping을 뜻하는 단어로 '객체와 테이블(릴레이션)을 매핑`한다라는 의미입니다.

JPA를 사용하면 SQL에 의존하지 않고 객체지향 프로그래밍 모델을 제공하여 DAO(Data Access Object), JDBC 코드를 작성하는데 드는 시간을 줄여줍니다.

순수 JDBC를 사용해서 데이터베이스를 조작하는 경우 이 포스트에서 볼 수 있듯이 JDBC 연결 준비, 연결 해제, SQL, 예외 처리까지 많은 작업들이 반복 수행됨을 볼 수 있습니다. JPA를 사용하면 이런 반복 작업들을 줄일 수 있습니다.

주 구성 요소

JPA의 주 구성 요소엔 다음과 같은 것들이 있습니다.

  • Entity
    데이터베이스 테이블에 매핑되는 자바 객체

  • Persistence Unit
    persistence.xml 또는 Spring Boot 자동 설정으로(application.ymlspring.jpa.*) 정의

  • Entity Manager
    엔티티의 CRUD를 담당하는 인터페이스

  • Persistence Context
    엔티티를 관리하는 1차 캐시

  • Transaction
    엔티티 매핑 작업의 원자성 보장

장점

JPA를 사용했을 때의 장점은 다음과 같습니다.

  • 단순 CRUD SQL이나 JDBC API 작성을 대신 처리해주어 생산성이 향상된다.
  • JPA가 대신 처리해주는 코드가 많은 만큼 유지보수시 수정해야하는 코드가 줄어든다.
  • 상속, 연관관계, 객체 그래프 탐색, 비교 등과 같은 RDBMS와 자바 간의 패러다임 불일치를 해결해준다.
  • 어플리케이션과 데이터베이스 사이에서 동작하여 성능 최적화 가능성이 생긴다.
  • Dialect(방언)라는 추상화된 인터페이스를 제공하여 특정 RDBMS에 종속되지 않게 만들어준다.
  • 자바의 ORM 기술 표준이다.

주요 어노테이션과 객체 매핑

CREATE TABLE users (
	id PRIMARY KEY NOT NULL,
    name VARCHAR(255) NOT NULL,
    age INT
);

위와 같은 DB 테이블을 JPA를 사용해서 자바 객체 매핑을 하면 다음과 같습니다.

@Entity
@Table(name = "users")
public Class User {
	@Id
    @GenerateValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    
    @Column(length = 255, nullable = false)
    String name;
    
    int age;
}

위 코드에서 사용된 어노테이션들이 JPA가 제공하는 매핑 어노테이션들입니다.

  • @Entity
    자바 클래스가 테이블과 매핑됨을 JPA에게 알립니다. @Entity가 붙은 클래스를 엔티티 클래스라고 부르기도 합니다.

  • @Table
    엔티티 클래스에 매핑할 테이블에 대한 정보를 알리는 어노테이션입니다.
    이 예시에서는 name 속성을 통해 엔티티 클래스와 매핑할 테이블의 이름을 지정했습니다. 따로 지정하지 않는 경우에는 클래스 이름(엔티티 이름)을 테이블 이름으로 매핑합니다.

  • @Id
    엔티티 클래스의 필드를 테이블의 기본키 Primary Key에 매핑합니다.

  • @GenerateValue
    기본키를 자동 생성해주는 어노테이션입니다. 여기서 사용된 GenerationType.IDENTITY은 RDBMS에 키 생성 방식을 알아서 하라고 위임하는 방식입니다.

  • @Column
    필드를 특정 컬럼에 매핑합니다.
    name 속성을 사용해서 특정 필드에 매핑할 수도 있고, name을 지정하지 않으면 필드 이름과 일치하는 컬럼에 매핑됩니다.
    추가적으로 nullable, length 등과 같은 속성을 통해 컬럼에 제약 조건을 넣을 수 있습니다.

int age처럼 따로 매핑 어노테이션을 넣지 않은 필드는 필드명을 사용해서 컬럼과 매핑합니다.

데이터베이스 방언

JPA는 특정 RDBMS에 종속된 기술이 아니어서 설정 정보만 바꾼다면 데이터베이스를 쉽게 교체할 수 있습니다.

문제는 각 데이터베이스 시스템이 사용하는 SQL 문법 등이 조금씩 다릅니다. 이렇게 표준을 따르지 않는 고유의 데이터베이스 기능을 JPA는 방언 Dialect라고 부릅니다.

그래서 JPA에서 데이터베이스를 교체하는 경우에는 코드를 수정할 필요없이 설정 파일(persistence.xml or application.yml)의 데이터베이스 방언만 수정하면 됩니다.

JPQL

JPA는 엔티티 매니저가 find, set과 같은 메소드를 제공함으로써 간단한(쿼리 변형이 필요없는 기본적인) SQL은 자동으로 쿼리를 생성하고 수행합니다.

그러나 검색 조건 등의 포함되는 쿼리의 경우에는 SQL을 작성해서 실행해야하는데, 이때 SQL을 사용하는 것이 아니라 JPQL이라는 SQL을 추상화한 쿼리 언어를 사용해서 쿼리를 작성하게 됩니다. SQL을 추상화 했기 때문에 표준 SQL 문법과 유사하게 사용할 수 있습니다.

중요한 점은 JPQL은 엔티티 객체를 대상으로 쿼리를 수행한다는 점입니다.

JPQL의 문법에 대해서는 나중에 더 자세히 다루려고 합니다.

0개의 댓글