Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[신예진] 3주차 과제 제출합니다. #18

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#1주차 - 어떠한 개발자가 될 것인가
# 1주차 - 어떠한 개발자가 될 것인가

### 개발자를 왜 하고 싶은가

Expand Down
116 changes: 116 additions & 0 deletions shinyj0/Week02/2주차 - 날짜 직렬화 및 역직렬화 처리.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# [SPRING] 날짜 직렬화 및 역직렬화 처리: @DateTimeFormat vs @JsonFormat

**스프링은 날짜를 어떻게 역직렬화할까?**

**(@DateTimeFormat, @JsonFormat)**

```java
{
"startDateTime": "2023-07-13 14:00",
"endDateTime": "2023-07-14 15:59"
}
```
<br>

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) {

}

```

→에러! 데이터바인딩시 에러


**어떻게 해결하는가?**
<br>

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을 사용하여 날짜 형식을 자유롭게 바인딩 할 수 있다.

<br>

5)결론적으로 @RequestBody, @ResponseBody를 사용한 역직렬화/직렬화 시,

날짜 형식을 자유롭게 사용하기 위해서는, **@DateTimeFormat**이 아닌, **@JsonFormat**을 사용해야한다!

```java
* 기본 전제 : LocalDateTime의 기본 형식인 'yyyy-MM-dd'T'HH:mm:ss'이 아닐 때

1. @RequestBody, @ResponseBody : @JsonFormat 사용
2. @RequestParam, @ModelAttribute : @DateTimeFormat 사용

```
Empty file.