최근에 날짜 데이터를 핸들링하는 로직을 잘못짜서 장애가 발생한 적이 있다.
날짜 데이터를 어떻게 다뤄야 장애가 안날까?
만약 자바를 사용한다면 LocalDate
를 사용 하자는 뜻이다.
만약 이런 API가 있을 수 있다.
{
[
id: 1,
date: 12.10.
],
[
id: 2,
date: 12.11.
]
...
[
id: 7,
date: 12.16.
]
}
오늘로부터 +6일 간의 데이터를 제공한다. 필드 중에 날짜가 있는데 MMdd
의 형태이다.
극악무도하다 정말. 우리는 이 데이터를 YYYYMMdd
로 만들어야 한다.
그래서 이런 코드를 짰다.
public class ResponseDTO {
static final Integer year = LocalDate.now().getYear();
final Long id;
final String date;
public ResponseDTO(Long id, String date) {
this.id = id;
this.date = date;
}
public String getDate() {
return year + date;
}
}
오. 객체를 생성할 때 YYYY 를 붙여주니까 문제가 없겠다. 테스트 코드도 잘 통과하는구만.
문제가 없어보이지만 치명적인 오류가 있다. 이런 엣지 케이스가 있을 수 있다.
만약 오늘이 12월 31일이라면? API는 이런 데이터를 제공한다.
{
[
id: 1,
date: 12.31.
],
[
id: 2,
date: 01.01.
]
...
[
id: 7,
date: 01.06.
]
}
이러면 1월 1일 부터는 내년을 넣어줘야하는데 우리가 짠 코드는 올해를 넣어준다. 그렇기 때문에 항상 날짜 데이터를 핸들링할 때는 사용 언어가 지원하는 날짜 객체를 사용하자.
public class ResponseService {
public List<ResponseDTO> get(List<ResponseDTO> datas) {
LocalDate date = LocalDate.now();
for (ResponseDTO data : datas) {
data.setYear(date.getYear());
date = date.plusDays(1);
}
}
}
이렇게 Year 을 객체 외부에서 생성해서 주입해주도록 코드를 변경하자.