@Enumerated

sseongeun·2024년 9월 12일
0

스프링

목록 보기
10/13

💻 @Enumerated(EnumType.ORDINAL) & @Enumerated(EnumType.STRING)

-> 클래스의 필드값 중 enum 타입인 것에 붙이는 애노테이션이다.


예시를 통해 이해해보자!

Club 클래스

public class Club extends BaseEntity {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@NotNull
	private String name;
    
	private String introduction;

	@NotNull
	@JdbcTypeCode(SqlTypes.VARCHAR)
	@Enumerated(EnumType.STRING)
	private ClubType clubType;

	@NotNull
	@JdbcTypeCode(SqlTypes.VARCHAR)
	@Enumerated(EnumType.STRING)
	private Hashtag hashtag;
    
    ...
 }

ClubType Enum 클래스

public enum ClubType implements EnumMapperType {
    CENTER("중앙동아리"),
    SMALL("소모임"),
    ETC("그 외");

    private final String title;
    ...
}

해당 애노테이션을 사용하는 이유는, DB에 저장되는 형태를 정의하기 위함!


만약 ClubType값에 소모임을 설정하고 싶다고 하자.

1️⃣ @Enumerated(EnumType.ORDINAL)
ORIGINAL로 설정하면, DB에 2로 저장된다.
ClubType에 SMALL이 2번째로 지정되어있기 때문이다.

2️⃣ @Enumerated(EnumType.STRING)
STRING으로 설정하면, DB에 SMALL로 저장된다.

-> DB를 확인해보면 SMALL로 저장된것을 확인할 수 있다.


⁇ 그렇다면 어떤 것을 사용하는 것이 좋을까?

만약 @Enumerated(EnumType.ORDINAL)로 설정했는데 Enum에 새로운 값이 추가되면,

기존에 2가 의미하던 값이 다른 의미를 가질 수 있다.

예를 들어

  • 기존 enum 클래스
public enum ClubType implements EnumMapperType {
    CENTER("중앙동아리"),
    SMALL("소모임"),
    ETC("그 외");

    private final String title;
    ...
}
  • 새로운 enum 값 추가 후
public enum ClubType implements EnumMapperType {
    CENTER("중앙동아리"),
    COLLABERATE("연합동아리"),
    SMALL("소모임"),
    ETC("그 외");

    private final String title;
    ...
}

-> 이렇게 되면 DB에 저장된 2는 더이상 소모임이 아닌, 연합동아리를 의미하게된다.

📌 따라서 값의 변경에 영향을 받지 않는 유지보수를 지향한다면, @Enumerated(EnumType.STRING)을 사용하자!!

profile
공부 기록...

0개의 댓글