날짜 포매팅, 파싱, 시간대(Timezone) 처리, 날짜 간 계산은 요구 범위가 다르므로 내장 API로 충족되는지 먼저 확인하고 필요한 경우 전용 라이브러리를 검토합니다.
date-fns: 입력 Date를 변경하지 않는 함수로 날짜 연산을 제공하며, Date 객체의 메서드를 확장하지 않습니다. 필요한 함수의 import 방식과 실제 번들 결과를 확인합니다.
예시
import { format, addDays, differenceInDays } from 'date-fns';const today = new Date();const formattedDate = format(today, 'yyyy년 MM월 dd일'); // 예시: '2025년 06월 14일' (실제 출력은 실행 날짜에 따름)const nextWeek = addDays(today, 7); // 7일 후 날짜const daysDiff = differenceInDays(nextWeek, today); // 7
Moment.js: 변경 가능한(mutable) 날짜 객체 API를 제공하며 시간대 처리는 Moment Timezone 같은 별도 구성도 확인합니다. 공식 문서에서 유지보수 모드의 기존 프로젝트로 안내하므로 새 프로젝트의 기본 선택으로 삼기 전에 대안을 검토합니다. 기존 시스템을 유지할 때 필요한 지원 범위와 교체 비용도 살핍니다. Moment 공식 문서를 참고합니다.
Day.js: Moment.js와 유사한 API와 플러그인 구성을 제공합니다. 필요한 locale·timezone 플러그인의 동작과 번들 포함 범위를 확인합니다.
선택 가이드: 변경 가능성, locale·timezone 범위, 파싱 규칙과 실행 환경을 먼저 정한 뒤 공식 문서의 지원 범위와 실제 번들 결과를 비교합니다.
상품 상세 화면이 한 번 /api/products/7을 요청하는 경우부터 시작해 봅니다. fetch로도 JSON을 읽을 수 있지만, HTTP 오류 상태와 네트워크 실패는 다르게 처리합니다.
async function loadProduct() { const response = await fetch('/api/products/7'); if (!response.ok) { throw new Error(`상품 요청 실패: HTTP ${response.status}`); } return response.json();}
서버가 404를 응답하면 fetch는 Response를 반환하므로 직접 ok를 검사합니다. 네트워크 실패는 요청 Promise의 거부로, JSON 본문이 잘못된 경우는 response.json()의 실패로 처리합니다. Fetch 공식 참고 문서를 참고합니다.
Axios는 기본 설정에서 성공 범위 밖의 HTTP 상태를 거부하지만 validateStatus로 정책을 바꿀 수 있습니다. 요청 도구만 바꿔도 여러 화면의 응답 캐시·재검증 규칙이 자동으로 생기는 것은 아닙니다. 상품 목록과 상세가 같은 서버 데이터를 공유하고 저장 후 갱신해야 한다면 SWR 또는 TanStack Query의 캐시 키와 무효화 규칙을 검토합니다. Axios 설정 문서를 참고합니다.
재시도는 작업 의미도 살펴야 합니다. 조회 요청과 결제 생성 요청은 같지 않습니다. 결제 응답을 못 받았다고 바로 재전송하면 중복 처리될 수 있으므로, 서버의 중복 방지 방식과 재시도 정책을 함께 정합니다.
1. 위 loadProduct에서 서버가 404와 JSON 본문을 반환했습니다. return response.json()까지 실행될까요? HTTP 상태가 200이지만 JSON이 잘못되었다면 어디서 실패할까요?
풀이 확인
404이면 response.ok가 false이므로 직접 던진 오류로 종료하며 본문을 읽지 않습니다. 200이면 상태 검사를 통과하지만 JSON 파싱이 실패할 수 있습니다. HTTP 상태 검사와 응답 본문 해석을 별도 단계로 다뤄야 두 원인을 구분할 수 있습니다.
2. 예약 시각은 2026-10-09T00:30:00Z입니다. UTC 표시와 UTC+9 표시의 시각은 각각 얼마일까요? 날짜 라이브러리를 고르기 전에 무엇을 결정해야 할까요?
풀이 확인
UTC에서는 10월 9일 00:30, UTC+9에서는 같은 날 09:30입니다. 하나의 시점을 어느 시간대로 표시할지 정해야 합니다. 생일처럼 시각·시간대가 없는 달력 날짜와 예약처럼 정확한 시점을 구분하고, 파싱할 입력 형식과 표시 지역도 정합니다. 라이브러리 이름만으로 이 정책이 결정되지는 않습니다.
3. 모달 라이브러리가 디자인과 번들 크기 요구는 만족하지만, 닫을 때 초점이 열기 버튼으로 돌아오지 않습니다. 바로 도입해도 될까요? 테스트할 흐름을 적어 보세요.
풀이 확인
필요한 키보드 흐름이 아직 통과하지 않았습니다. 열기 버튼에 초점을 두고 모달을 연 뒤, 내부 첫 초점과 Tab 이동, 닫기 동작, 닫은 뒤 초점 복원을 확인합니다. 요구사항에 해당하면 Escape로 닫기와 스크린 리더 이름도 확인합니다. 작은 프로토타입에서 수정 가능성과 통합 비용을 확인한 뒤 도입 근거로 기록합니다.