1.4.1 API 스타일 🎨


1. REST

Rest Api를 학습한 코드는 devzip에 게시하였습니다.

1️⃣ React 상태 관리 (useState)

// 요청에 필요한 데이터
const [method, setMethod] = useState('GET');      // HTTP 메서드
const [url, setUrl] = useState('https://...');    // 요청 URL
const [headers, setHeaders] = useState('{...}');  // 헤더 (문자열)
const [body, setBody] = useState('');             // 바디

// 응답 결과 저장
const [response, setResponse] = useState(null);   // 응답 데이터
const [loading, setLoading] = useState(false);    // 로딩 상태
const [error, setError] = useState(null);         // 에러 메시지

핵심: 화면에 보여줄 데이터는 useState로 관리하고, set함수로 업데이트


2️⃣ fetch API 기본 구조

const res = await fetch(url, {
    method: method,        // 'GET', 'POST', 'PUT', 'DELETE' 등
    headers: headerObj,    // { "Content-Type": "application/json" }
    body: body             // POST/PUT일 때만 사용
});

핵심: fetch(URL, 옵션객체) 형태로 HTTP 요청을 보냄


3️⃣ async/await 비동기 처리

const executeRequest = async () => {  // async 함수 선언
    const res = await fetch(url);     // await로 응답 기다림
    const data = await res.json();    // await로 JSON 파싱 기다림
};

핵심:

  • async = “이 함수는 비동기 작업을 합니다”
  • await = “이 작업이 끝날 때까지 기다립니다”

4️⃣ try/catch/finally 에러 처리 패턴

try {
    // 성공할 수도 있는 코드
    const res = await fetch(url);

} catch (err) {
    // 실패했을 때 실행
    setError(err.message);

} finally {
    // 성공/실패 상관없이 항상 실행
    setLoading(false);
}

핵심: 네트워크 요청은 항상 실패할 수 있으므로 try/catch 필수!


5️⃣ 응답(Response) 처리

// 응답 객체에서 정보 추출
res.status        // 200, 404, 500 등 상태 코드
res.statusText    // "OK", "Not Found" 등
res.headers       // 응답 헤더들

// 응답 바디 파싱
await res.json()  // JSON 형태일 때
await res.text()  // 텍스트 형태일 때

핵심: res.json()도 비동기라서 await 필요!


6️⃣ HTTP 상태 코드 의미

200-299 → 성공 (초록색) 300-399 → 리다이렉트 (주황색) 400-499 → 클라이언트 오류 (빨간색) - 내 잘못 500-599 → 서버 오류 (보라색) - 서버 잘못


전체 흐름 요약

[전송 버튼 클릭]

[로딩 시작, 이전 결과 초기화]

[헤더 문자열 → JSON 객체로 변환]

[fetch()로 HTTP 요청 전송]

[응답 대기 (await)]

[응답 헤더, 바디 파싱]

[화면에 결과 표시]

[로딩 종료]

2. JSON APIs

1️⃣ JSON 기본 개념

JSON이란?

  • JavaScript Object Notation
  • 데이터를 저장하고 전송하기 위한 텍스트 형식
  • 모든 프로그래밍 언어에서 사용 가능

JSON 데이터 타입

  • 문자열: 쌍따옴표만 사용 “hello”
  • 숫자: 42, 3.14
  • 불리언: true, false
  • null: null
  • 배열: [1, 2, 3]
  • 객체: {“key”: “value”}

2️⃣ 핵심 메서드 두 가지

JSON.parse() - 문자열을 객체로 변환 const obj = JSON.parse(‘{“name”:”철수”}’); // obj.name === “철수”

JSON.stringify() - 객체를 문자열로 변환 JSON.stringify(obj) // 압축 (한 줄) JSON.stringify(obj, null, 2) // 포맷 (들여쓰기 2칸)


3️⃣ 구현 과정에서 배운 것들

try/catch 올바른 사용법 // 잘못된 예 - finally에서 성공 처리 try { JSON.parse(input); } catch (err) { setError(err.message); } finally { setResult(“성공”); // 에러가 나도 실행됨 }

// 올바른 예 - try 안에서 성공 처리 try { JSON.parse(input); setResult(“성공”); // 성공할 때만 실행 } catch (err) { setError(err.message); }

템플릿 리터럴 // 작은따옴표 - 변수 삽입 안 됨 ‘오류: ${err.message}’ // 그대로 출력됨

// 백틱 - 변수 삽입 가능 오류: ${err.message} // 실제 에러 메시지 출력

함수 반환값 사용하기 // 잘못된 예 - 결과를 버림 JSON.stringify(parsed); setInputJson(parsed); // 객체 전달 (오류)

// 올바른 예 - 결과를 변수에 저장 const result = JSON.stringify(parsed); setInputJson(result); // 문자열 전달 (정상)

React setState는 반환값이 없다 const result = setInputJson(x); // result는 undefined


4️⃣ 최종 구현 코드

유효성 검사 try { JSON.parse(inputJson); setResult({ type: ‘validate’, message: ‘유효한 JSON입니다.’ }); } catch (err) { setError(오류: ${err.message}); }

포맷터 try { const parsed = JSON.parse(inputJson); const formatted = JSON.stringify(parsed, null, 2); setInputJson(formatted); } catch (err) { setError(오류: ${err.message}); }

압축 try { const parsed = JSON.parse(inputJson); const minified = JSON.stringify(parsed); setInputJson(minified); } catch (err) { setError(오류: ${err.message}); }


5️⃣ 핵심 패턴 요약

  1. JSON 처리는 항상 try/catch로 감싸기 (파싱 실패 대비)
  2. 성공 처리는 try 블록 안에서
  3. 함수 반환값은 변수에 저장해서 사용
  4. 문자열 안에 변수 넣을 때는 백틱 사용

3. SOAP API

SOAP API는 추후에 학습 예정입니다.


4. gRPC

gRPC (gRPC Remote Procedure Call)는 Google이 개발한 고성능 RPC 프레임워크이다.

RPC: 원격 프로시저 호출


5. GraphQL

GraphQL은 API를 위한 쿼리 언어이자, 그 쿼리를 실행하는 서버 측 런타임.

REST의 한계(여러 엔드포인트, 오버 페칭 등)을 극복하기 위한 쿼리 언어.

장점: 필요한 필드만, 한 번의 쿼리로 연관된 데이터를 묶어서.