@Entity
@Table(name = "member")
@Getter
@Setter
@EqualsAndHashCode(of = "memberId", callSuper = true)
public class MemberJpaEntity extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id", nullable = false)
private Long memberId;
...
@Column(name = "role", nullable = false)
@Enumerated(EnumType.STRING)
private RoleType role;
...
}
위와 같이 Entity
를 작성할 때 Enum
으로 정의한 타입이 있다면 @Enumerated
를 통해 타입 검증을 해서 DB에 String 값이 들어갈 수 있다.
@Enumerated
를 붙이면 입력을 할 때 Enum
값에 대한 검증이 되서 이상한 값이 안들어가게 도움을 준다.
그런데 이 부분이 반대로 문제가 될 수 있는 여지도 있다.
만약 Enum
에 작성한 특정 타입 등을 삭제할 요건이 발생하면, Enum
에 있는 값만 제거한다고 요건을 만족 시킬 수가 없다. Enum
에 있는 값만 삭제한 후 DB 를 조회해오게 되면 DB에 있는 값에 매핑되는 Enum
값이 없기 때문에 에러가 발생하게 된다.
이를 막기 위해선 Enum
값을 제거할 때 DB에 있는 해당 타입 값을 모두 제거해줘야한다. 특정 테이블 하나에만 관련된 데이터라면 그나마 낫겠지만 상용 환경에서는 여러 테이블, 여러 군데서 이 값을 사용할 가능성도 많기 때문에 일이 더 복잡해질 수 있다.
그렇기에 만약 Enum
값을 유연하게 사용할 가능성이 있다면 @Enumerated
로 Entity
에 매핑하지 말고, 앞단에서 String
으로 변환해서 넘기는 것이 좋을 수도 있다.
@Enumerated
를 달기 전에 한 번 더 고민해보자.