본문 바로가기

웹 프레임워크/Spring

Spring Controller에서 json으로 Date format 객체 받기, 응답

728x90

 

입력 JSON

Controller에서 JSON형태로 전달받은 데이터를 Date 받아야할 일이 생겼습니다.

{
  "name": "choi",
  "age": 1,
  "birthdayYearMonthDay": "2020.01.02",
}

이때 위와같이 Date format으로 처리해야할 String이 들어온다고 했을 때, 

String을 그래돌 받는 것보다 java.util.Date 포맷으로 변환한다면 편하게 DB접근에 있어서 편하게 사용할 수 있을 것입니다. 

 

 

pom.xml

    //생략
    <properties>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>5.2.2.RELEASE</spring.version>
        <jackson2.version>2.10.2</jackson2.version>        
    </properties>
    
    //생략
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson2.version}</version>
        </dependency>
    //생략

pom.xml 파일입니다.

Spring 버전은 5.2.2 이며, jackson 라이브러리 버전은 2.10.2 입니다..

jackson-databind을 사용하면 JSON콘텐츠를 Java객체로 손쉽게 맵핑할 수 있습니다.

 

javadoc.io/doc/com.fasterxml.jackson.core/jackson-databind/2.10.2/index.html

 

 

VO(Value Object)

package kr.or.connect.reservation.vo;

import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;

public class UserVo {
  private String name;
  private int age;
  @JsonFormat(pattern = "yyyy.MM.dd") //데이터 포맷 변환
  private Date birthdayYearMonthDay;

  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }

  public Date getBirthdayYearMonthDay() {
    return birthdayYearMonthDay;
  }
  
  @Override
  public String toString() {
    return "UserVo [name=" + name + ", age=" + age + ", birthdayYearMonthDay="
        + birthdayYearMonthDay + "]";
  }
}

먼저 VO(Value Object) 객체를 만들어 줍니다. 기존에 만들어져 있는 DTO나 Entitiy객체를 사용해도 됩니다.

@JsonFormat 어노테이션을 사용하여 Date Formatter을 직접 입력하여 java.util.Date으로 바꾸어 줍니다.

 

예시1) "2020.01.02" => yyyy.MM.dd

예시2) "2020-12-24 16:28:27.0" => "yyyy-MM-dd HH:mm:ss.S"

 

 

Controller

package kr.or.connect.reservation.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import kr.or.connect.reservation.vo.UserVo;

@RestController
@RequestMapping("/api/test")
public class MainController {
  @PostMapping
  public UserVo testApilist(@RequestBody UserVo uservo) {
    System.out.println(uservo.toString() + uservo.getBirthdayYearMonthDay().getClass());
    return uservo;
  }
}

 

 

 

테스트

 

println 으로 확인한결과 제대로 java.util.Date 형태로 값이 저장된 것을 볼 수 있습니다. 

또한 Controller에서 객체만 반환했을 뿐인데, 응답 포맷 또한 JSON으로 받은 것을 볼 수 있습니다.

728x90