[JAVA] 날짜 포맷 형식의 중요성 - YYYYMMdd vs yyyyMMdd
🔥 새해 첫날, 시스템이 멈춘 이유
2025년 1월 2일, 회사 내부에서 사용하는 인력 관리 웹사이트에서 예상치 못한 심각한 장애가 발생했습니다.
로그인, 로그아웃이 전혀 되지 않는 상황이었고, 모든 동작이 마비되었습니다.
이 문제의 원인을 찾아보니, accessToken의 만료 날짜가 2024년 12월 30일로 설정되어 있었음에도 불구하고, 실제로는 2025년 12월 30일로 인식되고 있었습니다.
그 이유는 바로, 날짜 포맷 형식을 잘못 사용했기 때문입니다.
아래 사진은
YYYYMMdd를 잘못 사용하여 장애가 발생한 실제 원인 코드입니다.
이 코드에서는YYYY(Week-based Year)를 사용하여, 연말~연초에 연도가 잘못 계산되는 문제가 발생했습니다.
🤔 YYYYMMdd vs yyyyMMdd, 차이를 알고 계신가요?
많은 개발자들이 날짜 포맷을 설정할 때 YYYYMMdd와 yyyyMMdd를 혼용해서 사용합니다.
테스트할 때는 동일한 값이 나오는 경우가 많기 때문에, 차이를 명확히 모른 채 사용하기도 합니다.
저 역시 이전에는 다른 사람도 쓰고 있기에 당연히 YYYYMMdd가 맞겠지라고 생각하며 사용했습니다.
그러나 이번 경험을 통해 이 형식이 얼마나 중요한 차이를 만들어내는지 뼈저리게 깨닫게 되었습니다.
🔍 YYYYMMdd vs yyyyMMdd 차이점
| 포맷 | 의미 | 예제 (2024년 12월 30일) |
|---|---|---|
| yyyyMMdd | 실제 연도를 사용 | 20241230 |
| YYYYMMdd | 주(week) 기반 연도를 사용 | 20251230 |
✅ yyyy (소문자 y)
- 실제 Calendar year(연도) 를 기준으로 날짜를 표현합니다.
- 우리가 일반적으로 사용하는 연도를 기준으로 동작합니다.
⚠️ YYYY (대문자 Y)
- Week year(주 기반 연도) 를 기준으로 동작합니다.
- ISO-8601 기준으로, 한 해의 첫 번째 주(Week 1)가 언제 시작하느냐에 따라 연도가 다르게 설정될 수 있습니다.
- 예를 들어, 12월 30일이 다음 해의 첫 번째 주로 간주되면, 연도가 증가해버리는 문제가 발생할 수 있습니다.
📌 실제 문제 상황 분석
제가 겪었던 문제의 핵심은 YYYYMMdd를 사용했기 때문이었습니다.
- 토큰 만료 날짜를 “
yyyy-MM-dd HH:mm:ss“로 지정한 줄 알았지만, 실제로는 “YYYY-MM-dd HH:mm:ss“로 설정되어 있었습니다. - 2024년 12월 30일에 생성된 토큰이 2025년 12월 30일로 인식되었고, 이에 따라 만료 처리가 제대로 이루어지지 않았습니다.
결과적으로, 연말~연초에만 발생하는 특수한 오류였기 때문에,
지금까지는 모르고 사용하다가 이번에 큰 장애를 겪은 것이죠.
🚀 교훈: 날짜 포맷은 정확하게 사용하자!
✅ 항상 yyyyMMdd를 사용하자.
✅ YYYYMMdd는 연도가 다르게 계산될 수 있으므로 주의하자.
✅ SimpleDateFormat을 사용할 때는 대소문자를 철저히 구별하자.
이와 같은 문제는 특정 시점(연말~연초)에만 발생하기 때문에,
조금만 방심하면 큰 장애로 이어질 수 있습니다.
이번 경험을 통해 날짜 포맷을 정확하게 설정하는 것이
얼마나 중요한지 다시 한번 깨닫게 되었습니다.
여러분도 혹시 날짜 포맷 형식을 정확히 사용하고 계신가요?
지금 한 번 확인해보세요! 🧐

Comments