[Spring] Entity에 @enumerated를 사용하는게 안좋을 수도 있다

jomminii_before·2022년 7월 1일
1

spring

목록 보기
4/4
@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 값을 유연하게 사용할 가능성이 있다면 @EnumeratedEntity에 매핑하지 말고, 앞단에서 String으로 변환해서 넘기는 것이 좋을 수도 있다.

@Enumerated를 달기 전에 한 번 더 고민해보자.

profile
https://velog.io/@jomminii 로 이동했습니다.

0개의 댓글