문제 상황

프로젝트에서 "2024-08-27T18:42:08.000Z" 형식의 ISO 날짜 문자열을 "YYYY-MM-DD" 형식으로 변환하는 과정에서 에러가 발생했다. 단순하게 ISOString 문자열을 받아 파싱하는 함수였다.

// 기존 코드
export const formatDate = (dateString: string) => {
  const date = new Date(dateString);
  return date.toISOString().split("T")[0];
};

이렇게 구현하니 에러가 API 응답 데이터를 처리하면서 나타났다. 예를 들어, 크롤링한 게시글의 날짜 정보게 데이터베이스에 없는 경우 undefined나 null 값이 전달될 수 있다. 이런 상황에서 클라이언트 쪽에서 TypeError가 발생한다. 또한 잘못된 형식의 날짜 문자열이 입력되면 Invalid Date 에러가 발생한다. 예외 처리 로직도 없어 앱 전체가 중단되는 문제가 있다.

해결 방법

더 안전한 날짜 포맷팅을 위해 다음과 같이 코드를 개선했다.

export const formatDate = (dateString: string | undefined | null) => {
  if (!dateString) {
    return "-";
  }
  
  try {
    const date = new Date(dateString);
    if (isNaN(date.getTime())) {
      return "-";
    }
    return date.toISOString().split("T")[0];
  } catch (error) {
    console.error("Date formatting error:", error);
    return "-";
  }
};

입력 파라미터의 타입을 string | undefined | null로 확장해 타입 안전성을 강화했다. null 체크와 유효하지 않은 날짜 검증을 통해 TypeError를 방지했다. try-catch 블록으로 예외 상황을 처리할 수 있도록 했다.

formatDate("2024-08-27T18:42:08.000Z")  // "2024-08-27"
formatDate(undefined)                     // "-"
formatDate(null)                         // "-"
formatDate("invalid-date")               // "-"