엔티티 매핑

2023. 4. 27. 11:30JPA

반응형

JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다.

다양한 매핑 어노테이션에 대해 알아본다.

@Entity

 

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야한다.

속성
기능
기본값
name
JPA클래스에서 사용할 엔티티 이름을 지정한다.
설정하지 않으면 클래스 이름을 그대로 사용한다.

· final클래스, enum, interface, inner 클래스에는 사용할 수 없다.

· 저장할 필드에 final을 사용하면 안된다.

@Table

 

@Table은 엔티티와 매핑 할 테이블을 지정한다.

속성
기능
기본값
name
매핑할 테이블 이름
엔티티 이름을 사용한다.
catalog
catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다.
@Table(name = "TB_FRIEND", catalog = "world")
 
schema
schema기능이 있는 데이터베이스에서 schema를 매핑한다.
ex)
@Table(name = "TB_FRIEND", schema = "world")
 
uniqueConstraints(DDL)
DDL 생성시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들때만 사용된다.
ex)
@Table(uniqueConstraints={
@UniqueConstraint(columnNames = {"id_1" , "id_2"})})
cf) @Column(unique=true)
 

 

기본키 매핑

 

@Id 어노테이션만 사용해서 기본키를 애플리케이션에서 직접 할당하는 대신에 데이터베이스가 생성해주는 값을 사용하려면 어떻게 매핑해야할까?

예를 들어 오라클의 시퀀스 오브젝트라던가 MySQL의 AUTO_INCREMENT같은 기능을 사용해서 생성된 값을 기본키로 사용하려면 데이터베이스마다 기본 키를 생성하는 방식이 다르므로 이 문제를 해결하기 위해 JPA는 기본 키 생성 전략을 제공한다.

· 직접 할당: 기본 키를 애플리케이션에서 직접 할당한다.

· 자동 생성: 대리 키 사용 방식

- IDENTITY: 기본 키 생성을 데이터베이스에 위임한다.

- SEQUENCE: 데이터베이스의 시퀀스를 사용해서 기본 키를 할당한다.

- TABLE: 키 생성 테이블을 사용한다.

1. 기본 키 직접 할당 전략

@Id
@Column(name = "id")
private String id;

기본 키를 직접 할당하려면 다음 코드와 같이 @Id로 매핑하면 된다.

2. IDENTITY 전략

기본 키 생성을 데이터베이스에 위임하는 전략이다. 대표적으로 MySQL의 AUTO_INCREMENT 기능이 있다.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

 

3. SEQUENCE 전략

데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트이다.

@Entity
@SequenceGenerator(
   name = "BOARD_SEQ_GENERATOR" 
   sequenceName = "BOARD_SEQ" //매핑할 데이터베이스 시퀀스 이름
   initialValue = 1, allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}

우선 사용할 데이터베이스 시퀀스를 매핑해야 한다. @SequenceGenerator를 사용해서 BOARD_SEQ_GENERATOR라는 시퀀스 생성기를 등록했다.

그리고 sequenceName 속성 이름으로 BOARD_SEQ를 지정했는데 JPA는 이 시퀀스 생성기를 실제 데이터베이스의 BOARD_SEQ 시퀀스와 매핑한다.

매핑할 DDL은 다음과 같다.

create sequence [sequenceName] start with  [initialValue] increment by [allocationSize]

 

3. TABLE 전략

키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다.

TABLE 전략을 사용하려면 먼저 키 생성 용도로 사용할 테이블을 만들어야 한다.

create table MY_SEQUENCES (
   sequence_name varchar(255) not null,
   next_val bigint,
   primary key ( sequence_name )
}

sequence_name 컬럼을 시퀀스 이름으로 사용하고 next_val 컬럼을 시퀀스 값으로 사용한다.

@Entity
@SequenceGenerator(
   name = "BOARD_SEQ_GENERATOR" 
   table = "MY_SEQUENCES"
   pkColumnValue = "BOARD_SEQ", allocationSize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}

MY_SEQUENCES 테이블을 키 생성용 테이블로 매핑했다.

4. AUTO 전략

데이터베이스 방언에 따라 INDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다. 예를 들면 오라클을 선택하면 SEQUENCE를, MySQL을 선택하면 IDENTITY를 사용한다.

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

 

@Column

 

//null값의 허용여부를 설정 cf) @nonNull, @notNull, @Nullable, @notEmpty, @notBlank
@Column(nullable = false)
private String data;

//한 컬럼에 간단히 유니크 제약조건을 줄 때 사용 cf) uniqueConstraints
@Column(unique = true)
private String username;

//데이터베이스 컬럼 정보를 직접 줄 수 있다.
@Column(ColumnDefinition = "varchar(100) default 'EMPTY'")
private String data;

//문자 길이 제약조건. String에만 사용한다.
@Column(length = 100)
private String data;

 

@Enumerated

 

//자바의 enum타입을 매핑할 때 사용된다. cf) EnumType.ORDINAL --> 대응되는 순서를 저장(0, 1, 2..)
@Enumerated(EnumType.STRING)
private RoleType roleType;

 

@Temporal

 

날짜 타입을 매핑할 때 사용된다.

@Temporal(TemporalType.DATE)
private Date date; //날짜

@Temporal(TemporalType.TIME)
private Date time; //시간

@Temporal(TemporalType.TIMESTAMP)
private Date timestamp //날짜와 시간

 

@Lob

데이터베이스 BLOB, CLOB 타입과 매핑한다.

@Lob
private String lobString;

 

@Transient

 

이 필드는 매핑하지 않는다. 따라서 데이터베이스에 저장하지 않고 조회하지도 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.

@Transient
private Integer temp;
반응형

'JPA' 카테고리의 다른 글

다양한 연관관계 매핑 (1)  (0) 2023.04.27
연관관계 매핑 기초  (0) 2023.04.27
영속성 관리 (2)  (0) 2023.04.27
영속성 관리 (1)  (0) 2023.04.27
JPA 시작  (0) 2023.04.27