반응형
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"));
}
}
반응형
'Develop > java' 카테고리의 다른 글
[백기선님의 자바 라이브 스터디] 12주차 - 애노테이션 (0) | 2021.03.05 |
---|---|
[백기선님의 자바 라이브 스터디] 5주차 - 클래스 (0) | 2021.01.04 |
[Java] if, else 에서 탈출해보자! interface활용 (5) | 2020.12.03 |
[Optional] Java 유용한 Null 처리 (0) | 2020.12.01 |