Rest API에서 GET 과 POST는 가장 기본적이면서도 중요한 HTTP 메서드입니다. 목적과 차이점을 정리하겠습니다.
🔹 1. 목적 차이
| 메서드 | 용도 |
|---|
| GET | 서버에서 **데이터를 조회(읽기)**할 때 사용 |
| POST | 서버에 **데이터를 전송(생성/처리)**할 때 사용 |
🔹 2. 예시
http
복사편집
GET /users/123
👉 사용자 123번의 정보를 요청 (서버는 데이터를 읽어서 반환)
http
복사편집
POST /users
Body: { "name": "JKOH", "email": "test@example.com" }
👉 서버에 새 사용자 정보를 보내서 생성하는 요청
🔹 3. 주요 차이점
| 항목 | GET | POST |
|---|
| 데이터 전송 위치 | URL (쿼리스트링 등) | HTTP Body |
| 데이터 용량 | 적음 (URL 길이 제한 있음) | 큼 (Body에 자유롭게 담을 수 있음) |
| 캐싱 | 가능 (브라우저/프록시 등에서 캐싱됨) | 기본적으로 캐싱 안 됨 |
| 안전성 | 안전함 (단순 조회) | 안전하지 않을 수 있음 (서버 상태 변경 가능) |
| 멱등성 | 있음 (같은 요청 반복해도 결과 동일) | 없음 (요청 반복 시 데이터 중복 생성 등 부작용 가능) |
🔹 4. 정리된 핵심 요약
| 구분 | GET | POST |
|---|
| 목적 | 데이터 "조회" | 데이터 "전송/생성" |
| 데이터 위치 | URL | Request Body |
| 캐싱 가능 여부 | 가능 | 불가능 (기본적으로) |
| 멱등성 | 있음 | 없음 |
| 일반 사용 예 | 조회, 리스트 불러오기 등 | 회원가입, 로그인, 주문하기 등 |
✅ 결론적으로:
- 데이터를 읽어오려면
GET
- 서버에 데이터를 보내서 등록하거나 처리하려면
POST
📌 PUT과 DELETE는 무엇을 위한 메서드인가요?
| 메서드 | 목적 |
|---|
| PUT | 리소스를 "수정"하거나 "전체 대체" 할 때 사용 |
| DELETE | 리소스를 삭제할 때 사용 |
🔹 PUT – 업데이트 요청
✅ 사용 목적
- 서버의 특정 리소스를 지정된 값으로 업데이트 (보통 전체 수정)
✅ 예시
http
복사편집
PUT /users/123
Body: { "name": "JKOH", "email": "new@example.com" }
➡️ 사용자 123의 정보를 주어진 값으로 완전히 교체
✅ 특징
| 항목 | 설명 |
|---|
| 멱등성 | O (같은 요청을 여러 번 보내도 같은 결과) |
| 전체 대체 | 보통은 전체 리소스를 덮어씀 |
| 부분 수정은? | PATCH를 사용하는 것이 더 적절 |
🔹 DELETE – 삭제 요청
✅ 사용 목적
✅ 예시
http
복사편집
DELETE /users/123
➡️ 사용자 123번 계정 삭제 요청
✅ 특징
| 항목 | 설명 |
|---|
| 멱등성 | O (이미 삭제된 리소스를 다시 삭제해도 결과는 동일) |
| Body 포함 여부 | 보통은 없음, 필요 시 포함 가능 (권장 X) |
✅ 4가지 메서드 전체 비교 요약
| 메서드 | 목적 | 요청 데이터 위치 | 멱등성 | 예시 |
|---|
GET | 리소스 조회 | URL (쿼리) | ✅ 있음 | /users/123 |
POST | 리소스 생성 | Body | ❌ 없음 | /users |
PUT | 리소스 전체 수정 | Body | ✅ 있음 | /users/123 |
DELETE | 리소스 삭제 | (Body 거의 없음) | ✅ 있음 | /users/123 |
🩹 PATCH – 리소스 일부만 수정할 때 사용하는 메서드
✅ 사용 목적
- 기존 리소스의 일부 필드만 업데이트할 때 사용
PUT이 전체 교체라면, PATCH는 부분 변경
✅ 예시
http
복사편집
PATCH /users/123
Body: { "email": "newemail@example.com" }
➡️ 사용자 123의 email만 변경, 나머지 정보는 그대로 유지
✅ 특징
| 항목 | 내용 |
|---|
| 목적 | 일부 필드만 변경 |
| 데이터 위치 | Body |
| 멱등성 | ❌ 보장되지 않음 (서버 구현 방식에 따라 다름) |
| 용도 예시 | 사용자 이름만 변경, 비밀번호만 재설정 등 |
| 성능 | PUT보다 가볍고 효율적 (변경 필드만 전송) |
📌 5가지 REST API 메서드 최종 비교 정리표
| 메서드 | 목적 | 데이터 위치 | 멱등성 | 설명 |
|---|
| GET | 조회 | URL | ✅ 있음 | 데이터 가져오기 |
| POST | 생성 | Body | ❌ 없음 | 새 데이터 등록 |
| PUT | 전체 수정 | Body | ✅ 있음 | 리소스 전체 교체 |
| DELETE | 삭제 | (Body 없음) | ✅ 있음 | 리소스 제거 |
| PATCH | 부분 수정 | Body | ❌ 없음 (보통) | 리소스 일부 필드만 변경 |
💬 예시 비교 (/users/123 대상)
| 메서드 | 설명 |
|---|
| GET | 사용자 123의 정보를 가져온다 |
| POST | 새 사용자를 등록한다 |
| PUT | 사용자 123의 정보를 통째로 새로 쓴다 |
| PATCH | 사용자 123의 일부 정보만 수정한다 (예: 이름만 바꿈) |
| DELETE | 사용자 123을 삭제한다 |
✅ 개발 팁
- 사용자 이름만 바꾸거나 설정만 수정할 땐
PATCH가 가장 적합합니다.
- 대부분의 RESTful API 서버(예: Django REST, Express.js, FastAPI)는
PATCH 메서드 지원합니다.
- 모바일·프론트엔드에서는 PATCH보다 PUT만 쓰는 경우도 있는데, 서버가 명확히 구분해주는 게 중요합니다.
예제
{
"id": 123,
"name": "JKOH",
"email": "test@example.com",
"created_at": "2025-07-02T09:20:00Z"
}
[System.Serializable]
public class UserResponse
{
public int id;
public string name;
public string email;
public string created_at;
}
// 받을 때
// UserResponse user = JsonUtility.FromJson<UserResponse>(request.downloadHandler.text);
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
[System.Serializable]
public class UserResponse
{
public int id;
public string name;
public string email;
public string created_at;
}
[System.Serializable]
public class UserRequest
{
public string name;
public string email;
}
[System.Serializable]
public class EmailOnly
{
public string email;
}
IEnumerator GetUser(int userId)
{
string url = $"https://example.com/api/users/{userId}";
using (UnityWebRequest request = UnityWebRequest.Get(url))
{
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string json = request.downloadHandler.text;
UserResponse user = JsonUtility.FromJson<UserResponse>(json);
Debug.Log($"[GET] 이름: {user.name}, 이메일: {user.email}");
}
else
{
Debug.LogError("[GET] 실패: " + request.error);
}
}
}
- POST : 새 사용자 생성 (id, created_at은 서버 로직에서 값 넣는다는 가정)
IEnumerator CreateUser(string name, string email)
{
string url = "https://example.com/api/users";
UserRequest data = new UserRequest { name = name, email = email };
string jsonData = JsonUtility.ToJson(data);
using (UnityWebRequest request = new UnityWebRequest(url, "POST"))
{
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string json = request.downloadHandler.text;
UserResponse user = JsonUtility.FromJson<UserResponse>(json);
Debug.Log($"[POST] 생성된 ID: {user.id}");
}
else
{
Debug.LogError("[POST] 실패: " + request.error);
}
}
}
IEnumerator UpdateUser(int userId, string name, string email)
{
string url = $"https://example.com/api/users/{userId}";
UserRequest data = new UserRequest { name = name, email = email };
string jsonData = JsonUtility.ToJson(data);
using (UnityWebRequest request = new UnityWebRequest(url, "PUT"))
{
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string json = request.downloadHandler.text;
UserResponse user = JsonUtility.FromJson<UserResponse>(json);
Debug.Log($"[PUT] 수정된 이름: {user.name}");
}
else
{
Debug.LogError("[PUT] 실패: " + request.error);
}
}
}
- PATCH : 정보 일부 수정 (이메일 변경할 시)
IEnumerator PatchUser(int userId, string newEmail)
{
string url = $"https://example.com/api/users/{userId}";
EmailOnly data = new EmailOnly { email = newEmail };
string jsonData = JsonUtility.ToJson(data);
using (UnityWebRequest request = new UnityWebRequest(url, "PATCH"))
{
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string json = request.downloadHandler.text;
UserResponse user = JsonUtility.FromJson<UserResponse>(json);
Debug.Log($"[PATCH] 새 이메일: {user.email}");
}
else
{
Debug.LogError("[PATCH] 실패: " + request.error);
}
}
}
IEnumerator DeleteUser(int userId)
{
string url = $"https://example.com/api/users/{userId}";
using (UnityWebRequest request = UnityWebRequest.Delete(url))
{
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("[DELETE] 성공적으로 삭제됨");
}
else
{
Debug.LogError("[DELETE] 실패: " + request.error);
}
}
}
void Start()
{
StartCoroutine(GetUser(123));
StartCoroutine(CreateUser("JKOH", "test@example.com"));
StartCoroutine(UpdateUser(123, "JKOH", "update@example.com"));
StartCoroutine(PatchUser(123, "patch@email.com"));
StartCoroutine(DeleteUser(123));
}