@Entity
가 붙은 클래스는 JPA에서 관리하며, 이를 Entity라고 합니다.
Entity의 경우 public, protected의 기본 생성자 필수이며, 필드에 final을 사용하면 안됩니다.
@Table
은 엔티티와 매핑할 테이블 지정합니다.name
속성으로 매핑할 테이블 이름을 지정하고, 기본 값은 Entity 이름입니다. 이 외에도 catalog
, schema
, uniqueConstraints
등의 옵션이 있습니다.uniqueContraints
DDL 생성 시에 유니크 제약 조건이 생성됩니다.
@Table(
uniqueConstraints = {
@UniqueConstraints(
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"}
)
})
JPA는 DB 스키마 자동 생성 옵션이 있습니다. 데이터베이스 방언 DB Dialect를 활용해서 애플리케이션 실행 시점에 DDL을 자동으로 생성해줍니다. 개발 장비에서 주로 사용되며 운영 서버에서는 지양해야합니다.
속성 (spring.jpa.hibernate.ddl.auto)
실제 운영 장비에는 절대 create
, create-drop
, update
사용하면 안된다.
Entity의 Field와 DB Table의 Column을 매핑하는 어노테이션과 속성이 있습니다.
매핑 어노테이션 정리
@Column 속성 정리
속성 | 설명 | 기본값 |
---|---|---|
name | 필드와 매핑할 테이블의 칼럼 이름 | 객체의 필드 이름 |
insertable / updatable | 등록 / 변경 가능 여부 | TRUE |
nullable (DDL) | null의 허용 여부를 설정한다. | TRUE |
unique (DDL) | 하나의 Column에 unique 제약 조건을 설정한다. | |
columnDefinition (DDL) | DB Column 정보를 직접 설정한다. (ex."varchar(100) default 'EMPTY'") | |
length (DDL) | String 타입의 문자 길이 제약 조건 설정 | 255 |
precision / scale (DDL) | BigDecimal 타입에서 숫자 표현 정도 설정 | presision = 19, scale = 2 |
@Enumerated
enum 타입을 매핑할 때 사용합니다. EnumType.STRING
을 사용해야 합니다.
속성 | 설명 | 기본값 |
---|---|---|
value | EnumType.ORDINAL: enum 순서를 DB에 저장 (ex. 0, 1, 2, 3) EnumType.STRING: enum 이름을 DB에 저장 | EnumType.ORDINAL |
@Lob
매핑하는 필드 타입이 String 이면 CLOB 매핑, Byte이면 BLOB 으로 매핑됩니다.
@Transient
데이터베이스에 저장되지 않고 메모리 상에서만 임시로 보관하는 매핑하지 않을 Field에 사용합니다.
Entity의 기본 키를 매핑할 때, @Id / @GeneratedValue 어노테이션을 사용합니다.
@Id
@GeneratedValue(strategy = GenreationType.Identity)
private Long id;
기본 키 매핑 방법
@Id
만 사용@GeneratedValue
기본 키(Primary Key) 생성 전략
1. IDENTITY : 데이터베이스에 위임, MySQL
2. SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE
3. TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용
4. AUTO : 방언에 따라 자동 지정, 기본값
IDENTITY 전략
기본 키 생성을 데이터베이스에 위임하는 전략입니다.
주로 MySQL, PostgreSQL 서버에서 사용합니다. (ex. MySQL의 AUTO_ INCREMENT)
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
예외적으로 Identity 전략으로 설정된 Entity의 경우, persist()
메서드가 호출될 때 SQL을 보내 Key를 받아 1차 캐시에 저장합니다.
SEQUENCE 전략
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트입니다. Oracle, PostgreSQL, DB2, H2 데이터베이스에서 사용합니다. 성능 상의 이슈로 allocationSize
(호출 한 번에 증가하는 수)는 50 혹은 100으로 정해서 사용합니다.
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 50)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
private Long id;
}
TABLE 전략
키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략입니다. 성능은 좋지 않으나 모든 데이터베이스에 적용 가능합니다.
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
회원 상품 주문 실습 예제
https://github.com/kimdoha/spring-playground/tree/feat/3.jpa-entity-mapping
도메인 모델 분석