HTTP 메서드 활용
7분 읽기
클라이언트에서 서버로 데이터 전송
데이터 전달 방식은 크게 2가지입니다.
- 쿼리 파라미터를 통한 데이터 전송
- GET
- 정렬 필터 (검색어)
- 메시지 바디를 통한 데이터 전송
- POST, PUT, PATCH
- 회원가입, 상품주문, 리소스 등록, 리소스 변경
4가지 데이터 전송 방식
정적 데이터 조회
- 이미지, 정적 텍스트 문서
- 쿼리 파라미터를 사용하지 않습니다.
- 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회할 수 있습니다.
동적 데이터 조회
- 주로 검색, 게시판 목록에서 정렬 필터(검색어)에 사용합니다.
- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용합니다.
- 쿼리 파라미터를 기반으로 정렬 필터해서 결과를 동적으로 생성합니다.
HTML Form을 통한 데이터 전송
GET과POST만 지원합니다.- 회원 가입, 상품 주문, 데이터 변경에 사용합니다.
POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
username=kim&age=20
전송 내용을 URL encoding 처리합니다.
예) abc김 → abc%EA%B9%80
- 조회할 경우
GET /members?username=kim&age=20 HTTP/1.1
Host: localhost:8080
- multipart/form-data
POST /save HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=----XXX
Content-Length: 10457
------XXX
Content-Disposition: form-data; name="username"
kim
------XXX
Content-Disposition: form-data; name="age"
20
------XXX
Content-Disposition: form-data; name="file1"; filename="intro.png"
Content-Type: image/png
109238a9o0p3eqwokjasd09ou3oirjwoe9u34ouief...
------XXX--
- 파일 업로드 같은 바이너리 데이터 전송 시 사용합니다.
- 다른 종류의 여러 파일과 폼의 내용을 함께 전송할 수 있습니다.
HTTP API를 통한 데이터 전송
POST /members HTTP/1.1
Content-Type: application/json
{
"username": "young",
"age": 20
}
- 회원 가입, 상품 주문, 데이터 변경에 사용합니다.
- 서버 to 서버
- 백엔드 시스템 통신
- 앱 클라이언트
- 아이폰, 안드로이드
- 웹 클라이언트(Ajax)
- HTML에서 Form 전송 대신 자바스크립트를 통한 통신에 사용합니다.
- React, Vue.js와 같은 웹 클라이언트와 통신합니다.
- HTML Form과 다르게 PUT이나 PATCH도 사용할 수 있습니다.
- GET: 조회, 쿼리 파라미터로 데이터 전달
- POST, PUT, PATCH: 메시지 바디를 통해 데이터 전송
Content-Type: application/json을 주로 사용합니다.- TEXT, XML, JSON 등
HTTP API 설계 예시
HTTP API - 컬렉션 (POST 기반 등록)
- 회원 목록
/members→ GET - 회원 등록
/members→ POST - 회원 조회
/members/{id}→ GET - 회원 수정
/members/{id}→ PATCH, PUT, POST - 회원 삭제
/members/{id}→ DELETE
POST 기반 등록 시, 클라이언트는 등록될 리소스의 URI를 모릅니다. 서버가 새로 등록된 리소스 URI를 생성합니다.
HTTP/1.1 201 Created
Location: /members/100
컬렉션(Collection)이란 서버가 관리하는 리소스 디렉토리입니다. 서버가 리소스의 URI를 생성하고 관리합니다. 여기서 컬렉션은 /members입니다.
HTTP API - 스토어 (PUT 기반 등록)
- 파일 목록
/files→ GET - 파일 조회
/files/{filename}→ GET - 파일 등록
/files/{filename}→ PUT - 파일 삭제
/files/{filename}→ DELETE - 파일 대량 등록
/files→ POST
PUT 기반 신규 자원 등록 시, 클라이언트가 리소스 URI를 알고 있어야 합니다.
- 예) PUT
/files/star.jpg
클라이언트가 직접 리소스의 URI를 지정합니다.
스토어(Store)란 클라이언트가 관리하는 리소스 저장소입니다. 클라이언트가 리소스의 URI를 알고 관리합니다. 여기서 스토어는 /files입니다.
HTML FORM 사용
HTML FORM은 GET, POST만 지원합니다.
- 회원 목록
/members→ GET - 회원 등록 폼
/members/new→ GET - 회원 등록
/members/new,/members→ POST - 회원 조회
/members/{id}→ GET - 회원 수정 폼
/members/{id}/edit→ GET - 회원 수정
/members/{id}/edit,/members/{id}→ POST - 회원 삭제
/members/{id}/delete→ POST
GET, POST만 지원하므로 제약이 있습니다. 제약을 해결하기 위해 동사로 된 리소스 경로를 사용합니다. POST의 /new, /edit, /delete가 컨트롤 URI이며, HTTP 메서드로 해결하기 애매한 경우에 사용합니다.
참고하면 좋은 URI 설계 개념
문서(document)
- 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row)
- 예)
/members/100,/files/star.jpg
컬렉션(collection)
- 서버가 관리하는 리소스 디렉터리
- 서버가 리소스의 URI를 생성하고 관리
- 예)
/members
스토어(store)
- 클라이언트가 관리하는 자원 저장소
- 클라이언트가 리소스의 URI를 알고 관리
- 예)
/files
컨트롤러(controller), 컨트롤 URI
- 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행
- 동사를 직접 사용
- 예)
/members/{id}/edit