JPA 엔티티 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리하게 된다.
- JPA가 엔티티 객체를 생성할 때 기본 생성자를 이용하므로 기본 생성자(파라미터 없는 public 또는 protected 생성자)는 필수적으로 생성해줘야 한다.
- final 클래스, enum, interface, inner 클래스에는 사용하지 못 한다.
- 저장할 필드에 final 키워드는 사용하지 못 한다.
속성 | 기능 | 기본값 |
---|---|---|
name | JPA에서 사용할 Entity 이름을 지정한다. 같은 클래스 이름이 없으면 가급적 기본값을 사용한다. | 클래스 이름을 그대로 사용 |
@Table
- 엔티티와 매핑할 테이블을 지정한다.
속성 | 기능 | 기본값 |
---|---|---|
name | 매핑할 테이블 이름 | 엔티티 이름을 사용 |
catalog | catalog 기능이 있는 DB에서 catalog 매핑 | |
schema | schema 기능이 있는 DB에서 schema 매핑 | |
uniqueConstraints(DDL) | DDL 생성 시에 유니크 제약조건을 생성. 2개 이상의 복합 유니크 제약조건도 가능하다. |
DB 스키마 자동 생성
DDL을 애플리케이션 실행 시점에 자동 생성한다.
옵션 | 설명 |
---|---|
create | 기존 테이블 삭제 후 다시 생성 |
create-drop | create와 같으나 종료 시점에 테이블 삭제 |
update | 변경부분만 반영 |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음 |
spring.jpa.hibernate.ddl-auto: create
생성된 DDL은 개발 서버에서만 사용하고, 운영 서버에는 절대 create, create-drop, update 속성을 사용하면 안 된다.
기본 키 매핑
- 직접 할당 : @Id 애너테이션을 사용하여 값을 직접 할당한다.
- 자동 생성 : @GeneratedValue 애너테이션을 사용하여 DB에서 자동 생성한다. IDENTITY, SEQUENCE, TABLE 전략이 있다.
IDENTITY
기본 키 생성을 DB에 위임한다. MySQL, PostgreSQL, SQL Server, DB2에서 사용한다. IDENTITY 전략은 레코드가 저장된 후 식별자 값을 알 수 있다. 그래서 em.persist()
를 호출하는 즉시 INSERT를 실행한 후 DB에서 식별자를 조회한다.
트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
SEQUENCE
DB 시퀀스를 이용하여 기본 키를 생성한다. Oracle에서 사용한다. SEQUENCE 전략은 레코드 저장 전, 먼저 DB 시퀀스를 조회하여 엔티티에 할당 후 INSERT한다. 그래서 em.flush()
가 일어날 때 엔티티를 DB에 저장한다.
@Entity
@SequenceGenerator (
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initialValue = 1,
allocationSize = 1
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
TABLE
키 생성 테이블을 사용한다. 시퀀스를 지원하지 않는 DB에서 활용할 수 있다.
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "TB_SEQ",
pkColumnValue = "MEMBER_SEQ",
allocationSize = 1
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
AUTO
데이터베이스에 따라 위 세가지 전략 중 하나를 자동으로 선택한다. 오라클이라면 SEQUENCE, MySQL은 IDENTITY를 사용하게 된다.
@Id
@GeneratedValue
// or @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
필드와 컬럼 매핑
@Column
객체 필드를 테이블 컬럼에 매핑하는 역할
속성 | 설명 | 기본값 |
---|---|---|
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable, updatable | 등록, 변경 가능 여부 | TRUE |
nullable(DDL) | null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약 조건이 붙는다. | |
unique(DDL) | 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용한다. 두 컬럼 이상인 경우에는 @Table의 uniqueConstraint 속성을 사용한다. | |
length(DDL) | 문자 길이 제약 조건, String 타입에만 사용한다. | 255 |
precision, scale(DDL) | precision은 소수점을 포함한 전체 자릿수, scale은 소수의 자릿수. 아주 큰 숫자나 정밀한 소수를 다룰 때 사용한다. | precision : 19 scale : 2 |
@Enumerated
자바 enum 타입을 매핑할 때 사용한다. 기본값보다 EnumType.STRING
을 권장한다.
속성 | 설명 | 기본값 |
---|---|---|
value | EnumType.ORDINAL : enum 순서를 DB에 저장EnumType.STRING : enum 이름을 DB에 저장 |
EnumType.ORDINAL |
@Temporal
날짜 타입(java.util.Date, java.util.Calendar
)을 매핑할 때 사용한다. LocalDate, LocalDateTime을 사용할 경우에는 생략 가능하다.
속성 | 설명 |
---|---|
value | TemporalType.DATE : 날짜 DB date 타입과 매핑(2022-10-09)TemporalType.TIME : 시간, DB time 타입과 매핑(12:30:59)TemporalType.TIMESTAMP : 날짜와 시간, DB timestamp 타입과 매핑(2022-10-09 12:30:59) |
@Lob
DB의 BLOB, CLOB 타입과 매핑할 때 사용한다. 매핑하는 필드 타입이 문자면 CLOB, 나머지는 BLOB으로 지정한다.
@Transient
해당 애너테이션이 달린 필드는 DB에 저장 및 조회되지 않는다. 메모리 상에서만 임시로 어떤 값을 보관하고 싶을 때 사용한다.
Comments