출처
목차
클라이언트에서 서버로 요청하는 4가지 상황
- 정적 데이터 조회
- 이미지나 정적 텍스트 문서를 요청하는 경우입니다.
- 동적 데이터 조회
- 주로 검색 시에 검색어를 전달하거나, 게시판의 글 목록에서 글을 정렬할 때 필터로 사용될 데이터를 전달하는 경우입니다.
- HTML Form
- 예를 들어, 회원 가입 시의 데이터 묶음 또는 상품 주문 시의 데이터 묶음을 전달하는 경우입니다.
- HTTP API
- 서버 to 서버 통신
- 앱 클라이언트
- 웹 클라이언트 (Ajax)
- 예) 회원 가입, 상품 주문
데이터 전달 방식
클라이언트에서 서버로 데이터를 전달하는 방식에는 크게 2가지가 있습니다.
- 쿼리 파라미터(쿼리 스트링)을 통한 데이터 전송 (url)
- GET 메서드를 주로 사용합니다.
- 주로 검색 시에 검색어를 넘길 때 사용합니다. (필터)
- 게시판 리스트의 정렬 조건을 넘길 때 사용합니다. (정렬)
- 메시지 바디
- POST, PUT, PATCH 를 주로 사용합니다.
- 예를 들어, 회원가입, 상품 주문 시에 사용합니다.
1. 정적 데이터 조회
- 이미지나 정적 텍스트 문서 같은 경우에는 조회이므로 GET을 사용합니다.
- 정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회가 가능합니다.
- Content-Type: image/jpeg
2. 동적 데이터 조회
- 주로 검색 또는 게시판 글 목록을 정렬할 때 사용합니다. (검색어: q=hello, 필터: hl&ko (한국어))
- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건을 쿼리 파라미터로 넘길 때 주로 사용합니다.
- 조회는 GET을 사용합니다.
- GET은 대부분 쿼리 파라미터를 사용하여 데이터를 전달합니다.
3. HTML Form 데이터 전송
- HTML Form 전송은 GET, POST만 가능합니다. (PUT, PATCH, DELETE X)
POST 전송
- 웹 브라우저가 form을 읽어 HTTP 메시지를 전송합니다.
- submit 시 action 경로로 POST 전송됩니다.
- 예) 회원 가입, 상품 주문
- form 의 name 필드로 쿼리 파라미터와 같은 형식으로 (key-value) 메시지 바디를 구성합니다.
- 전송 데이터를 url encoding 처리하여 전송합니다.
- Content-Type: application/x-www-form-urlencoded
- 예) abc김 →(변경) abc%EA%B9%80
form을 GET으로 전송한다면?
- GET이므로 바디 대신 쿼리 파라미터에 넣습니다.
- save는 저장한다는 뜻이므로 GET을 사용하면 안됩니다.
- 리소스가 변경될 땐 GET을 사용하지 않습니다.
GET 전송
- 이름이 kim이고 나이가 20인 멤버를 조회할 때 GET을 사용할 수 있습니다.
multipart/form-data
- 파일 업로드 같은 바이너리 데이터 전송 시 사용합니다.
- byte로 되어 있는 이미지를 함께 전송하는 예제입니다.
- 인코딩 타입(enctype) 이 multipart/form-data로 되어 있습니다.
- 이미지를 선택하여 전송버튼을 누르면 오른쪽과 같이 브라우저가 요청 HTTP 메시지를 생성해 전송합니다.
- Content-Type: multipart/form-data;
- boundary-----XXX : 바운더리 ----XXX을 사용하여 구분한다는 뜻입니다.
- 다른 종류의 여러 파일과 폼의 내용을 함께 전송할 수 있습니다. (그래서 이름이 multipart)
4. HTTP API 전송
- 서버 to 서버
- 백엔드 시스템끼리 통신하는 경우입니다.
- 앱 클라이언트
- 아이폰, 안드로이드
- 웹 클라이언트
- HTML에서 Form 대신 자바 스크립트를 통한 통신을 하는 경우입니다. (Ajax)
- ex) React, Vue.js 와 같은 웹 클라이언트와 API 통신
- GET
- 조회
- 쿼리 파라미터로 데이터를 전달
- POST, PUT, PATCH
- 메시지 바디를 통해 데이터 전송
- Content-Type: application/json 을 주로 사용합니다. (사실상 표준)
- TEXT, XML, JSON 등이 있습니다.
HTTP API 설계 예시
POST과 PUT의 차이점을 중점적으로 알아보겠습니다.
POST | PUT |
컬렉션 | 스토어 |
예) 회원 등록 API | 예) 정적 컨텐츠 관리, 원격 파일 관리 |
회원 관리 시스템
API 설계
- 회원 목록 /members (GET)
- 회원 등록 /members (POST)
- 회원 조회 /members/{id} (GET)
- 회원 수정 /members/{id} (PATCH / PUT / POST)
- 회원 삭제 /members/{id} (DELETE)
POST의 신규 자원 등록 특징
- 클라이언트는 등록될 리소스의 URI를 모릅니다. ⭐
- 요청) POST /members
- 응답) HTTP/1.1 201 Create
Location: /members/100 - 위와 같이 서버가 새로 등록될 리소스 URI를 생성해줍니다.
이때 사용하는 것이 컬렉션 (Collection) 입니다.
❔컬렉션(Collection)
- 서버가 리소스의 URI를 생성하고 관리합니다.
- 서버가 관리하는 리소스 디렉토리입니다.
- 위 예제에서의 컬렉션은 /members 입니다.
파일 관리 시스템
API 설계
- 파일 목록 /files (GET)
- 파일 조회 /files/{filename} (GET)
- 파일 등록 /files/{filename} (PUT)
- 파일 삭제 /files/{filename} (DELETE)
- 파일 대량 등록 /files (POST)
파일 등록 시 POST가 아닌 PUT을 사용한 경우입니다.
등록에서 PUT을 사용하고 있기 때문에 다른 API에서 POST를 사용할 수 있습니다.
PUT의 신규 자원 등록 특징
- 클라이언트는 리소스 URI를 알고 있어야 합니다. ⭐
- 요청) PUT /files/{filename}
- ex) PUT /files/star.jpg
- 이 때, 기존의 파일이 있다면 덮고 없다면 생성하므로 PUT이 적합합니다.
- 서버가 URI를 생성해준 POST과 달리 클라이언트가 직접 리소스의 URI를 지정합니다.
이 때 사용하는 것이 스토어(Store)입니다.
❔스토어 (Store)
- 클라이언트가 리소스의 URI를 알고 관리합니다.
- 클라이언트가 관리하는 리소스 저장소입니다.
- 위 예제에서 스토어는 /files 입니다.
대부분은 Post 기반의 Collection 방법을 많이 사용합니다.
HTML Form 추가 예시
- HTML Form은 GET과 POST만 지원합니다.
- 두 개의 메서드만을 사용하여 API를 설계하는 예시를 보겠습니다.
- 아래 설계 이외에도 Ajax 같은 기술을 사용하면 다른 메서드들을 사용하여 설계할 수 있습니다. (회원 API 참고)
- 순수 HTML, HTML Form만을 사용하여 설계해보겠습니다.
회원 API 설계
- 회원 등록 폼 /members/new (GET) : 회원 등록 폼을 요청
- 회원 등록 /members/new or /members (POST) : 회원 정보를 입력 후 submit 클릭
- 회원 목록 /members(GET)
- 회원 조회 /members/{id} (GET)
- 회원 수정 폼 /members/{id}/edit (GET) : 한 사용자의 회원정보 수정 폼을 요청
- 회원 수정 /members/{id}/edit or /members/{id} (POST) : 회원 정보를 수정한 후 완료 클릭
- 회원 삭제 /members/{id}/delete (POST)
위와 같이 자원과 HTTP method 로는 URI를 식별하는데 한계가 있어 동사를 사용하는 경우가 있습니다.
이를 컨트롤 URI라고 부릅니다.
❔컨트롤 URI
- HTML Form은 GET, POST 만 지원하도록 제약이 있습니다.
- 이런 제약을 해결하기 위해 동사로 된 리소스 경로를 사용합니다.
- POST의 /new, /edit, /delete 가 컨트롤 URI 입니다.
- 컨트롤 URI는 HTTP 메서드로 해결하기 애매한 경우에만 사용합니다.
참고하면 좋을 URI 설계 개념
- 문서 (document)
- 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row)
- 예) /members/100, /files/star.jpg
- 컬렉션 (collection)
- 서버가 관리하는 리소스 디렉터리
- 서버가 리소스의 URI를 생성하고 관리
- 예) /members
- 스토어 (store)
- 클라이언트가 관리하는 자원 저장소
- 클라이언트가 리소스의 URI를 알고 관리
- 예) /files
- 컨트롤러(controller), 컨트롤 URI
- 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행
- 동사를 직접 사용
- 예) /members/{id}/delete
'CS > 네트워크' 카테고리의 다른 글
[HTTP] HTTP Header1 (표현 Header, 협상 ) (0) | 2023.05.02 |
---|---|
[HTTP] HTTP 상태 코드 (0) | 2023.04.20 |
[HTTP] HTTP Method (0) | 2023.04.17 |
[네트워크] CORS에 대해 알아보자 (0) | 2023.04.13 |
[HTTP] HTTP 기본 (무상태, 비연결성, HTTP 메시지 구조) (0) | 2023.04.12 |