공부/spring

[HTTP] Method

bitamango 2026. 4. 28. 17:18

* API URI 설계

- URI 계층 구조를 활용하여 리소스 식별을 하는 것이 중요하다

    ex) 회원 등록, 회원 수정, 회원 조회 등에서 resource는 회원이다.

    --> 회원 resource를 URI에 mapping해야한다.

- URI는 resource만 식별함

    - 리소스(명사)와 행위(동사)를 분리해야함


 

Method

 

* GET : resource 조회

- 데이터는 query(parameter, String)를 통해서 전달

- message body 사용해서 데이터 전달 가능. but 지원하는 곳이 잘 없어서 권장하지 않음

 

* POST : 요청 데이터 처리.

- message body 통해서 서버로 요청 데이터를 전달함

    --> 서버는 요청 데이터 처리 (데이터 처리하는 모든 기능 수행)

- 주로 전달된 데이터는 신규 resource 등록, process 처리에 사용함

- 요청 데이터 처리 : 대상 resource가 고유의 한 의미 체계에 따라 요청에 포함된 표현을 처리하도록 요청

    ㄴ HTML 양식에 입력된 필드와 같은 데이터 블록 --> 데이터 처리 프로세스에 제공

        ex) HTML FORM에 입력한 정보로 회원가입, 주문 등 사용됨

    ㄴ 게시판, 뉴스 그룹, 메일링 리스트, 블로그, 유사한 기사 그룹에 message 게시

        ex) 게시판 글쓰기, 댓글 달기

    ㄴ 서버가 식별하지 않은 새 resource 생성

        ex) 신규 주문 생성

    ㄴ 기존 resource에 데이터 추가

        ex) 문서 끝에 내용 추가

--> resource URI에 POST 요청 시 요청 데이터를 resource별로 어떻게 처리해야할지 정해야함 (정해진 것이 없음)

- 요청 데이터 처리할 때, 단순히 데이터 생성하거나 변경하는 것을 넘어 프로세스를 처리해야하는 경우

    ㄴ POST 결과로 새로운 resource가 생성되지 않을 수 있음 (ex : 주문 -> 결제 완료 -> 배달 시작 -> 배달 완료)

    --> 기본적으로는 resource로 최대한 URI를 설계하고, 어쩔 수 없는 경우에는 Control URI로 설계해야 한다.

- 다른 method로 처리하기 애매한 경우

    - JSON으로 조회 데이터를 넘길 때 GET method를 사용하기 어려운 경우(애매한 경우) --> POST 사용

 

*** 조회하는 경우만 GET을 사용하고, 나머지의 경우에는 POST를 사용하면 된다.

 

* PUT : resource 대체 (덮어쓰기). 해당 resource 없는 경우엔 생성

- Client가 resource를 리소스 위츠를 알고 URI를 지정한다. 즉, resource를 식별함 (POST와의 차이점)

- 주의 : 기존에 있는 resource에 맞지 않게 전송하는 경우 --> resource 자체를 덮어쓰기 때문 (기존 정보 삭제됨)

 

* PATCH : resource 부분 변경 (이름 변경, 특정 필드 변경 등)

- PUT과 달리, 기존 resource를 덮어쓰지 않고, 부분 resource만 변경함

- HTTP에서 PATCH 자체를 받아들이지 못하는 경우 --> POST 사용하면 해결됨

 

* DELETE : resource 삭제

 

 

* 기타

- HEAD : GET과 동일하지만 message부분 제외하고 상태 줄과 header만 변환

- OPTIONS : 대상 resource에 대한 통신 가능 옵션(메서드)을 설명해줌 (주로 CORS에서 사용됨)

- CONNECT : 대상 resource로 식별되는 서버에 대한 터널 설정

- TRACE : 대상 resource에 대한 경로 따라 message loofback test 수행


출처 : 위키피디아

 

Method 속성

 

* 안전 : Safe methods

- method를 호출했을 때 서버 상태(데이터)를 변경하지 않는 성질

- 그러나 단순히 조회만 하기 때문에, 여러 번 호출해도 서버 데이터는 그대로 유지됨

    --> 로그가 쌓여 장애가 생겨도, 해당 resource만 고려함

 

* 멱등 : Idempotent Methods

- 호출을 반복해도 결과는 동일하는 성질

- 자동 복구 매커니즘을 사용하여, 서버가 TIMEOUT 등으로 정상 응답을 주지 못했을 경우

     --> Client가 같은 요청을 해도 되는지 판단 근거를 마련함

- 그러나 재요청 중 외부 요인에 의해 중간에 resource가 변경되는 것까지 고려하지 않음

- GET, PUT, DELETE는 몇 번을 반복해도 결과가 동일

- POST는 요청으로 결제가 반복해서 일어나면 안되는 것처럼, 새로운 resource가 생기거나 중복처리 될 수 있음에 주의해야 함

 

* 캐시 가능 : Cacheable Methods

