JSON 연동시 key 값 대문자로 변경하는 방법

스프링MVC 사용시 메시지 컨버터를 이용해서 Object <–> JSON 으로 변환한다.

VO ( Value Object) 클래스 생성시 Getter/Setter 를 테이블 컬럼명과 동일하게 사용한다.

예를 들면, 사용자 이름일 경우 테이블 컬럼명은 “USER_NAME”으로 사용한다.
(SI 에서는 보통 관습적으로 테이블 컬럼명과 동일하게 많이 사용한다.)

MappingJackson2HttpMessageConverter를 사용하면 JSON 변환되었을때 키(Key) 값이 Naming  전략에 따라 변경된다.

기본 네이밍 전략은 LOWER_CAMEL_CASE이다.
USER_NAME –> user_NAME으로 변경된다.

대문자로 키(Key) 값이 변경되지 않도록 할려면 아래와 같이 네이밍 전략을 바꾸어야 한다.

<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="prefixJson"  value="false" />
    <property name="prettyPrint" value="true" />
    <property name="objectMapper">
        <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" autowire="no">
            <property name="propertyNamingStrategy">
                <bean class="com.jaegeun.common.bind.UpperCaseUnderscoreStrategy" />
            </property>
        </bean>
    </property>
</bean>

기존 네이밍 전략 중에 com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy 클래스가 제공한다.
SnakeCase 이름처럼 user_name이라는 네이밍을 사용할 수 있다.

그러나, 키(Key) 값은 대문자로 사용한다는 요구사항이 있기 때문에 네이밍 전략을 확장해 보기로 한다.
아래와 같이 SnakeCase 전략을 상속 받아서 대문자로 바꾸어 주면 된다.

package com.jaegeun.wfk.common.bind;

import com.fasterxml.jackson.databind.PropertyNamingStrategy;

@SuppressWarnings("serial")
public class UpperCaseUnderscoreStrategy extends PropertyNamingStrategy.SnakeCaseStrategy {
    @Override
    public String translate(String input) {
        String upperCase = super.translate(input);

        return upperCase.toUpperCase();
    }
}

jackson-databind 메이븐 의존성을 갖기 때문에 추가해서 사용하세요.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.4</version>
</dependency>

다른 네이밍 전략도 있으니 한번 살펴보기 바란다.

SNAKE_CASE
UPPER_CAMEL_CASE
LOWER_CAMEL_CASE
LOWER_CASE
KEBAB_CASE

그럼 저는 이만 ㅋㅋㅋㅋㅋㅋ