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 |