JAVA, LocalDate와 LocalDateTime의 실용적인 구분, 뷰에서 컨트롤러로 날짜 값 가져오기

infoqoch·2021년 3월 8일
0

스프링부트

목록 보기
4/10

json으로 받은 date의 값은 아래와 같다.

datetime: "2020-06-09T00:00:00.000+09:00"

처음에는 이 값을 자바스크립트를 통해 date객체로 변환한 후 스프링 컨트롤러의 LocalDateTime으로 변환하려 하였다. 그러나 계속 실패했다. 시도한 코드는 아래와 같다. (참고로 book이 json객체이다)

val localDate = new Date(book.datetime);

var localDate = new Date(Date.UTC(
    book.datetime.substring(0,4),
    book.datetime.substring(5,7),
    book.datetime.substring(8,10)
));

var tempdate = new Date(book.datetime.getTime()+book.datetime.getTimezoneOffset()*60*1000);
var offset = date.getTimezoneOffset() / 60;
var hours = date.getHours();
tempdate.setHours(hours - offset);
var localDate = convertUTCDateToLocalDate(new Date(tempdate));

위의 세 가지의 방법은 실제로 자바스크립트의 Date객체로 작동은 했다. 그러나 이것이 java의 LocalDateTime으로 넘어가는 순간 작동을 하지 않았다. 이유는 정확하게 모르겠다.

그래서 시도한 방법은 필요한 것만 딱 들어있는 DTO를 구성하는 것을 포기했다. String을 가지고 와서 java 문장으로 String to LocalDateTime으로 하기로 결심했다. 다음과 같이 진행했다.

public class BorrowDTO {
    private LocalDateTime publiDate; .......원래 의도했던 형태
	private String dateTime; ....... json으로 받은 시간의 값을 String 형태로 변환한 것을 자동 주입한다. 
}

    public ResponseEntity<Long> registerBookApi(@RequestBody BorrowDTO borrowDTO) throws Exception {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDateTime dateTime = LocalDateTime.parse(borrowDTO.getDateTime(), formatter);
        borrowDTO.setPubliDate(dateTime);
    }

그런데 위의 방식이 작동하지 않았다. 이유는 String의 값이 2020-06-09 였기 때문이다. 나는 DateLocalTime이 time을 제외하더라도 작동한다 생각했다. 그러나 그렇지 않았다.
그래서 결국 아래의 코드로 작성하여 성공할 수 있었다.

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate dateTime = LocalDate.parse(borrowDTO.getDateTime(), formatter);
        borrowDTO.setPubliDate(dateTime);

결론...

  • html(js)에서 Date 값을 자바의 LocalDateTime으로 뷰에서 깔끔하게 정리하는 것은 피곤하다.
  • String을 받고, 컨트롤러에서 변환하는 것이 간단하고 편리하다.
  • 하지만 LocalDateTime과 LocalDate는 다르다. 두 개를 정확하게 선택해서 코드를 작성하자.
profile
JAVA web developer

0개의 댓글

관련 채용 정보