지난 글 마지막에 Enum Type 의 필드에 대해서는
1. Enum Type 은 일반적인 String 또는 Long, Double 같은 클래스와 다르게 별도의 애너테이션을 만들어야 한다.
2. 아예 엉뚱한 값이 들어오면 직접 구현한 Validator 가 작동하기 전에 Parsing 과정에서 Exception 이 터지기도 한다.
라고 이야기 했는데 이 두 문제를 해결하여 적절한 에러메세지를 반환해 보았다.
일단 2번 문제에 대해서 이야기하자면
Serialize 와 Deserialize 의 개념에 대해서 먼저 정리를 해야한다. (직렬화 / 역직렬화)
위 개념은 객체나 데이터를 더 낮은 수준의 데이터 형태로 전환 하거나 그 반대 과정을 말한다.
더 낮은 수준의 데이터라는 건 가만히 생각해보면 조금 모호한 개념일 수도 있는데
사전적 정의는 "바이트 스트림" 이라고 한다. (챗지피티 왈)
바이트 스트림이라고 하면 굉장히 낮은 수준을 의미하기 때문에 볼 것도 없이 더 낮은 수준이고
지금 이 개념을 설명하는 이유는 Json <-> 자바 객체 간에도 직렬화 역직렬화 라는 표현이 쓰이기 때문이다.
아마 String 으로만 이루어진 Json이 다양한 타입의 자바 객체에 맵핑되는 것도 역직렬화로 해석할 수 있기 때문일 것이다.
여튼... 이 개념을 설명하는 이유는
2번의 원인이 바로 Json 을 Enum 타입으로 Deserialize 하는 과정에서 Parsing 오류를 내기 때문인 것이다.
때문에 Deserialize 를 잘 할 수있도록 로직을 구현해야한다. (물론 Response 를 내보낼때를 위해 Serialize 도 구현해야함)
예시 -
@JsonProperty 는 직렬화와 역직렬화 두가지 모두에 쓰이는 애너테이션인데
애너테이션이 붙은 필드가 Json 과 어떻게 맵핑되는지를 지정해준다.
위 예시에서 처럼 필드가 아니고 Enum 타입 상수에도 붙일 수 있다. (지금 보니 상수에 왜 lower case 가 있냐...)
저렇게 붙이게 되면 Gender.Male 은 "남" 이라는 값으로 맵핑이 된다.
이렇게 되면 Json 으로 serialize 는 예외없이 가능하지만, deserialize 의 경우 "외계인" 이라는 값이 들어와버리면
null 값으로 맵핑되는 게 아니라 바로 예외를 터트린다. (아마도 jackson.databind.exc 에 있는)
그렇기 때문에 deserialize 관련 로직이 필요하다. 그게 @JsonCreator 의 역할이다.
mode 속성은 어떤 값을 deserialize 할 것인지를 정하는 것이다.
위에서 쓰인 DELEGATING 의 경우 Gender 에 String gender 필드 외에 다른 여러 필드가 있을 때
다른 인자는 고려하지 않고 하나의 단일 인자만 받아서 맵핑하는 경우에 쓰인다.
이외에도 DEFAULT, PROPERTIES 같은 것도 있는데 다른건 직관적으로 이해가 가능하니까 잘 생각해보기...
(저번 글에서도 말했다시피 영어 단어의 뜻을 아는 것은 로직을 이해하는데 아주 중요한데
delegating 은 위임하다, 대리하다 뭐 이런 뜻이니 이 정의에 비추어 생각해보면
객체가 여러가지 값을 가진다고 해도, 단일 필드에 전부 위임하겠다. 뭐 그런 뜻인 것이다.)
여튼 그 밑의 람다식을 보면 values() 를 스트림으로 만들어서
(참고로 해당 메서드는 Enum 의 모든 값을 배열 형태로 반환한다.)
Json 으로 입력된 String gender 값과 일치하는 값이 있다면 그걸 반환하고 없으면 null을 반환한다.
자 이렇게 2번 문제는 해결 어려운 1번 문제가 남았다.
자 이렇게 하면 됩니다 자세한 설명은...
나도 어노테이션을 만들어 본 것은 처음이라서...
그렇지만 핵심 로직은 isValid 메서드에 있다는 것은 알겠지요...?
그런데 EnumConstraint 에 groups / payload / enumClass 이거는 잘 모르겠습니다.
enumClass 는 Constraint 를 붙일 Enum 클래스를 써주면 되는데 어떻게 작동하는 지는 좀더 까보겠습니다.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
나 보려고 만든 블로그라는 이름이 무색하게 내가 쓴 글들을 거의 읽어보지 않다가 오늘에서야 대충 훑어 보았다.
솔직히 순전히 나 보려고 만든 블로그는 아니고 이직시 인사 담당관에게 쁠러스 요인이 될까 해서 쓰는 글인데
아무래도 이렇게 해서는 힘들지 않을까 하는 생각이 든다... 그냥 정말 나보려고 만든 블로그가 되어간다.
그래도 어제 쓰려고 했던 내용은 써야할 것 같아서 이어쓴다. 중요한건 꺾이지 않는 마음... 꾸준함... (맞니...?)
아 그리고 ... 전부 결과물을 캡쳐로 하고 코드를 직접 붙여넣지 않는 이유는 (혹시라도 누군가 불만이 있다면)
예전 글에서도 보았듯 오타마저 복붙해서 블로그 글을 돌려 쓰던 꼬라지가 너무 싫기 때문이당
이걸 참고해서 잘 코딩해보시기 바랍니다... (누군가에게 내가 도움이 된다면요)