프론트엔드 통신 모듈 자문자답 📖
기본 개념 관련
Q: 초기 설계에서 고려해야할 관점들은 무엇인가요?
1. 통신 계층 추상화
2. API 엔드포인트 관리
3. API 서비스 계층 설계
4. 인터셉터 설계
5. 에러처리 전략
6. 캐시 전략
7. 재시도 메커니즘
- 테스트 용이성: 모든 계층이 인터페이스를 통해 분리되어 있어 단위 테스트가 쉬움
- 유지보수성: 실제 구현체를 교체하더라도 인터페이스만 지키면 됨
- 일관성: 전체 애플리케이션에서 통신 처리 방식이 일관됨
- 확장성: 새로운 기능이나 요구사항을 쉽게 추가할 수 있음
Q: 통신 계층을 추상화해야 하는 이유가 무엇인가요?
A: 통신 계층 추상화는 다음과 같은 이점을 제공합니다:
- HTTP 클라이언트 라이브러리(Axios, Fetch 등) 교체가 용이
- 테스트 코드 작성이 쉬워짐
- 공통 로직(에러 처리, 인증 등)을 한 곳에서 관리 가능
- 비즈니스 로직과 통신 로직의 명확한 분리
// 추상화 예시
interface HttpClient {
get<T>(url: string): Promise<T>;
post<T>(url: string, data: any): Promise<T>;
}
// 실제 구현체는 쉽게 교체 가능
class AxiosClient implements HttpClient {
// Axios 구현
}
class FetchClient implements HttpClient {
// Fetch 구현
}
Q: HTTP 클라이언트 도구를 선택할 때 어떤 점들을 고려해야 하나요?
A: HTTP 클라이언트 도구 선택 시 다음 사항들을 고려해야 합니다:
-
프로젝트 요구사항 부합도
- 브라우저 지원 범위
- 번들 사이즈 제약
- TypeScript 지원 여부
-
기능적 측면
- 인터셉터/미들웨어 지원
- 요청 취소 기능
- 자동 재시도
- 업로드/다운로드 진행률 지원
- JSON 자동 변환
-
유지보수 관점
- 커뮤니티 활성도
- 문서화 품질
- 최근 업데이트 주기
- 이슈 해결 속도
-
성능과 확장성
- 메모리 사용량
- 캐싱 지원
- 커스터마이징 용이성
예를 들어:
axios: 풍부한 기능과 넓은 생태계fetch: 브라우저 내장으로 가벼움ky: fetch 기반으로 현대적 기능 추가superagent: Node.js 친화적
Q: Axios와 Ky의 주요 차이점은 무엇인가요?
A: 각 도구의 특징을 카테고리별로 비교하면 다음과 같습니다:
-
프로젝트 요구사항 부합도
항목 Axios Ky 브라우저 지원 IE11 포함 광범위한 지원 모던 브라우저 only (ES2017+) 번들 사이즈 ~32KB (min + gzip) ~4KB (min + gzip) TypeScript 네이티브 지원 네이티브 지원 -
기능적 측면
기능 Axios Ky 인터셉터 완성도 높은 request/response 인터셉터 hooks API로 구현 요청 취소 CancelToken + AbortController 지원 네이티브 AbortController만 지원 자동 재시도 써드파티 라이브러리 필요 내장 retry 옵션 업로드 진행률 네이티브 지원 구현 필요 JSON 변환 자동 자동 -
유지보수 관점
항목 Axios Ky GitHub Stars 100K+ 9K+ 주간 NPM 다운로드 4천만+ 50만+ 최근 업데이트 매우 활발 활발 이슈 해결 속도 빠름 (큰 커뮤니티) 보통 -
성능과 확장성
항목 Axios Ky 메모리 사용 상대적으로 높음 매우 낮음 캐싱 XHR 기반 캐싱 Fetch API 기반 캐싱 확장성 다양한 플러그인 생태계 심플한 hooks API
선택 가이드:
-
Axios 선택이 좋은 경우:
- IE11 지원이 필요한 경우
- 완성도 높은 인터셉터가 필요한 경우
- 파일 업로드 진행률 표시가 필요한 경우(XHR 기반)
- 큰 커뮤니티와 생태계가 중요한 경우
-
Ky 선택이 좋은 경우:
- 모던 브라우저만 지원하면 되는 경우
- 번들 사이즈 최적화가 중요한 경우
- 심플한 API를 선호하는 경우
- 내장 retry 기능이 필요한 경우
Q: 인터셉터(Interceptor)는 정확히 어떤 상황에서 필요한가요?
A: 인터셉터는 다음과 같은 상황에서 유용합니다:
- 모든 API 요청에 인증 토큰 추가
- 응답 에러 공통 처리 (401 인증 오류, 404 페이지 등)
- API 요청/응답 로깅
- 요청 헤더 공통 설정
Q: React Query와 일반 상태 관리(Redux 등)는 어떻게 다른가요?
A: 주요 차이점은 다음과 같습니다:
- React Query: 서버 상태 관리에 특화 (캐싱, 자동 재검증, 낙관적 업데이트 등)
- Redux: 클라이언트 상태 관리에 특화 (사용자 설정, UI 상태 등)
구현 관련
Q: API 응답 타입을 어떻게 정의하는 것이 좋나요?
A: 다음과 같은 방법을 추천합니다:
// 1. 기본 응답 타입 정의
interface ApiResponse<T> {
data: T;
message: string;
status: number;
}
// 2. 구체적인 데이터 타입 정의
interface User {
id: number;
name: string;
email: string;
}
// 3. 조합하여 사용
type UserResponse = ApiResponse<User>;
type UsersResponse = ApiResponse<User[]>;
Q: 토큰 만료 시 자동 갱신은 어떻게 구현하나요?
A: 일반적인 구현 패턴은 다음과 같습니다:
- 401 에러 감지
- 리프레시 토큰으로 새 액세스 토큰 요청
- 새 토큰으로 원래 요청 재시도
- 실패 시 로그인 페이지로 이동
Q: API 호출 중복 방지는 어떻게 하나요?
A: 다음과 같은 방법들이 있습니다:
- 요청 캐싱 (React Query 사용)
- 디바운싱/쓰로틀링 적용
- AbortController 활용
- 요청 큐잉
성능 관련
Q: 언제 캐시를 사용하고, 언제 사용하지 않아야 하나요?
A: 다음 기준을 참고하세요:
캐시 사용이 좋은 경우:
- 자주 변경되지 않는 데이터 (사용자 프로필, 설정 등)
- 공통으로 사용되는 데이터 (카테고리 목록 등)
- 네트워크 부하가 큰 데이터
캐시를 피해야 하는 경우:
- 실시간성이 중요한 데이터 (채팅, 알림 등)
- 보안에 민감한 데이터
- 사용자별 맞춤 데이터
Q: 대량의 데이터를 처리할 때 성능 최적화는 어떻게 하나요?
A: 다음과 같은 전략을 사용할 수 있습니다:
- 페이지네이션 구현
- 무한 스크롤 적용
- 가상화 리스트 사용
- 데이터 청크 단위 로딩
테스트 관련
Q: API 모킹은 어떻게 하는 것이 좋나요?
A: 다음과 같은 방법들이 있습니다:
- MSW(Mock Service Worker) 사용
- Jest Mock 함수 활용
- 테스트용 API 서버 구축
- Storybook과 통합하여 테스트
Q: 어떤 종류의 테스트를 작성해야 하나요?
A: 주요 테스트 유형:
- 단위 테스트: API 클라이언트 메서드
- 통합 테스트: API 연동 컴포넌트
- E2E 테스트: 실제 사용자 시나리오
보안 관련
Q: 민감한 데이터는 어떻게 처리해야 하나요?
A: 다음 가이드라인을 따르세요:
- HTTPS 사용 필수
- 토큰은 HttpOnly 쿠키로 관리
- 중요 데이터는 로컬 스토리지 사용 금지
- API 응답에서 민감 정보 필터링
Q: CORS 에러는 어떻게 해결하나요?
A: 일반적인 해결 방법:
- 서버 측 CORS 설정 요청
- 프록시 서버 사용
- 개발 환경에서 프록시 설정
- 올바른 Origin 설정
디버깅 관련
Q: API 호출 실패 시 어떻게 디버깅하나요?
A: 다음 단계로 진행:
- 브라우저 개발자 도구 네트워크 탭 확인
- API 클라이언트 로깅 활성화
- 요청/응답 인터셉터 로그 확인
- 서버 로그 대조 확인
Q: 성능 병목을 찾으려면 어떻게 해야 하나요?
A: 다음 도구와 방법을 활용:
- Chrome DevTools Performance 탭
- React DevTools Profiler
- 네트워크 워터폴 분석
- 리액트 렌더링 최적화 도구
실무 관련
Q: 실제 프로젝트에서 많이 하는 실수는 무엇인가요?
A: 주요 실수 사례:
- 에러 처리 미흡
- 타입 정의 불충분
- 무분별한 API 호출
- 보안 고려 부족
- 테스트 코드 부재
Q: 프로덕션 환경에서 주의할 점은 무엇인가요?
A: 핵심 고려사항:
- 에러 로깅 및 모니터링
- 성능 모니터링
- 사용자 피드백 수집
- 점진적 배포
- 롤백 계획 수립