도메인을 설계할 때 Enum을 사용하고자 하는 필드들이 몇 있었다.
Rest API를 만들 때 enum을 사용하여 값을 받을 때 @JsonCreator와 @JsonValue를 사용하여 직렬화와 역직렬화를 하였다.
직렬화란 객체를 전송 가능한 형태로 바꿔주는 것을 의미하고 역직렬화는 그 데이터들을 다시 자바 객체로 변화해주는 것으로 알면 된다.
우선 작성한 코드를 살펴보자.
@Getter
@RequiredArgsConstructor
public enum BoardCategory implements IdEnum {
PET("PET", "반려동물"),
FOOD("FOOD", "음식"),
TRAVEL("TRAVEL", "여행");
private final String id;
private final String desc;
@JsonValue
public String getValue() {
return this.name();
}
@JsonCreator
public static BoardCategory of(String name) {
for (BoardCategory obj : BoardCategory.values()) {
if (obj.name().equalsIgnoreCase(name)) {
return obj;
}
}
return null;
}
}
@JsonValue
enum에서 getValue 메서드에 @JsonValue를 넣어주어 이름을 통해 직렬화하게 한다.
getValue() 메서드에서 return 하는 값이 이 enum의 실제 표현이라는 것이다.
@JsonCreator
Json body를 받을 때 Json to Object 과정에서 역직렬화는 Jackson 라이브러리에서 실행된다.
위의 코드처럼 사용하게 되면 API 요청을 받아올 때 BoardCategory 값으로 받은 String은 @JsonCreator를 지정한 메서드의 파라미터로 들어가게 되고 해당 메서드 기능을 통해 Request DTO에 저장되게 된다.
이렇게 Enum을 생성했으면 Enum을 사용하는 필드에 @Enumerated 라는 어노테이션을 붙여줘야 한다.
@Column(columnDefinition = "varchar(50) COMMENT '카테고리'")
@Enumerated(EnumType.STRING)
private BoardCategory boardCategory;
Enum의 값을 Index가 아닌 텍스트 값 그대로 저장하고 싶을 때 위의 어노테이션을 붙여주면 DB에 Enum의 값 자체가 텍스트 그대로 저장이 된다.
전에 실무하면서 @Enumerated 어노테이션을 빼먹고 자꾸 데이터가 제대로 안넣어져서 헤맸던 기억이 있다,,
앞으로는 잘 기억해야지.. 망망!
'개발' 카테고리의 다른 글
JWT 활용한 로그인 구현 - 2 (0) | 2023.08.31 |
---|---|
JWT 활용한 로그인 구현 - 1 (0) | 2023.08.30 |
BaseEntity 생성하기 (0) | 2023.08.19 |
엔티티 생성 (0) | 2023.08.18 |
도메인 설계 (0) | 2023.08.17 |