본문 바로가기
Sprint_FESI11/Project

소켓(Socket) vs HTTP Client

by Toddler_AD 2025. 10. 16.

결론부터 말하자면 👇

❌ 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 계층의 최하단 (모든 서비스 공통 기반)