java.time 실무 날짜 계산: 정산일, 영업일, 월말, 시간대, DB 매핑
날짜는 업무 시스템에서 가장 많이 틀리는 데이터입니다. 1월 31일에 한 달을 더하면 며칠인지, 정산 지급일이 주말이면 어떻게 하는지, 12월 31일이
YYYY포맷에서 왜 다음 해로 찍히는지, 서버가 UTC 로 돌아가면LocalDateTime.now()가 왜 9시간 어긋나는지를 실행으로 확인합니다.java.time의 타입 다섯 개를 언제 고르는지에서 시작해, 영업일 계산기를 직접 만들고,Period/Duration/DateTimeFormatter/ZoneId/JDBC 매핑까지 정산 배치를 짤 때 필요한 것을 한 번에 다룹니다.
1. 왜 배우는가
정산·마감·이자·연체·계약 만료·SLA 는 전부 날짜 계산입니다. 그리고 날짜 버그는 특정 날에만 납니다. 1월 31일, 2월 29일, 12월 31일, 연말 마지막 주, 서머타임 전환일에만 터지므로 테스트를 통과하고 운영에서 1년에 한 번 발견됩니다. 이 레슨의 예제는 그런 날짜를 골라 고정값으로 실행합니다.
옛 API(java.util.Date, Calendar, SimpleDateFormat)는 월이 0부터 시작하고, 값이 바뀌는 가변 객체이며, SimpleDateFormat 은 스레드 안전하지 않아 동시 요청에서 엉뚱한 날짜를 만들었습니다.
Java 8 의 java.time 은 이 문제를 전부 고쳤지만 타입이 많아 "무엇을 써야 하는지" 에서 막힙니다. 답은 단순합니다. 시간대가 필요한가, 날짜만인가, 시각만인가 로 고릅니다.
실무 프로젝트는 Oracle DATE/TIMESTAMP 컬럼을 MyBatis 로 LocalDate/LocalDateTime 에 매핑하고, @Scheduled 배치가 "전월 1일부터 말일까지" 를 계산해 정산합니다. JWT 의 exp 는 epoch 초입니다. 이 레슨의 예제 3·7 이 그 코드 그대로입니다.