Java

[JPA(Jakarta Persistence API)] 엔티티 매핑

ride-dev 2024. 3. 12. 16:55

엔티티 매핑은 JPA(Jakarta Persistence API)를 이해하기 위해 알아야하는 개념중 하나입니다.

JPA(Jakarta Persistence API)에서 객체와 관계형 데이터베이스를 매핑하여 사용합니다.

엔티티 매핑

@Entity @Table // 객체와 테이블 매핑
@Column // 필드와 컬럼 매핑
@Id // 기본 키 매핑
@ManyToOne @JoinColumn // 연관관계 매핑

@Entity

JPA가 관리할 클래스에 사용하는 어노테이션으로 테이블과 매핑할 클래스에 사용합니다.

접근 제한자를 public이나 protect로 가진 기본 생성자가 필요합니다.

필드에 final을 사용하면 안됩니다.

final, enum, interface, inner 클래스를 사용하면 안됩니다.

(데이터를 동적으로 처리하기 때문입니다)

@Table

엔티티와 매핑할 테이블을 지정합니다.

기본값으로는 엔티티 이름을 사용하지만,

DB 타입에 따라 엔티티 이름이 예약어일 수 있기 때문에 @Table을 통해 테이블 이름을 지정하기도 합니다.

@Entity
@Table(name = "MEMBERS")
public class Member {

유니크 제약조건을 추가할 수도 있습니다.

@Table(uniqueConstraints = {@UniqueContranints(name = "NAME_EMAIL_UNIQUE", columnNames ={"NAME", "EMAIL"})})

DB 스키마 자동 생성

application.properties와 같은 구성관리 파일에서 설정할 수 있습니다.

@Entity를 통해 매핑된 클래스를 기반으로 Table을 생성할 DDL을 자동으로 작성할 수 있습니다.

 

DDL을 애플리케이션 실행 시점에 자동으로 생성하거나 업데이트할 수 있습니다.

Dialect설정을 통해 DB 타입에 따라 적절한 DDL을 생성합니다.(MySQL, MariaDB, PostgreSQL 등)

 

create를 통해 생성하거나, update를 통해 변경 사항을 반영할 수 있고,

create-drop으로 애플리케이션 종료 시점에 테이블을 DROP할 수 있습니다.

validate를 통해 엔티티와 테이블이 정상적으로 매핑되었는지 확인할 수 있습니다.

none 으로 자동생성을 비활성화할 수 있습니다.

 

보통,

개발 초기에는 create나 update를 사용하고,

테스트 서버에는 update나 validate를,

스테이징 및 운영서버에는 validate나 none을 사용합니다.

 

DDL 자동 생성 시 @Column을 사용하여 Entity 필드를 DB 테이블의 Column과 매핑하고,

DB 컬럼의 제약조건, 컬럼 이름을 설정할 수 있습니다.

@Entity
public class Member{
    @Column(name = "member_name", nullable = false, length = 10)
    private String name;
    @Column(unique = true)
    private String email;
}

 

위와 같은 DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고,

JPA(Jakarta Persistence API)의 실행 로직에는 영향을 주지 않습니다.

필드와 컬럼 매핑

@Entity
public class Member{
    @Id
    private Long id;
    @Column(name = "member_name")
    private String name;
    @Column(unique = true) // 이름이 랜덤으로 설정되고, 복합으로 설정되지 않기에 잘 사용X
    private String email;
    @Enumerated(EnumType.STRING) // ORDINAL으로 설정하면 Enum에 선언한 유형의 순서를 저장(Integer)
    private Role role;
    @Temporal(TemporalType.TIMESTAMP) // java8 이상이면 필드를 LocalDate나 LocalDateTime로 가능
    private Date createdDate;
    @Lob
    private String description; //String 이면 CLOB으로(char[]), 나머지는 BLOB으로(byte[]) 매핑
    @Transient
    private String temp;
}

String, Integer Date와 같은 필드 타입을 설정할 수 있습니다.

Enum을 필드로 설정할 수 있고, DB에 저장할 Type을 설정할 수 있습니다.

날짜 타입 또한 마찬가지로 @Temporal을 통해 설정할 수 있습니다.

@Lob을 통해 VARCHAR보다 큰 데이터 유형을 사용하도록 설정할 수도 있습니다.

 

@Transient를 통해 필드를 DB에 매핑하지 않도록 설정할 수 있습니다.

(메모리상에서 값을 임시로 보관할 때 사용)

기본 키 매핑

기본 키 매핑에는 주로 @Id 와 @GeneratedValue 가 있습니다.

필드에 @Id를 사용하여 테이블의 기본키를 매핑합니다.

@Id만 사용하여 기본 키 필드의 데이터를 직접 할당할 수 있으며,

@GeneratedValue를 추가하여 기본 키에 들어갈 데이터를 자동 생성할 수 있고,

여러 전략을 사용할 수 있습니다.

 

시퀀스를 생성하여 사용하는 전략,

시퀀스용 테이블을 생성하는 전략,

시퀀스를 사용할 때 allocation size를 설정하여 DB로 부터 시퀀스 값을 최초로 받아오고,

이후는 메모리에서 설정하도록 할 수 있습니다(시퀀스 값을 받아오기 위한 DB 연결 횟수를 줄일 수 있습니다).

IDENTITY전략(기본 키 생성을 DB에 위임- auto increment, db insert 실행 후 id값을 확인할 수 있음, 모아서 요청하는 것 불가능) 등이 있습니다.

728x90