질문, 피드백 등 모든 댓글 환영합니다.
JPA는 어노테이션을 기반으로 객체와 테이블을 매핑할 수 있습니다.
이 때 테이블과 매핑되는 객체를 Entity
라고 합니다.
객체와 테이블을 매핑하는 어노테이션을 정하겠습니다.
@Entity
를 적용한 클래스를 엔티티로 등록합니다. (필수로 지정해야 합니다.)
Enum
, Interface
, Final class
, Inner class(중첩 클래스)
에는 사용이 불가능합니다.
또한 저장할 필드는 final을 사용할 수 없으며 public
, protected
기본 생성자를 필수로 가져야 합니다. (프록시 등의 기능을 위해)
@Entity
은 name
속성을 가지는데 사용할 엔티티의 이름을 지정할 수 있습니다. (기본 값은 클래스의 이름)
다른 패키지에 같은 이름을 사용하는 클래스를 같이 엔티티에 등록해야 할 경우 name
으로 이름을 지정하여 사용합니다.
@Entity
public class User {
}
@Table
는 @Entity
가 적용된 클래스에 사용하여 엔티티와 매핑할 테이블에 관한 정보를 세부적으로 설정할 수 있습니다.
@Entity
@Table(name = "USER")
public class User {
}
name : 엔티티와 매핑할 테이블 이름 지정 (기본 값으로 엔티티 이름 사용)
catalog : 데이터베이스 catalog 매핑
schema : 데이터베이스 schema 매핑
uniqueConstraints : DDL 생성 시 유니크 제약 조건 생성
@Colunm
으로 테이블의 colunm에 관한 정보를 세부적으로 설정할 수 있습니다.
엔티티의 필드에 @Colunm
을 사용하지 않아도 기본으로 테이블의 컬럼과 매핑됩니다.
@Entity
public class User {
@Colunm(name = "username")
private String name;
}
name : 엔티티의 필드와 매핑할 테이블의 컬럼명 지정 (기본 값으로 객체의 필드명 사용)
insertable, updatable : 등록, 변경 가능 여부 (기본 값으로 TRUE 사용)
nullable : false로 설정하면 DDL 생성 시에 해당 필드 not null 적용
unique : 해당 컬럼에 유니크 제약 조건 생성
columnDefinition : 컬럼 정보 직접 지정 ex)varchar(100) default ‘EMPTY'
length : 문자 길이 제약조건 (기본 값 255)
precision, scale : BigDecimal 타입에서 사용(BigInteger도 사용 가능)
precision로 소수점을 포함한 전체 자릿 수를, scale로 소수의 자릿 수 지정,
double, float 타입에는 적용 불가 (기본 값 precision=19, scale=2)
@Enumerated
로 자바 enum 타입을 컬럼으로 매핑합니다.
속성으로 value를 가지는데 EnumType.ORDINAL
와 EnumType.STRING
을 사용할 수 있고 기본 값으론 EnumType.ORDINAL
을 사용합니다.
@Entity
public class User {
@Enumerated(EnumType.STRING)
private Grade grade; // enum 타입
}
EnumType.ORDINAL : enum의 순서를 DB에 저장
EnumType.STRING: enum 이름을 데이터베이스에 저장
@Enumerated
사용 시 꼭 EnumType.STRING
을 사용합니다. EnumType.ORDINAL
을 사용하게 되면 후에 enum 값을 수정 하여 순서가 변경되어도 DB에는 변경 된 순서가 적용이 되지 않아 혼란이 생길 수 있습니다.
@Transient
가 적용된 필드는 매핑하지 않습니다.
DB에 저장하지 않고 애플리케이션 메모리에서만 사용하는 필드일 경우 사용합니다.
PK는 @Id
로 지정할 수 있습니다.
@Id
를 단독으로 사용하면 엔티티를 DB에 저장할 때 Id 값을 직접 지정을 해야합니다.
@GeneratedValue
를 사용하면 Id 값 생성을 JPA가 자동으로 처리해줍니다.
4가지 전략을 사용할 수 있으며 기본 값은 GenerationType.AUTO
입니다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
}
IDENTITY : 기본 키 생성을 DB에 위임합니다. (MySQL의 AUTO_ INCREMENT) IDENTITY
전략을 사용할 경우 persist()
시점에 쓰기 지연을 하지 않고 바로 SQL을 실행합니다. (Id 값을 DB에서 생성하므로 쓰기 지연 시 Id 값을 알 수 없기 때문)
SEQUENCE : 유일한 값을 생성하는 DB 오브젝트를 이용 (오라클 DB의 시퀀스) @SequenceGenerator
와 함께 사용합니다. (클래스에 적용)
@SequenceGenerator
의 속성TABLE : 키 생성 전용 테이블로 Id 값 생성, @TableGenerator
와 함께 사용합니다. (클래스에 적용)
AUTO : DB 방언에 따라 자동 지정