결론부터 말하자면 👇
❌ HttpClient.ts는 소켓(Socket) 이 아닙니다.
✅ HttpClient.ts는 HTTP 요청을 표준화·일관화하는 “API 통신 도우미(Wrapper)” 역할을 합니다.
🧩 1️⃣ 소켓(Socket)과 HTTP Client의 근본적 차이
| 구분 | HTTP Client (HttpClient.ts) | Socket (WebSocket 등) |
| 통신 방식 | 요청–응답 1회성 (Request–Response) | 양방향 실시간 통신 (Persistent) |
| 프로토콜 | HTTP / HTTPS | TCP (또는 WebSocket 프로토콜) |
| 연결 지속성 | 매 요청마다 새로 연결 | 한 번 연결 후 계속 유지 |
| 사용 목적 | REST API, CRUD, 데이터 요청 | 실시간 채팅, 알림, 스트리밍 |
| 예시 | fetch(), axios.get(), POST /login | socket.emit('chat'), socket.on('message') |
즉,
HttpClient.ts는 “서버에 요청을 보내고 응답을 받는” HTTP 통신 도우미이고,
“소켓처럼 계속 연결된 상태로 데이터를 주고받는 구조”는 아닙니다.
🧠 2️⃣ 그럼 HttpClient.ts는 정확히 무슨 역할을 하나요?
간단히 말하면 👇
“반복되는 fetch/axios 코드를 한 곳에 모아 표준화하는 공용 모듈”
예를 들어 이런 상황이 있을 겁니다 👇
// 로그인 API 호출
await fetch('https://api.example.com/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
// 모임 목록 API 호출
await fetch('https://api.example.com/gatherings', {
method: 'GET',
});
이렇게 중복된 fetch 코드를 수십 곳에서 쓰면
- 에러 처리 중복
- 인증 토큰 헤더 중복
- base URL 반복
- 환경별(개발/운영) URL 구분 어려움
이 문제를 해결하기 위해 만든 게 HttpClient.ts입니다 ✅
⚙️ 3️⃣ 구조 예시
// src/services/HttpClient.ts
export default class HttpClient {
protected baseUrl: string;
constructor(baseUrl: string) {
this.baseUrl = baseUrl;
}
// 모든 API 요청의 기본 메서드
protected async request<T>(
endpoint: string,
options: RequestInit = {}
): Promise<T> {
const res = await fetch(`${this.baseUrl}${endpoint}`, {
...options,
headers: {
'Content-Type': 'application/json',
...(options.headers || {}),
},
});
if (!res.ok) throw new Error(`HTTP Error: ${res.status}`);
return res.json();
}
}
이렇게 해두면 👇
// 예: authService.ts
import HttpClient from './HttpClient';
class AuthService extends HttpClient {
async login(data: { email: string; password: string }) {
return this.request('/auth/login', {
method: 'POST',
body: JSON.stringify(data),
});
}
}
export const authService = new AuthService('https://api.example.com');
이제 다른 서비스에서도 동일한 request() 구조를 재사용 가능 ✨
🧱 4️⃣ HttpClient 계층의 역할 요약
| 계층 | 역할 | 예시 |
| HttpClient.ts | 공통 HTTP 요청 로직 (baseUrl, 에러 처리, 헤더 등) | fetch(), axios 통합 |
| PolymorphicHttpClient.ts | CSR/SSR 환경 구분, 쿠키/토큰 분기 | SSR 대응 fetch |
| Service 계층 (ex. authService.ts) | API별 비즈니스 로직 정의 | login(), signup(), getUser() 등 |
즉 👇
HttpClient.ts는 소켓처럼 실시간 통신을 하는 객체가 아니라,
**“HTTP 요청을 더 안전하고 일관되게 보낼 수 있게 만들어주는 도구”**입니다.
🧭 5️⃣ 비유로 이해하면
| 비유 | 설명 |
| 소켓(Socket) | “전화 통화” — 계속 연결된 상태에서 실시간 대화 |
| HttpClient.ts | “택배 시스템” — 요청을 한 번 보내면 서버가 응답을 돌려줌 |
즉, HttpClient.ts는 “요청-응답” 단위로 동작하는 택배기사 같은 존재예요 📦
매번 요청마다 문을 두드리고, 응답 받으면 돌아옵니다.
실시간 연결은 소켓(WebSocket)의 영역이에요.
✅ 결론 요약
| 항목 | HttpClient.ts |
| 통신 유형 | HTTP 요청 (1회성 Request–Response) |
| 역할 | API 호출 로직 표준화, base URL 관리, 에러 처리 |
| CSR/SSR | 모두 가능 (fetch 기반) |
| 소켓과의 관계 | 전혀 다름 (소켓은 지속 연결) |
| 위치 | Service 계층의 최하단 (모든 서비스 공통 기반) |
'Sprint_FESI11 > Project' 카테고리의 다른 글
| useAuthStore (0) | 2025.10.16 |
|---|---|
| HttpClient → PolymorphicHttpClient → Service → Component 계층 구조 (0) | 2025.10.16 |
| CSR vs SSR vs SSG vs Edge (0) | 2025.10.16 |
| 웹이 SSR(서버가 코드를 해석해서 HTML을 만들어주는 구조) 를 유지하는 존재 이유 (0) | 2025.10.16 |
| JSP vs ASP vs SSR (0) | 2025.10.16 |