[Coding] Rest API

Jung Geun Oh·2025년 8월 8일
0

Coding

목록 보기
1/4
post-thumbnail

Rest API에서 GET 과 POST는 가장 기본적이면서도 중요한 HTTP 메서드입니다. 목적과 차이점을 정리하겠습니다.


🔹 1. 목적 차이

메서드용도
GET서버에서 **데이터를 조회(읽기)**할 때 사용
POST서버에 **데이터를 전송(생성/처리)**할 때 사용


🔹 2. 예시

  • GET 예시
http
복사편집
GET /users/123

👉 사용자 123번의 정보를 요청 (서버는 데이터를 읽어서 반환)


  • POST 예시
http
복사편집
POST /users
Body: { "name": "JKOH", "email": "test@example.com" }

👉 서버에 새 사용자 정보를 보내서 생성하는 요청



🔹 3. 주요 차이점

항목GETPOST
데이터 전송 위치URL (쿼리스트링 등)HTTP Body
데이터 용량적음 (URL 길이 제한 있음)큼 (Body에 자유롭게 담을 수 있음)
캐싱가능 (브라우저/프록시 등에서 캐싱됨)기본적으로 캐싱 안 됨
안전성안전함 (단순 조회)안전하지 않을 수 있음 (서버 상태 변경 가능)
멱등성있음 (같은 요청 반복해도 결과 동일)없음 (요청 반복 시 데이터 중복 생성 등 부작용 가능)



🔹 4. 정리된 핵심 요약

구분GETPOST
목적데이터 "조회"데이터 "전송/생성"
데이터 위치URLRequest 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만 쓰는 경우도 있는데, 서버가 명확히 구분해주는 게 중요합니다.


예제


  • URL Json 구조
{
  "id": 123,
  "name": "JKOH",
  "email": "test@example.com",
  "created_at": "2025-07-02T09:20:00Z"
}

  •  Unity에서 해당 구조 받을 때 Class
[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;
}

  • GET : 사용자 조회
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);
        }
    }
}


  • PUT : 전체 사용자 정보 수정
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);
        }
    }
}

  • DELETE : 사용자 삭제
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));
}
profile
Keep Learning!

0개의 댓글