@Entity와 @Id 어노테이션 사용해 테이블 정의하기
특정 클래스에 @Entity 어노테이션을 사용하면 테이블을 정의할 수 있다. 예를 들어 단어 정보를 저장하기 위한 Vocabulary 테이블을 정의한다고 해보자. 이런 테이블은 다음과 같이 정의될 수 있다.
@Entity
data class Vocabulary(
@Id
val id: String = UUID.randomUUID().toString(),
val word: String,
val meaning: String
)
이 테이블의 이름은 클래스의 이름과 같은 Vocabulary가 되며, 내부에는 아이디 id, 단어 word, 뜻 meaning 세가지 필드를 가진다. 테이블에는 꼭 Primary Key가 필요하기 때문에 id 변수 위에는 @Id 어노테이션을 붙여 이 필드가 Primary Key라는 것을 알려야 한다. 이렇게 만든 후 스프링 애플리케이션을 실행하면 다음과 같이 VOCABULARY 테이블과 내부에 선언된 ID, MEANING, WORD 컬럼을 확인할 수 있다.
여기서 중요한 것은 꼭 @Entity가 붙은 클래스가 있다면 테이블로 만들어지게 되기 때문에 @Id가 붙은 필드가 있어야 한다는 점이다. 만약 없다면 다음과 같이 Primary Key가 있어야 한다는 경고 문구가 나온다.
Persistent entity 'Vocabulary' should have primary key
영속성 엔티티인 Vocabulary는 Primary Key가 있어야 합니다.
이처럼 테이블을 만드는 것은 매우 간단하다.
이어서 이 Entity에 다양한 옵션을 적용하는 방법을 알아보자.
@Entity의 name 프로퍼티 설정해 테이블 이름 설정하기
@Entity의 name 프로퍼티를 사용하면 테이블의 이름을 커스텀하게 설정할 수 있다. 예를 들어 테이블의 이름을 Vocabulary가 아닌, Voca로 설정하고 싶다면 다음과 같이 name 프로퍼티를 "Voca"로 설정하면 된다.
@Entity(name = "Voca") // Entity명 지정도 가능
data class Vocabulary(
@Id
val id: String = UUID.randomUUID().toString(),
val word: String,
val meaning: String
)
그러면 다음과 같이 테이블의 이름이 VOCA로 변경되는 것을 볼 수 있다.
이렇게 테이블의 이름을 설정할 수도 있지만 JPA은 테이블의 정보를 더욱 세밀하게 지정할 수 있는 @Table 어노테이션을 지원한다. 이어서 이에 대해 알아보자.
@Table 어노테이션 사용해 테이블 정보 설정하기
@Table 어노테이션을 사용하면 테이블의 이름과, 어떤 필드에 인덱싱을 할지를 설정할 수 있다. 예를 들어 단어를 저장하는 테이블의 이름은 VocaTable이라 지정하고, word 컬럼에 인덱싱을 하고 싶다고 해보자. 그러면 다음과 같이 @Table 어노테이션을 설정하면 된다.
@Entity
@Table(name = "VocaTable", indexes = [Index(name = "idx_word", columnList = "word")])
data class Vocabulary(
@Id
val id: String = UUID.randomUUID().toString(),
val word: String,
val meaning: String
)
그러면 다음과 같이 VOCA_TABLE이라는 이름을 가진 테이블이 생성되고, IDX_WORD라 불리는 WORD를 인덱싱한 인덱스가 생성되는 것을 볼 수 있다.
이 외에도 schema, catalog, uniqueConstraints 같은 프로퍼티를 이 @Table 어노테이션을 사용해 설정할 수 있다.
지금까지 우리는 테이블의 속성을 설정하는 방법을 아아봤다. 이번에는 @Column 어노테이션 사용해 컬럼의 속성을 설정하는 방법을 알아보자.
@Column 어노테이션 사용해 컬럼의 속성 설정하기
@Column 어노테이션을 사용하면 컬럼의 속성을 설정할 수 있다. @Column 어노테이션을 통해서는 다음 속성들을 설정할 수 있다.
- name: 컬럼의 이름을 설정하는데 사용. 설정하지 않으면 필드의 이름이 컬럼의 이름으로 설정됨.
- unique: 현재 필드에 UNIQUE 제약을 걸지 여부를 결정. 기본 값은 false.
- nullable: 현재 필드가 NULL이 될 수 있는지 설정. 기본 값은 true.
- insertable: 엔티티 저장 시 해당 필드도 함께 저장할지 여부를 결정. 기본값은 true로 설정됨.
- updatable: 엔티티 수정 시 해당 필드도 함께 수정될지 여부를 결정. 기본값은 true로 설정됨.
- columnDefinition: 컬럼 정보를 직접 설정할 때 사용.
- table: 하나의 엔티티가 두 개 이상의 테이블에 매핑돼야 할 때 사용
- length: 컬럼의 최대 길이 설정. 기본 값은 255.
- precision: 소수점을 포함한 전체 자릿수 지정. 기본 값은 19.
- scale: 소수점 이하의 자리수 지정. 기본 값은 2.
예를 들어 MEANING 컬럼의 이름을 MEAN으로 지정하고 싶다면 다음과 같이 name="mean"을 사용하면 된다.
@Entity
data class Vocabulary(
@Id
val id: String = UUID.randomUUID().toString(),
val word: String,
@Column(name = "mean") // Column명 지정도 가능
val meaning: String
)
그러면 다음과 같이 meaning 필드의 컬럼명이 MEAN이 되는 것을 볼 수 있다.
전체 코드: GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.