Ramble-FE / utils / responseUtils.ts
responseUtils.ts
Raw
import { ApiResponse } from "@/types/responseTypes";

/**
 * HTTP 응답 관련 유틸리티 함수들
 */
export class ResponseUtils {

    /**
     * Response 객체를 ApiResponse 타입으로 파싱합니다.
     * @param response Response 객체
     * @returns ApiResponse 객체
     */
    static async parseResponse(response: Response): Promise<ApiResponse> {
        const data = await response.json();
        if (!data || typeof data.code !== 'string' || typeof data.message !== 'string') {
            throw new Error('Invalid API response format');
        }
        
        return data as ApiResponse;
    }
    
    /**
     * API 에러를 처리하고 적절한 에러 메시지를 던집니다.
     * @param response Response 객체
     * @param context 에러가 발생한 컨텍스트
     * @throws Error 항상 에러를 던집니다
     */
    static async handleApiError(response: Response, context: string): Promise<never> {
        let errorMessage = `${context} 중 서버 오류가 발생했습니다 (${response.status})`;
        
        try {
            const errorData = await response.json();
            if (errorData.message) {
                errorMessage = errorData.message;
            }
        } catch {
            // JSON 파싱 실패 시 기본 메시지 사용
        }
        
        throw new Error(errorMessage);
    }

    /**
     * HTTP 상태 코드가 성공 범위인지 확인합니다.
     * @param status HTTP 상태 코드
     * @returns 성공 상태 여부 (200-299)
     */
    static isSuccessStatus(status: number): boolean {
        return status >= 200 && status < 300;
    }

    /**
     * HTTP 상태 코드가 클라이언트 에러인지 확인합니다.
     * @param status HTTP 상태 코드
     * @returns 클라이언트 에러 여부 (400-499)
     */
    static isClientError(status: number): boolean {
        return status >= 400 && status < 500;
    }

    /**
     * HTTP 상태 코드가 서버 에러인지 확인합니다.
     * @param status HTTP 상태 코드
     * @returns 서버 에러 여부 (500-599)
     */
    static isServerError(status: number): boolean {
        return status >= 500 && status < 600;
    }
}