spring boot/spring boot

spring 에서의 LocalDateTime request와 response

ballde 2021. 9. 28. 12:43

https://balldev.tistory.com/29

 

mysql 및 maria db timezone 설정 변경 및 확인

일단 db설정하기 전에 리눅스 시간부터 확인해보겠습니다 리눅스 CLI(Command-line Interface) 환경에서는 몇 가지 명령어로 시간을 확인할 수 있습니다. date -> 2021. 09. 28. (화) 10:52:04 KST timedatectl Lo..

balldev.tistory.com

 

스프링에서 날짜 관련 처리를 할 경우 애러나는 것과 날짜 포맷팅에 관련해서 적어보겠습니다.

데이터베이스에서 날짜데이터를 로드 할 때 날짜형식의 string 형태로 구성하여 전달하는 경우가 있다.(2021-09-29 12:00:00) 처럼 말이다.

하지만 개발자마다 누군가는 포맷팅을 하고 누군가는 안하면 문제가 발생할 수도 있다. 

 

클라이언트 -> 서버 request 할 경우

@DateTimeFormat을 사용한다.

    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime startDate;

requestDto에 위처럼 포맷팅을 해주어야한다. (사실 @DateTimeFormat)을 안해주어도 아래처럼만 잘 보내주면 애러가 나진 않는다.)

"startDate": "2021-06-18T00:00:00",

그리고 반드시 localDateTime은 위처럼 T를 붙여야한다.

붙이지 않을 경우 

Cannot deserialize value of type `java.time.LocalDateTime` from String "2021-06-18 00:00:00":

위와 같은 애러가 난다.

 

서버 -> 클라이언트 response 할 경우

@JsonFormat을 사용한다.

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "Asia/Seoul")
    private LocalDateTime startDate;
    
    결과: "startDate": "2021-06-10T11:03:00",

JsonFormat을 하면 위와 같이 pattern에 맞게 나온다.

 

만약 JsonFormat을 사용하지 않았을 경우에는

"startDate": "2021-06-10T09:03:00.000+00:00",

위와같이 나온다.

 

만약 @DateTimeFormat을 사용하거나 사용하지 않아도 

    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    private LocalDateTime startDate;
"startDate": "2021-06-10T09:03:00",

잘 작동하긴 한다.

 

 

결론은 

Request(클라이언트 -> 서버) : @DateTimeFormat

Response(서버 -> 클라이언트) : @JsonFormat, @DateTimeFormat, 사용 X

패턴은 프론트에서 혼동되지 않게 넘겨주려면 같이 하는 사람들끼리 얘기를 해서 정하면 좋을것 같다!!

 

 

 

 

 

 

자세한 것은 

https://jojoldu.tistory.com/361

 

SpringBoot에서 날짜 타입 JSON 변환에 대한 오해 풀기

안녕하세요? 이번 시간엔 Spring과 JSON에 대해 정리해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와 세미나+책 후

jojoldu.tistory.com

향로님 블로그에 자세하게 나와있네요 ㅎㅎ

 

PS.

	@PostConstruct
	public void initApplication() {
		TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
	}

스프링에서 기본적으로 적용하고 싶은 timezone을 설정할 수 있네요.

java -jar -Duser.timezone=Asia/Seoul ...

배포할 때 설정할 수도 있습니다. 

'spring boot > spring boot' 카테고리의 다른 글

spring boot에서 filter  (0) 2021.12.04
spring boot 에서 argumentResolver  (0) 2021.12.04
spring boot 에서 interceptor  (0) 2021.12.04
spring의 dispatcher-servlet와 전체적인 흐름  (0) 2021.10.20
spring 기본 개념 - IOC, DI  (0) 2021.10.18