TIL 시작.
지금까지는 날짜 타입에 대한 공부가 잘안되었기 때문에 날짜 데이터를 String으로 받아서 저장하곤 했었다. 하지만 구글링을 해본 결과, LocalDate, LocalDateTime, Timestamp 등 매우 많은 클래스가 정의되어 있었고, 이 중에서 일단 날짜만 나타내는 타입인 LocalDate 를 사용하기로 했다.
후론트 분들꼐서 javascript에서는 날짜 타입이 없다고 하시면서 String으로 날짜 데이터를 보내야 한다고 하셨다. 백엔드의 역할은 String 타입의 데이터를 LocalDate 타입으로 변환해서 저장해야만 하고, 그 역할을 내가 맡아서 했다.
사실, 생각보다 어려운 부분은 아니였다. 구글링을 통해 타입 변경 관련 문법을 쉽게 찾을 수 있었다. 날짜를 나타내는 방식은 매우 여러가지가 있었다.
이렇게 많은 종류의 데이터 양식이 enum 형태로 정의가 되어 있었고, 후론트 분들과의 회의 끝에 ISO_LOCAL_DATE 타입인 yyyy-MM-dd 형태를 사용하기로 했다.
후론트 분들이 "yyyy-MM-dd" 형태의 String 값으로 데이터를 요청하게 되면 이 데이터를 다음과 같이 LocalDate 타입으로 변환한다.
this.dueDay = LocalDate.parse(boardRequest.getDueDay(),DateTimeFormatter.ISO_LOCAL_DATE);
this.startDate = LocalDate.parse(boardRequest.getStartDate(),DateTimeFormatter.ISO_LOCAL_DATE);
this.endDate = LocalDate.parse(boardRequest.getEndDate(),DateTimeFormatter.ISO_LOCAL_DATE);
boardRequest에서 꺼낸 값들이 "yyyy-MM-dd" String 값이고, 이를 타입변환하여 db에 저장하게 된다.
아.. 지긋지긋한 이미지 업로드 에러와 NullPointerException이 또 발생했다. 이 에러는 S3 이미지 업로드를 공부하기 시작한 순간부터 계속 따라왔던 에러이다. 여전히 원인이 뭔지 추측만 할뿐이고 해결된 이유도 잘은 모르지만 어쨋든 기록해야 다음에 까먹지 않을테니 기록하려고 한다.
먼저, 이미지를 업로드하는 방식은,
@ModelAttribute @Valid BoardRequest boardRequest
컨트롤러에서 @ModelAttribute 어노테이션을 붙인 request요청을 매개변수로 받는다.
(ModelAttribute 에 관련해서는 내일 TIL 에서 다뤄보려고 한다.)
BoardRequest는 다음과 같다.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class BoardRequest {
@NotEmpty(message = "빈 칸을 채워 주세요.")
private String title;
@NotEmpty(message = "빈 칸을 채워 주세요.")
private String content;
private MultipartFile boardImage;
@NotEmpty(message = "봉사 활동 날짜를 정해 주세요.")
private String dueDay;
@NotEmpty(message = "지원 시작 날짜를 정해 주세요.")
private String startDate;
@NotEmpty(message = "지원 마감 날짜를 정해 주세요.")
private String endDate;
@NotEmpty(message = "봉사 활동 위치를 정해 주세요.")
private String area;
@NotEmpty(message = "상세 주소를 작성해 주세요.")
private String detailArea;
}
이렇게 요청을 받았을 때 NullPointerException 이 떴다.
원인은 잘 모르겠지만 이것저것 무지성으로 코드를 수정하다가 문득 BoardRequest의 기본생성자가 쓰이지 않는다는 사실을 깨닫고 @NoArgsConstructor 를 제거해 보았다. 그런데.. 신기하게도 정상적으로 작동하였다. 이 에러를 진짜 많이 봤었고, 예전에는 심지어 포기하고 다른 방법으로 이미지 업로드 기능을 구현하기도 했었는데 이제야 원인도 모르고 해결 이유도 모르지만 해결책을 찾게 되었다.
해결된 이유에 대해 감히 추측을 해보건데 직렬화랑 관련이 되지 않았을까 하는 무모한 추측을 해본다..... 직렬화 언젠가 공부해서 TIL 작성하고 만다...!