Develop/java

[ObjectMapper] Convert!! snake to camel, camel to snake

에디개발자 2020. 11. 19. 10:30
반응형

Restful API를 사용하다 보면 내가 만든 vo와 값이 다르게 넘어올 때가 있습니다. 그땐 vo.set.. vo.set.. vo.set... ObjectMapper를 사용하면 편리합니다.

모든 소스는 github에 있습니다.

나를 닮았다고 한다....

개발자는 코드로 보는게 이해가 빠를 듯하여 코드위주로 작성하겠습니다.

 

build.gradle

plugins {
	id 'org.springframework.boot' version '2.3.4.RELEASE'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'    // 필요
	implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.2'  // 필요


	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'mysql:mysql-connector-java'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

 

Configuration

Bean에 올려놓고 ObjectMapper를 사용하는 예제입니다.

해당 예제는 snake -> camel로 convert하는 예제입니다.

package com.example.flyway.configuration;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class MapperConfiguration {

    @Bean
    public ObjectMapper jacksonBuilder() {
        Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder = new Jackson2ObjectMapperBuilder();
        jackson2ObjectMapperBuilder.propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        return jackson2ObjectMapperBuilder.build();
    }
}

PropertyNamingStrategy 값을 상황에 맞게 변경하여 사용하시면 됩니다!

 

 

 

Vo

convert 대상 Vo 객체입니다.

package com.example.flyway.vo;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class TestVo {
    private String userName;
    private Integer userAge;
    private String userAddress;
}

 

Test

JSONObject, Map으로 테스트를 진행하였습니다.

모두 성공!

package com.example.flyway.mapper;

import com.example.flyway.vo.TestVo;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.util.HashMap;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;

@ActiveProfiles("local")
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class ObjectMapperTest {

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    void snake_JSON에서_camelVO로_Convert_test() throws JSONException {
        //given
        String name = "임용태";
        Integer age = 32;
        String address = "강남 아파트에 살고싶다";

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("user_name", name);
        jsonObject.put("user_age", age);
        jsonObject.put("user_address", address);

        //when
        TestVo testVo = objectMapper.convertValue(jsonObject, TestVo.class);

        //then
        assertThat(testVo.getUserName()).isEqualTo(jsonObject.get("user_name"));
        assertThat(testVo.getUserAge()).isEqualTo(jsonObject.get("user_age"));
        assertThat(testVo.getUserAddress()).isEqualTo(jsonObject.get("user_address"));
    }

    @Test
    void snake_Map에서_camelVO로_Convert_test(){
        //given
        String name = "임용태";
        Integer age = 32;
        String address = "강남 아파트에 살고싶다";

        Map<String, Object> parameterMap = new HashMap<>();
        parameterMap.put("user_name", name);
        parameterMap.put("user_age", age);
        parameterMap.put("user_address", address);

        //when
        TestVo testVo = objectMapper.convertValue(parameterMap, TestVo.class);

        //then
        assertThat(testVo.getUserName()).isEqualTo(parameterMap.get("user_name"));
        assertThat(testVo.getUserAge()).isEqualTo(parameterMap.get("user_age"));
        assertThat(testVo.getUserAddress()).isEqualTo(parameterMap.get("user_address"));
    }
}

 

 

 

 

반응형