🔥 새해 첫날, 시스템이 멈춘 이유

2025년 1월 2일, 회사 내부에서 사용하는 인력 관리 웹사이트에서 예상치 못한 심각한 장애가 발생했습니다.

로그인, 로그아웃이 전혀 되지 않는 상황이었고, 모든 동작이 마비되었습니다.

이 문제의 원인을 찾아보니, accessToken의 만료 날짜가 2024년 12월 30일로 설정되어 있었음에도 불구하고, 실제로는 2025년 12월 30일로 인식되고 있었습니다.

그 이유는 바로, 날짜 포맷 형식을 잘못 사용했기 때문입니다.

아래 사진은 YYYYMMdd를 잘못 사용하여 장애가 발생한 실제 원인 코드입니다.
이 코드에서는 YYYY(Week-based Year)를 사용하여, 연말~연초에 연도가 잘못 계산되는 문제가 발생했습니다.

dateFormat.png

🤔 YYYYMMdd vs yyyyMMdd, 차이를 알고 계신가요?

많은 개발자들이 날짜 포맷을 설정할 때 YYYYMMddyyyyMMdd를 혼용해서 사용합니다.

테스트할 때는 동일한 값이 나오는 경우가 많기 때문에, 차이를 명확히 모른 채 사용하기도 합니다.

저 역시 이전에는 다른 사람도 쓰고 있기에 당연히 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