- 응답 결과 resource를 저장해서 다시 사용할 수 있는가에 대한 것

- web browser처럼 서버로부터 받은 응답을 저장한 뒤, 다음 요청 때 서버에 가지 않고 꺼내 써도 되는지를 의미

- GET, HEAD, POST, PATCH 캐시 사용이 가능하지만, 실제로는 GET, HEAD까지만 캐시로 사용한다

    - POST, PATCH는 본문 내용까지 캐시 키로 고려해야하기 때문에 구현이 어려움


 

Client --> Server 데이터 전송

 

* 전송 방법

 

1. Query Parameter를 통한 데이터 전송

- GET을 사용

    ex) 정렬 필터(검색어)

 

2. Message Body를 통한 데이터 전송

- POST, PUT, PATCH를 사용

    ex) 회원 가입, 상품 주문, 리소스 등록, 리소스 변경 등


 

* 상황

 

1. 정적 데이터 조회

- GET으로 조회 

- 일반적으로 query parameter 없이 resource 경로로 단순하게 조회 가능

    ex) 이미지, 정적 텍스트 조회

 

2. 동적 데이터 조회

- GET으로 조회하며, query parameter 사용하여 데이터 전달

- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용함

    ex) 검색, 게시판 목록에서의 정렬 필터 및 검색어

 

3. HTML Form을 통한 데이터 전송

- POST로 전송과 저장

    ex) 회원 가입, 상품 주문, 데이터 변경

- 주의 : GET으로도 전송과 저장이 가능하지만, GET은 조회로만 사용해야함. 리소스 변경이 발생하는 곳에서 사용하면 안됨

- Content-Tyep : application/x-www-form-urlencoded 사용

    ㄴ form 내용을 message body 통해서 전송. (key=value, query parameter 형식)

    ㄴ 전송 데이터를 url encoding 처리

        ex) abc김 -> abc%EA%B9%80 (utf-8 인코딩)

- Content-Type : multipart/form-data

    ㄴ 파일 업로드 같은 binary data 전송 시 사용

    ㄴ 다른 종류의 여러 파일과 폼 내용을 같이 전송 가능

- GET, POST만 지원함 (GET은 되도록 사용 x)

 

4. HTTP API를 통한 데이터 전송

- 서버 - 서버 : 백엔드 시스템 통신

- App Client : 아이폰, 안드로이드

- Web Client : HTML에서 Form 전송 대신 AJAX와 같은 자바 스크립트 통한 통신에 사용

    ex) React, VueJs

- POST, PUT, PATCH : message body를 통한 데이터 전송

- GET : 조회, query parameter로 데이터 전달

- Content-Type : application/json을 표준으로 주로 사용함

    ex) TEXT, XML, JSON 등


 

*** HTTP API 설계 예시

 

* HTTP API - Collection

- Client는 데이터를 보낼 때 어디에 저장될지 모르는 상태이며, Server가 데이터 받고 내부적으로 ID를 생성하고 주소를 결정함

- Server가 관리하는 resource 저장소

- Server가 resource의 URI를 알고 관리

    ex) /members/100 (collection : /members)

 

* HTTP API  - Store

- Client가 저장될 위치를 이미 알고 요청을 보냄

- Client가 관리하는 resource 저장소

- Client가 resource의 URI를 알고 관리

    ex) /files/ex.jpg (store : /files)

 

- HTTP API는 Collections을 주로 쓰며, PUT을 쓰는 경우는 파일 업로드 이외에 거의 없음

 

* HTML FORM 사용

- web browser의 순수 HTML FORM은 GET과 POST만 사용할 수 있는 제약적인 방식

- PUT, DELETE 등 사용하기 위해선 Control URI를 사용함

    --> 사용하기 위해 method 대신 URI 경로에 동작을 포함시킴

    ex) POST /members/100/edit or delete

    ㄴ 명사 위주로 설계하는 것이 원칙이지만, FORM에서는 예외적으로 허용한다.


 

간단정리

 

* document

- 단일 개념 (파일, 객체 인스턴스, 데이터베이스 row)

    ex) /members/100, /files/ex.jpg

 

* collection

- server가 관리하는 resource 저장소

- server가 resource의 URI 생성 및 관리

    ex) /members

 

* store

- Client가 관리하는 resource 저장소

- Client가 resource의 URI를 미리 알고 관리

    ex) /files

 

* controller, controller URi

- 문서, collection, store로 해결하기 어려운 추가 process 실행

- 동사를 직접 사용

    ex) /members/{id}/delete

 

 

 

 

 

참고 사이트 : REST API Tutorial

https://restfulapi.net/resource-naming/

'공부 > spring' 카테고리의 다른 글

[HTTP] Header - 일반  (0) 2026.04.30
[HTTP] State Code  (2) 2026.04.29
[HTTP] HTTP 특징  (0) 2026.04.27
[HTTP] Internet Network, URI  (0) 2026.04.27
[Spring] Bean Scope  (2) 2026.04.25