DevBoi

[Spring] ObjectMapper 사용 본문

Develop/[Spring]

[Spring] ObjectMapper 사용

HiSmith 2023. 7. 10. 21:05
반응형

쉽게 json과 ObjectMapper를 많이 쓴다.

이유는 String <-> Object간의 자유로운 이동과 변환을 위해서 많이 사용한다.

내가 주로 사용하는것 외에도 다른 기능들이 존재할 것 같아서, 해당 기능들을 사용하면서 포스팅해보자

 

1. 의존성 추가

implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'

 

2. 간단한 사용 예제

 

(Object -> String, writerValue)

package com.example.demo;



import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class BookController {

  private final ObjectMapper mapper;
  @RequestMapping("/test2")
  public String test() throws Exception{
  MemberDto dto = new MemberDto("test1","test2","test3");
  String result = mapper.writeValueAsString(dto);
  return result;
  }
}

 

(String -> Object,readValue)

package com.example.demo;



import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class BookController {

  private final ObjectMapper mapper;
  @RequestMapping("/test2")
  public String test() throws Exception{
  MemberDto dto = new MemberDto("test1","test2","test3");
  String result = mapper.writeValueAsString(dto);
  MemberDto returnDto = mapper.readValue(result,MemberDto.class);

  return returnDto.getAddress();
  }
}

 

 

이렇게 하면 우선 String <-> Object간의 변환이 자유로워 진다.

 

추가로, Map,List에 대해서도 다양한 기능을 지원한다. Map,List둘다 비슷비슷하게 사용되기 때문에

해당 내용은 리스트만 테스트해서 작성해보도록 하자

 

 

 List -> String

package com.example.demo;



import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequiredArgsConstructor
public class BookController {

  private final ObjectMapper mapper;
  @RequestMapping("/test2")
  public String test() throws Exception{
  MemberDto dto = new MemberDto("test1","test2","test3");
  MemberDto dto1 = new MemberDto("test1","test2","test3");
  MemberDto dto2 = new MemberDto("test1","test2","test3");
  List<MemberDto> dtos = List.of(dto,dto1,dto2);

  String result = mapper.writeValueAsString(dtos);
  return result;
  }
}

 

 

String -> List

package com.example.demo;



import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequiredArgsConstructor
public class BookController {

  private final ObjectMapper mapper;
  @RequestMapping("/test2")
  public int test() throws Exception{
  MemberDto dto = new MemberDto("test1","test2","test3");
  MemberDto dto1 = new MemberDto("test1","test2","test3");
  MemberDto dto2 = new MemberDto("test1","test2","test3");
  List<MemberDto> dtos = List.of(dto,dto1,dto2);

  String result = mapper.writeValueAsString(dtos);
  List<MemberDto> returnDto= mapper.readValue(result, new TypeReference<>() {});
  return returnDto.size();
  }
}

 

TypeReference의 개념이 처음으로 등장한다.

해당 내용에 대해서 조금 자세히 이해하려면, 제네릭 Type Eraser와 Type Cast의 런타임 개념이 필요하니 참고하자.

 

 

3. 변환 정책 설정 ( Null은 제외 하거나, 모르는 속성은 제외 하거나 등등)

mapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT,false);
  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
  mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES,false);

 

4. 별도의 Deserializer와 결합하여 생성할 수도있다.

package com.example.demo;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.lang.reflect.Member;

@Configuration
@RequiredArgsConstructor
public class SmithCustomSerializer{
  private final ObjectMapper objectMapper;
  public String deserializer(MemberDto dto) throws JsonProcessingException {
    return objectMapper.writeValueAsString(dto);
  }
}

 

package com.example.demo;



import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequiredArgsConstructor
public class BookController {

  private final SmithCustomSerializer serializer;
  @RequestMapping("/test2")
  public String test() throws Exception{
  MemberDto dto = new MemberDto("test1","test2","test3");
  MemberDto dto1 = new MemberDto("test1","test2","test3");
  MemberDto dto2 = new MemberDto("test1","test2","test3");
  List<MemberDto> dtos = List.of(dto,dto1,dto2);
  return serializer.deserializer(dto);
  }
}

 

위와 같이 결합해서 사용할 수도있다.

 

 

이외, DateFormat 정책을 런타임 중에 변경할수도있다고 한다.

이는 실제로 해보지는 않고, 그냥 알아만 두자(실제로는 많이 안쓰일듯ㅋ)

반응형