애플리케이션 레벨에서 날짜 데이터 핸들링하기

노력을 즐겼던 사람·2022년 12월 27일
0
post-thumbnail

시작하기 전

최근에 날짜 데이터를 핸들링하는 로직을 잘못짜서 장애가 발생한 적이 있다.
날짜 데이터를 어떻게 다뤄야 장애가 안날까?

각 언어의 날짜 객체를 사용하자

만약 자바를 사용한다면 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 을 객체 외부에서 생성해서 주입해주도록 코드를 변경하자.

profile
노력하는 자는 즐기는 자를 이길 수 없다 를 알면서도 게으름에 지는 중

0개의 댓글