Mysql에선 컬럼 타입에서 Enum 타입을 지원한다. Enum 타입은 지정된 값만을 넣을 수 있고 실제 값은 테이블외에 따로 저장되고 테이블에는 1byte을 이용하여 정수형 index로 저장한다. key,value형식으로 저장되고 key값을 테이블에 저장하는 것과 비슷하다 볼 수 있다.
@Entity
@Getter
public class Question {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long questionId;
@Enumerated(EnumType.STRING)
private AnswerStatus answerStatus;
@OneToOne(mappedBy = "question",cascade = CascadeType.ALL)
private Answer answer;
}
현 프로젝트에 Question 테이블과 답변 상태를 나타내는 AnswerStatus가 있다. AnswerStatus는 java에 enum 타입으로 되어있다.
public enum AnswerStatus {
Waiting, // 대기
Completed //완료
}
이를 테이블로 만들면 다음과 같은 쿼리가 생성된다.
create table question (
question_id bigint not null auto_increment,
answer_status enum ('Completed','Waiting'),
)
구현이 간편하고 지정한 값 외에 다른값을 넣지 못하므로 제약을 주는데에는 장점이 있다고 볼 수 있지만 단점도 존재한다.
enum은 테이블을 생성할때 만들어지므로 enum값을 수정하려면 테이블을 수정해야한다. 예를 들어 AnswerStatus 에 답변 실패라는 fail이라는 값을 넣을 상황이 생길 수도 있다.
enum은 모든 RDB에서 제공하는 일반적인 기능이 아니기에 다른 rdb로 마이그레이션 할 경우 문제가 생길 수 있다.
Enum의 기능을 대신하려면 AnswerStatus 라는 참조테이블을 만들고 아를 Question테이블에서 참조하면 된다. 이러면 데이터 수정도 테이블에 데이터만 넣으면 되고 다른 RDB에도 공통적으로 사용이 용이하다. 하지만 그만큼 테이블이 많이 생기므로 상황에 따라 맞게 사용해야 한다.