최근 요청사항 중 날짜에 대한 REST API 작업을 할 일이 있었는데, 간략히 기록해보고자 합니다. 참고로 현재 프로젝트의 자바 버전은 8 미만(1.5)이기 때문에 Date, Calendar, SimpleDateFormat 클래스를 사용하였습니다. 혹 내용 중 틀린 부분이나 피드백이 있다면 댓글로 남겨주시면 감사하겠습니다.
_____
인터페이스 호출 시 파라메터로 넘어온 날짜[1]가 특정 조건에 부합하면 Y, 그렇지 않으면 N을 클라이언트에 던져주어야 했다[2]. 조건은 다음과 같았다.
A. 주말 포함 공휴일[3]이 아니다.
B. 오늘 기준 공휴일 제외[4] 5일 이전, 5일 이후 이내여야 한다.
각각의 코드[5]는 다음과 같다.
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 해당 날짜가 주중인지 확인(A)
*/
private String isWeekday(String dateString) {
Date iDate = getDate(dateString, "yyyyMMdd");
Calendar cal = Calendar.getInstance();
cal.setTime(iDate);
int dayNum = cal.get(Calendar.DAY_OF_WEEK);
if (dayNum == 1 || dayNum == 7) {
return "N";
}
return "Y";
}
/**
* 해당 날짜가 오늘 기준 공휴일 제외 5일 이전, 5일 이후 이내인지 확인(B)
*/
private String isWithinRange(String dateString) {
Date iDate = getDate(dateString, "yyyyMMdd");
// DB에서 오늘 기준 D-5()와 D+5(eDate) 날짜문자열을 조회해온다(중략).
Date sDate = ...
Date eDate = ...
if (!(sDate.before(iDate) && iDate.before(eDate))) { // [6]
return "N";
}
return "Y";
}
/**
* 날짜 스트링을 받아 날짜로 리턴
*
* @param dateString(20220117)
* @param dateFormat(yyyyMMdd)
* @return date
*/
private Date getDate(String dateString, String dateFormat) {
SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormat);
return dateFormat.parse(dateFormat); // [7]
}
_____
1. yyyyMMdd 형식의 문자열로 가정한다.
2. 실제로는 파람은 VO이고, 리턴도 JSON이지만 여기서는 편의상 String을 반환하는 것으로 했다.
3. 공휴일 체크는 DB 테이블에 따로 휴무일을 입력하여 카운트가 0 이상이면 휴무일로 판단해주어야 하는데 여기서는 생략한다.
4. 공휴일 제외하여 5일 이전, 5일 이후 가져오는 부분은 생략한다. 실제로 프로시져로 되어 있었
5. 예외 처리는 생략하였다.
6. 경계값을 포함하고 싶다면 다음과 같다.
if (!((sDate.before(iDate) || sDate.equals(iDate)) && (iDate.before(eDate) || iDate.equals(eDate)))) {
return "N";
}
7. 재사용성을 위해 getDate 메소드를 분리했는데, 이 글의 답변을 보고 이렇게 리턴해도 되는지 혼동이 온다.
_____
참고
- 자바의 날짜 비교
- Naver D2] Java의 날짜와 시간 API
'공부 > Java' 카테고리의 다른 글
예외 처리 시 RETURN문 위치 (0) | 2022.01.17 |
---|---|
출력 (0) | 2021.08.13 |
자바 다형성 (0) | 2020.12.14 |
자바 추상화 (0) | 2020.12.14 |
오류 코드보다 예외를 사용하라! (0) | 2020.12.12 |
댓글