본문 바로가기
프로그래밍/TIL

[TIL] LocalDate, LocalTime, LocalDateTime

by 코딩중독 2024. 1. 29.

목차

    Java version 8 이상에서만 사용이 가능한 api이다.

     

    [LocalDate]

    날짜 정보만 출력한다.

    ex) 2024-01-15

     

    [LocalTime]

    시간 정보만 출력한다.

    ex) 11:10:25

     

    [LocalDateTime]

    날짜와 시간 정보 모두 출력한다.

    ex) 2020-10-12T12:32:32.222

     

    [적용]

    진행 중인 프로젝트에서 여행 시작일자, 종료일자, 체크인 시간, 체크아웃 시간 등 시간에 대한 모든 타입을 LocalDateTime으로 지정하고, MySQL타입에서는 DATETIME으로 지정했다.

    여행 정보를 저장할 때 문제가 발생했다.

    사용자의 가입을 처리할 때에는 LocalDateTime.now()를 사용해서 문제없이 지나갔지만, 날짜만 필요한 여행 시작일자와 종료일자에서는 LocalDateTime타입을 사용하려면 데이터를 저장할 때 년-월-일 시:분:초 모두를 필수값으로 넣어줘야 한다. MySQL Workbench에서 테스트로 SQL문을 작성해서 추가할 때에는 다음과 같이 적어도 추가되어서 헷갈렸다.

     

    INSERT INTO trip 
    (user_id, name, start_date, end_date, status) 
    VALUES 
    (1, "일본여행", "2024-01-13", "2024-01-15", "국외");

    테스트 추가완료

     

     

    당연한 결과를 예측하고 테스트를 돌리고 400 에러를 만나니 엥?

    정신없이 진행하다 보니... 정신머리가 문제였다.

    POST를 날려고 무한 400에러를 만나니 뭐지?? 싶었는데, JsonFormat을 yyyy-MM-dd로 해둔 상태에서는 POST 입력값에 시:분:초를 넣어주고, yyyy-MM-dd HH:mm:ss로 해둔 상태에서는 시:분:초를 안 넣어주고 있었다... 왜?????

    @JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING)
    private LocalDate startDate;
    
    {
      "user_id":1,
      "name":"부산 해운대",
      "start_date":"2024-02-15",
      "end_date":"2024-02-16",
      "status":"국내"
    }

     

     

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", shape = JsonFormat.Shape.STRING)
    private LocalDate startDate;
    
    {
      "user_id":1,
      "name":"부산 해운대",
      "start_date":"2024-02-15 11:11:11",
      "end_date":"2024-02-16 11:11:11",
      "status":"국내"
    }

     

    이렇게 타입만 맞춰주면 된다.

    테스트할 때는 정신 똑바로 챙기자.

    출력형식 데이터에 맞는 데이터타입을 사용하자.

    무조건 넓게 포괄한다고 좋은 게 아니다.