고민
- camelCase : 프로젝트 vo 필드 개발 표준
- snake_case : 관계사 오픈 api 요청 parameter 필드
=> vo를 활용하기 위해서는 convertCamelToSnake가 필요하다.
솔루션 : 주체는 Jackson ObjectMapper
- @JsonProperty : vo 필드 이름에 명시한 문자열 매핑 (우선순위 높음)
import com.fasterxml.jackson.annotation.JsonProperty;
- @JsonNaming : vo 모든 필드 이름 표기법 매핑 규칙 정의
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
샘플 vo
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class SnakeCase {
@JsonProperty("time_stamp")
private String timeStamp;
public String getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(String timeStamp) {
this.timeStamp = timeStamp;
}
}
테스트
- 변수 선언, 인스턴스 생성
SnakeCase sc;
ObjectMapper om;
@BeforeEach
String timeStamp = DateUtil.getTimeStamp();
sc = new SnakeCase();
sc.setTimeStamp(timeStamp);
om = new ObjectMapper();
}
- Json String 문자열 변환
@Test
void printConvertedJsonStrTest() throws JsonProcessingException {
String jsonStr = om.writeValueAsString(sc);
System.out.println("converted JsonStr : " + jsonStr);
assertTrue(jsonStr.contains("time_stamp"));
}
[console]
converted JsonStr : {"time_stamp":"20220507120052"}
- Map 변환
@Test
void printConvertedMapEntrySetTest() {
boolean isJsonConvert = false;
Map<String, Object> voMap = om.convertValue(sc, Map.class);
System.out.println("converted Map : " + voMap);
for (Entry<String, Object> elem : voMap.entrySet()) {
String key = elem.getKey();
isJsonConvert = key.equals("time_stamp");
System.out.println("key : " + key);
System.out.println("value : " + elem.getValue());
}
assertTrue(isJsonConvert);
}
[console]
converted Map : {time_stamp=20220507120950}
key : time_stamp
value : 20220507120950
결론
- 관계사 오픈 api 요청 필드를 vo로 관리할 수 있다.
- @JsonProperty가 필드 정책 변경에 좀 더 유연하게 대응할 수 있을 것 같다.
- 응답 vo 필드 snakeToCamel도 잘 된다.