실제로 필자가 프로젝트에서 사용했던 코드를 바탕으로 엔티티 매핑 방식을 알아보자.
@Table(name = "education_content")
@Entity
public class EducationContent {
@Id
@Column(name = "content_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long contentId;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String contents;
@ManyToOne
@JoinColumn(name = "menu_id", referencedColumnName = "menu_id")
Menu menu;
@OneToMany(mappedBy = "educationContent")
List<Issue> issueList = new ArrayList<>();
...
}
위의 엔티티는 education_content
라는 테이블에 매핑된다.
@Entity
어노테이션을 클래스에 붙여야 한다.DDL(Data Definition Language)은 애플리키에션 실행 시점에 자동으로 생성된다.
즉, 테이블 생성 쿼리는 실행 시점에 자동으로 생성된다.
@Column
어노테이션을 사용해서 제약조건을 추가할 수 있다.@Column(nullable = false, length = 10)
@Table
어노테이션의 옵션을 통해 유니크 제약조건을 추가할 수 있다.어노테이션 | 기능 |
---|---|
@Column | 컬럼 매핑 |
@Temporal | 날짜 타입 매핑 - java8에서는 생략 가능(LocalDate, LocalDateTime 타입 사용) |
@Enumerated | enum 타입 매핑 |
@Lob | BLOB, CLOB 매핑 |
@Transient | 특정 필드를 컬럼에 매핑하지 않음 |
@Column
에는 다양한 속성이 존재한다.
name
: 필드명과 DB 컬럼명을 다르게 설정updatable
: update 쿼리가 나갈 때 해당 컬럼을 반영할 것인지 여부nullable
: NULL 값이 들어가도 되는지 여부length
: 문자 길이 제약 조건@Enumerated
에는 단 두가지 속성만 존재한다.
DB에는 Enumerate Type이 없음에 주의해야 한다!
EnumType.ORDINAL
: enum 순서를 DB에 저장 - 기본값EnumType.STRING
: enum 이름을 DB에 저장⚠️ EnumType.ORDINAL
속성을 사용하면 안된다!!
새로운 Enum Type이 추가될 수 있기 때문에, 순서가 변경될 가능성이 있다.
기본키를 매핑할 때는 @Id
어노테이션을 사용한다.
코드를 살펴보자.
@Table(name = "education_content")
@Entity
public class EducationContent {
@Id
@Column(name = "content_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long contentId;
...
}
기본키를 매핑할 때, @GeneratedValue
라는 어노테이션을 사용할 수 있다.
@GeneratedValue
: 기본키를 직접 할당하지 않고 자동으로 생성되도록 만드는 어노테이션
자동 생성 전략은 총 4가지가 존재한다.
기본키 생성을 DB에 위임한다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long contentId;
이 전략을 사용하면, em.persist()
시점에 즉시 INSERT 쿼리를 실행한다.
➜ 그래야 기본키를 알 수 있기 때문이다.
DB 시퀀스 오브젝트를 사용해서 기본키를 자동 생성한다.
@Entity
@SequenceGenerator(
name = "EDUCATION_SEQ_GEN",
sequenceName = "EDUCATION_SEQ",
initalValue = 1,
allocationSize = 1
)
public class EducationContent {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE
generator = "EDUCATION_SEQ_GEN)
Long contentId;
...
}
em.persist()
시점에 DB 시퀀스를 사용해서 식별자를 조회한다.
⚠️ allocationSize의 기본값은 50이기 때문에, DB 시퀀스가 하나씩 증가하도록 설정되어 있다면 allocationSize 값도 1로 맞춰줘야 한다.
키 생성용 테이블을 사용한다.
방언에 따라 위의 3가지 방법 중 하나를 자동으로 지정한다.