401, 403, 404, 500 같은 상태 코드의 의미를 제대로 판단하지 못합니다.클라이언트는 서버에 요청을 보내는 쪽입니다.
보통 사용자가 직접 사용하는 브라우저, 모바일 앱, 프론트엔드 애플리케이션을 의미합니다.
예시
서버는 클라이언트의 요청을 받아 처리하고 응답을 돌려주는 쪽입니다.
서버는 요청에 따라 HTML, CSS, JavaScript, 이미지, JSON 데이터 등을 반환합니다.
예시
사용자
↓
브라우저 또는 React 앱
↓ HTTP 요청
Nginx / API 서버
↓
비즈니스 로직 처리
↓
DB 조회 또는 저장
↓
HTTP 응답
↓
브라우저 화면 반영
1. 사용자가 상담 신청 폼 작성
2. React에서 POST /api/consult 요청 전송
3. NestJS 서버가 요청 데이터 검증
4. DB에 상담 신청 정보 저장
5. 서버가 성공 응답 반환
6. React에서 "신청이 완료되었습니다" 메시지 표시
POST /api/consult HTTP/1.1
Host: www.example.com
Content-Type: application/json
Authorization: Bearer access-token
{
"name": "홍길동",
"phone": "01012345678",
"model": "Galaxy S25"
}
| 구성 요소 | 설명 |
|---|---|
POST | 서버에 데이터를 생성하거나 전송하는 요청 |
/api/consult | 요청 대상 URL |
Host | 요청하는 도메인 |
Content-Type | 요청 바디의 데이터 형식 |
Authorization | 인증 정보 |
| JSON Body | 서버로 보내는 실제 데이터 |
GET, POST, PUT, PATCH, DELETE를 사용합니다.GET /api/products?page=1&limit=20 HTTP/1.1
실무 예시
POST /api/consult HTTP/1.1
Content-Type: application/json
{
"name": "홍길동",
"phone": "01012345678"
}
실무 예시
PUT /api/users/1 HTTP/1.1
Content-Type: application/json
{
"name": "홍길동",
"phone": "01099998888",
"email": "test@example.com"
}
주의할 점
PATCH를 더 자주 사용하는 경우도 많습니다.PATCH /api/users/1 HTTP/1.1
Content-Type: application/json
{
"phone": "01099998888"
}
실무 예시
DELETE /api/products/10 HTTP/1.1
실무 예시
주의할 점
deletedAt이나 isDeleted 값을 사용하는 소프트 삭제를 쓰는 경우가 많습니다.HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 101,
"message": "상담 신청이 완료되었습니다."
}
| 구성 요소 | 설명 |
|---|---|
201 Created | 새로운 데이터가 생성됨 |
Content-Type | 응답 데이터 형식 |
| JSON Body | 클라이언트에게 전달할 실제 데이터 |
| 상태 코드 | 의미 | 실무 예시 |
|---|---|---|
200 OK | 요청 성공 | 목록 조회 성공 |
201 Created | 생성 성공 | 상담 신청 등록 성공 |
204 No Content | 성공했지만 응답 본문 없음 | 삭제 성공 |
| 상태 코드 | 의미 | 실무 예시 |
|---|---|---|
301 Moved Permanently | 영구 이동 | HTTP → HTTPS 리다이렉트 |
302 Found | 임시 이동 | 로그인 후 이전 페이지 이동 |
304 Not Modified | 변경 없음 | 브라우저 캐시 사용 |
| 상태 코드 | 의미 | 실무 예시 |
|---|---|---|
400 Bad Request | 잘못된 요청 | 필수 값 누락 |
401 Unauthorized | 인증 필요 | 로그인하지 않음 |
403 Forbidden | 권한 없음 | 일반 사용자가 관리자 API 접근 |
404 Not Found | 리소스 없음 | 없는 페이지 또는 API 호출 |
409 Conflict | 충돌 | 이미 가입된 이메일 |
422 Unprocessable Entity | 검증 실패 | 전화번호 형식 오류 |
| 상태 코드 | 의미 | 실무 예시 |
|---|---|---|
500 Internal Server Error | 서버 내부 오류 | 예외 처리 누락 |
502 Bad Gateway | 게이트웨이 오류 | Nginx가 API 서버와 통신 실패 |
503 Service Unavailable | 서비스 이용 불가 | 서버 점검 또는 과부하 |
504 Gateway Timeout | 응답 시간 초과 | API 서버 응답 지연 |
Content-Type: application/json
Authorization: Bearer access-token
Cookie: sessionId=abc123
User-Agent: Mozilla/5.0
Referer: https://www.example.com/event
| 헤더 | 설명 |
|---|---|
Content-Type | 요청 바디 데이터 형식 |
Authorization | JWT 같은 인증 토큰 |
Cookie | 세션, 추적 정보 등 |
User-Agent | 브라우저/OS 정보 |
Referer | 이전 페이지 주소 |
Content-Type: application/json
Set-Cookie: sessionId=abc123; HttpOnly; Secure
Cache-Control: no-store
Access-Control-Allow-Origin: https://www.example.com
| 헤더 | 설명 |
|---|---|
Set-Cookie | 브라우저에 쿠키 저장 |
Cache-Control | 캐싱 정책 |
Access-Control-Allow-Origin | CORS 허용 출처 |
Content-Type | 응답 데이터 형식 |
fetch, axios, React Query 등을 사용해 서버 API를 호출합니다.async function submitConsult() {
const response = await fetch("/api/consult", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "홍길동",
phone: "01012345678",
model: "Galaxy S25",
}),
});
if (!response.ok) {
throw new Error("상담 신청에 실패했습니다.");
}
return response.json();
}
import axios from "axios";
async function submitConsult() {
const response = await axios.post("/api/consult", {
name: "홍길동",
phone: "01012345678",
model: "Galaxy S25",
});
return response.data;
}
실무에서 같이 처리할 것
import { Body, Controller, Post } from '@nestjs/common';
@Controller('consult')
export class ConsultController {
@Post()
createConsult(@Body() body: { name: string; phone: string; model: string }) {
return {
message: '상담 신청이 완료되었습니다.',
data: body,
};
}
}
1. Controller에서 요청 받기
2. DTO로 요청 데이터 검증
3. Service에서 비즈니스 로직 처리
4. Repository 또는 ORM으로 DB 저장
5. 결과를 Controller로 반환
6. 클라이언트에 JSON 응답
Controller: HTTP 요청/응답 담당
Service: 비즈니스 로직 담당
Repository/ORM: DB 접근 담당
DTO: 요청 데이터 검증 담당
Entity: DB 테이블 구조 표현
404 Not Found
401 Unauthorized
403 Forbidden
500 Internal Server Error
CORS error
{
"success": true,
"message": "상담 신청이 완료되었습니다.",
"data": {
"id": 101
}
}
{
"success": false,
"message": "전화번호 형식이 올바르지 않습니다.",
"errorCode": "INVALID_PHONE_NUMBER"
}
GET, POST, PUT, PATCH, DELETE는 실무 API 설계에서 가장 자주 사용하는 HTTP 메서드입니다.401, 403, 404, 500, 502는 반드시 익숙해져야 합니다.