From ffd92be16efdb3bd936faa72a0fe7c9e6041a380 Mon Sep 17 00:00:00 2001 From: Ye jin Shin <108514552+shinyj0@users.noreply.github.com> Date: Wed, 16 Oct 2024 02:36:37 +0900 Subject: [PATCH 1/2] =?UTF-8?q?docs=20:=20[=EC=8B=A0=EC=98=88=EC=A7=84]=20?= =?UTF-8?q?2=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0 \352\262\203\354\235\270\352\260\200.md" | 2 +- ...4\355\231\224 \354\262\230\353\246\254.md" | 116 ++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 "shinyj0/Week02/2\354\243\274\354\260\250 - \353\202\240\354\247\234 \354\247\201\353\240\254\355\231\224 \353\260\217 \354\227\255\354\247\201\353\240\254\355\231\224 \354\262\230\353\246\254.md" diff --git "a/shinyj0/Week01/1\354\243\274\354\260\250 - \354\226\264\353\226\240\355\225\234 \352\260\234\353\260\234\354\236\220\352\260\200 \353\220\240 \352\262\203\354\235\270\352\260\200.md" "b/shinyj0/Week01/1\354\243\274\354\260\250 - \354\226\264\353\226\240\355\225\234 \352\260\234\353\260\234\354\236\220\352\260\200 \353\220\240 \352\262\203\354\235\270\352\260\200.md" index 8c35426..fb1910b 100644 --- "a/shinyj0/Week01/1\354\243\274\354\260\250 - \354\226\264\353\226\240\355\225\234 \352\260\234\353\260\234\354\236\220\352\260\200 \353\220\240 \352\262\203\354\235\270\352\260\200.md" +++ "b/shinyj0/Week01/1\354\243\274\354\260\250 - \354\226\264\353\226\240\355\225\234 \352\260\234\353\260\234\354\236\220\352\260\200 \353\220\240 \352\262\203\354\235\270\352\260\200.md" @@ -1,4 +1,4 @@ -#1주차 - 어떠한 개발자가 될 것인가 +# 1주차 - 어떠한 개발자가 될 것인가 ### 개발자를 왜 하고 싶은가 diff --git "a/shinyj0/Week02/2\354\243\274\354\260\250 - \353\202\240\354\247\234 \354\247\201\353\240\254\355\231\224 \353\260\217 \354\227\255\354\247\201\353\240\254\355\231\224 \354\262\230\353\246\254.md" "b/shinyj0/Week02/2\354\243\274\354\260\250 - \353\202\240\354\247\234 \354\247\201\353\240\254\355\231\224 \353\260\217 \354\227\255\354\247\201\353\240\254\355\231\224 \354\262\230\353\246\254.md" new file mode 100644 index 0000000..d774fec --- /dev/null +++ "b/shinyj0/Week02/2\354\243\274\354\260\250 - \353\202\240\354\247\234 \354\247\201\353\240\254\355\231\224 \353\260\217 \354\227\255\354\247\201\353\240\254\355\231\224 \354\262\230\353\246\254.md" @@ -0,0 +1,116 @@ +# [SPRING] 날짜 직렬화 및 역직렬화 처리: @DateTimeFormat vs @JsonFormat + +**스프링은 날짜를 어떻게 역직렬화할까?** + +**(@DateTimeFormat, @JsonFormat)** + +```java +{ + "startDateTime": "2023-07-13 14:00", + "endDateTime": "2023-07-14 15:59" +} +``` +
+ +1)**@DateTimeFormat을 사용** + +```java +//Request Dto +public record ScheduleRequest( + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") + LocalDateTime startDateTime, + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") + LocalDateTime endDateTime) { + +} + +``` + +→에러! 데이터바인딩시 에러 + + +**어떻게 해결하는가?** +
+2)**@JsonFormat으로 해결** + +```java +public record ScheduleRequest( + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") + LocalDateTime startDateTime, + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Asia/Seoul") + LocalDateTime endDateTime) { + +} +``` +
+3)**@DateTimeFormat vs @JsonFormat** + +**@DateTimeFormat** + +```java +package org.springframework.format.annotation; + +... + +public @interface DateTimeFormat { + ... +} +``` + +→**@DateTimeFormat**은 Spring의 어노테이션 + +**@JsonFormat** + +```java +package com.fasterxml.jackson.annotation; + +... + +public @interface JsonFormat { + ... +} + +``` + +→ + +**@JsonFormat**은 @RequestBody, @ResponseBody를 사용한 직렬화/역직렬화를 담당하는 Jackson 라이브러리의 어노테이션이다. + +-Jackson 라이브러리에서는 내부적으로 pattern으로 지정한 형식을 LocalDateTime으로 변환해준다. + +따라서, Jackson 라이브러리의 @JsonFormat은 날짜 형식이라면 자유롭게 사용이 가능하다. + +하지만, @RequestBody, @ResponseBody를 사용한 역직렬화/직렬화 시, + +@DateTimeFormat을 사용하려면 Jackson 라이브러리에 있는 어노테이션이 아니기 때문에 LocalDateTime의 기본 형식인 'yyyy-MM-dd'T'HH:mm:ss'으로 요청이 들어와야 바인딩된다. + +
+ + +4) **@RequestParam, @ModelAttribute에서는 무엇을 사용해야 할까?** + + + + @RequestBody, @ResponseBody 등 Jackson 라이브러리를 사용하여 역직렬화/직렬화를 하는 상황이 아닌 Jackson 라이브러리가 관여하지 않는 @RequestParam, @ModelAttribute에서는 무엇을 사용해야 할까? + +Jackson 라이브러리가 사용되지 않기 때문에 **@JsonFormat은 무시된다.** + +**→** @DateTimeFormat을 사용하여 날짜 형식을 자유롭게 바인딩 할 수 있다. + +
+ +5) 결론적으로 @RequestBody, @ResponseBody를 사용한 역직렬화/직렬화 시, + +날짜 형식을 자유롭게 사용하기 위해서는, **@DateTimeFormat**이 아닌, **@JsonFormat**을 사용해야한다! + +```java +* 기본 전제 : LocalDateTime의 기본 형식인 'yyyy-MM-dd'T'HH:mm:ss'이 아닐 때 + +1. @RequestBody, @ResponseBody : @JsonFormat 사용 +2. @RequestParam, @ModelAttribute : @DateTimeFormat 사용 + +``` \ No newline at end of file From 9548218b0902ccb594fc6310109f4c31078664ef Mon Sep 17 00:00:00 2001 From: Ye jin Shin <108514552+shinyj0@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:23:53 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20[=EC=8B=A0=EC=98=88=EC=A7=84]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\254\355\231\224 \354\262\230\353\246\254.md" | 16 ++++++++-------- ...54\260\250-\353\260\261\354\244\200 16974.md" | 0 2 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 "shinyj0/Week03/3\354\243\274\354\260\250-\353\260\261\354\244\200 16974.md" diff --git "a/shinyj0/Week02/2\354\243\274\354\260\250 - \353\202\240\354\247\234 \354\247\201\353\240\254\355\231\224 \353\260\217 \354\227\255\354\247\201\353\240\254\355\231\224 \354\262\230\353\246\254.md" "b/shinyj0/Week02/2\354\243\274\354\260\250 - \353\202\240\354\247\234 \354\247\201\353\240\254\355\231\224 \353\260\217 \354\227\255\354\247\201\353\240\254\355\231\224 \354\262\230\353\246\254.md" index d774fec..d3ca4a2 100644 --- "a/shinyj0/Week02/2\354\243\274\354\260\250 - \353\202\240\354\247\234 \354\247\201\353\240\254\355\231\224 \353\260\217 \354\227\255\354\247\201\353\240\254\355\231\224 \354\262\230\353\246\254.md" +++ "b/shinyj0/Week02/2\354\243\274\354\260\250 - \353\202\240\354\247\234 \354\247\201\353\240\254\355\231\224 \353\260\217 \354\227\255\354\247\201\353\240\254\355\231\224 \354\262\230\353\246\254.md" @@ -33,6 +33,7 @@ public record ScheduleRequest( **어떻게 해결하는가?**
+ 2)**@JsonFormat으로 해결** ```java @@ -46,7 +47,9 @@ public record ScheduleRequest( } ``` -
+ + + 3)**@DateTimeFormat vs @JsonFormat** **@DateTimeFormat** @@ -61,7 +64,7 @@ public @interface DateTimeFormat { } ``` -→**@DateTimeFormat**은 Spring의 어노테이션 +→ **@DateTimeFormat**은 Spring의 어노테이션 **@JsonFormat** @@ -76,9 +79,7 @@ public @interface JsonFormat { ``` -→ - -**@JsonFormat**은 @RequestBody, @ResponseBody를 사용한 직렬화/역직렬화를 담당하는 Jackson 라이브러리의 어노테이션이다. +→ **@JsonFormat**은 @RequestBody, @ResponseBody를 사용한 직렬화/역직렬화를 담당하는 Jackson 라이브러리의 어노테이션이다. -Jackson 라이브러리에서는 내부적으로 pattern으로 지정한 형식을 LocalDateTime으로 변환해준다. @@ -88,10 +89,9 @@ public @interface JsonFormat { @DateTimeFormat을 사용하려면 Jackson 라이브러리에 있는 어노테이션이 아니기 때문에 LocalDateTime의 기본 형식인 'yyyy-MM-dd'T'HH:mm:ss'으로 요청이 들어와야 바인딩된다. -
-4) **@RequestParam, @ModelAttribute에서는 무엇을 사용해야 할까?** +4)**@RequestParam, @ModelAttribute에서는 무엇을 사용해야 할까?** @@ -103,7 +103,7 @@ Jackson 라이브러리가 사용되지 않기 때문에 **@JsonFormat은 무
-5) 결론적으로 @RequestBody, @ResponseBody를 사용한 역직렬화/직렬화 시, +5)결론적으로 @RequestBody, @ResponseBody를 사용한 역직렬화/직렬화 시, 날짜 형식을 자유롭게 사용하기 위해서는, **@DateTimeFormat**이 아닌, **@JsonFormat**을 사용해야한다! diff --git "a/shinyj0/Week03/3\354\243\274\354\260\250-\353\260\261\354\244\200 16974.md" "b/shinyj0/Week03/3\354\243\274\354\260\250-\353\260\261\354\244\200 16974.md" new file mode 100644 index 0000000..e69de29