반응형
Jackson ObjectMapper을 이용하여 Object(VO, DTO 등)를 Map으로 값을 복사할 때 그중 날짜 형태의 데이터(java.util.Date나 java.util.LocalDateTime 등)가 포함되어 있다면 그 값이 우리가 알고 있는 yyyy-MM-dd(2021-01-01)이 아니라, Long 형태의 값으로 Map에 들어가게 됩니다.
먼저, 테스트를 위한 Book 클래스 입니다.
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.Date;
@Getter
@Setter
public class Book {
private LocalDateTime datetime;
private Date date;
}
아래의 코드를 실행하면 날짜가 Long형태로 표시됩니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Book book = new Book();
book.setDate(new Date());
book.setDatetime(LocalDateTime.now());
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.convertValue(book, Map.class);
System.out.println("date : " + map.get("date"));
System.out.println("localDatetime : " + map.get("date"));
}
}
이럴 때, 아래 코드와 같이 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 를 사용하면 우리가 알고 있는 시간 형태로 변환 가능합니다.
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
아래는 전체 코드입니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Book book = new Book();
book.setDate(new Date());
book.setDatetime(LocalDateTime.now());
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
Map<String, Object> map = mapper.convertValue(book, Map.class);
System.out.println("date : " + map.get("date"));
System.out.println("localDatetime : " + map.get("date"));
}
}
아래는 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS를 추가한 결과입니다.
date : 2021-08-06T15:53:13.480+0000
localDatetime : 2021-08-06T15:53:13.480+0000
만약, 위의 format 말고 지정한 format으로 변경하고 싶을 경우 다음과 같이 setDateFormat() 메서드를 이용하면 됩니다.
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(df);
아래는 전체 코드입니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Book book = new Book();
book.setDate(new Date());
book.setDatetime(LocalDateTime.now());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(df);
Map<String, Object> map = mapper.convertValue(book, Map.class);
System.out.println("date : " + map.get("date"));
System.out.println("localDatetime : " + map.get("date"));
}
}
아래는 출력 결과입니다.
date : 2021-08-07 01:12:07
localDatetime : 2021-08-07 01:12:07
[참고 사이트]
https://stackoverflow.com/questions/26071530/jackson-convert-object-to-map-preserving-date-type
https://www.baeldung.com/jackson-serialize-dates
728x90
반응형
'웹 개발' 카테고리의 다른 글
Spring Boot SQL 보기 옵션 총 정리 (0) | 2021.08.08 |
---|---|
JPA에서 생성일, 수정일 자동 입력하는 방법 (0) | 2021.08.08 |
Get the Current Working Directory in Java (0) | 2021.08.01 |
Copying a HashMap (0) | 2021.07.31 |
[Spring] @Controller와 @RestController 차이 (0) | 2021.07.31 |