클라이언트에서 서버로의 데이터 전송
데이터 전달 방식은 크게 2가지로 나뉜다.
- 쿼리 파라미터를 통한 데이터 전송 -
GET
, 주로 정렬 필터(검색어) - 메시지 바디를 통한 데이터 전송 -
POST
,PUT
,PATCH
, 회원가입, 상품 주문, 등록, 변경
4가지 상황에 따른 데이터 전송 방법을 알아보자.
1. 정적 데이터 조회
- 이미지, 정적 텍스트 문서 등을 조회
GET
을 사용하며, 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순 조회가 가능하다.
2. 동적 데이터 조회
- 검색, 게시판 목록에서 정렬필터를 사용하면 쿼리파라미터를 사용하게 된다.
https://www.google.com/search?q=hello&hl=ko // 해당 주소로 요청
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
3. HTML Form 데이터 전송
HTML은 GET
과 POST
메서드만 지원
GET 전송 - 조회
- GET메서드는 조회에만 사용하며, 리소스 변경이 발생하는 곳에 사용할수 없다.
<form action="/members" method="get">
<input type="text" name="username" />
<input type="text" name="age" />
<button type="submit">전송</button>
</form>
GET /members?username=lightSourceCoder&age=26 HTTP/1.1
Host: localhost:8080
POST 전송 - 저장
<form action="/save" method="post">
<input type="text" name="username" />
<input type="text" name="age" />
<button type="submit">전송</button>
</form>
위의 html문서를 이용하면 브라우저가 요청 메시지를 생성한다.
POST /save HTTP/1.1
Host: localhost:8282
Content-Type: application/x-www-form-urlencoded
username=lightSourceCoder&age=26
Content-Type: application/x-www-form-urlencoded
사용
→ 전송데이터를 url encoding처리하고, form의 내용을 메시지 바디를 통해서 전송하는 방식이다.
POST 전송 - multipart/form-data
<form action="/save" method="post" enctype="multipart/form-data">
<input type="text" name="username" />
<input type="text" name="age" />
<input type="file" name="file1" />
<button type="submit">전송</button>
</form>
위의 코드에서는 <form>
에 enctype
속성에 추가해서 값으로 multipart/form-data
로 데이터를 보낼것으로 나타내었다.
POST /save HTTP/1.1
Host: localhost:8282
Content-Type: multipart/form-data; boundary=-----XXX
Content-Length: 10457
------XXX
Content-Disposition: form-data; name="username"
lightSourceCoder
------XXX
Content-Disposition: form-data; name="age"
26
------XXX
Content-Disposition: form-data; name="file1"; filename="intro.png"
Content-Type: image/png
109238a9o0p3eqwokjasd09ou3oirjwoe9u34ouief...
------XXX--
mutipart
전송 방식은 주로 파일업로드 같은 바이너리 데이터 전송시 사용한다.
4. API 데이터 전송
- 서버에서 서버간의 통신, 앱 클라이언트에서 사용
- 웹 클라이언트 - Form전송 대신 AJAX와 같은 자바 스크립트를 통한 통신에 사용
GET
: 쿼리 파라미터를 활용한 데이터 전송POST
,PUT
,PATCH
: 메시지 바디를 통해서 데이터 전송- Content-Type: appliation/json을 주로 사용
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
파일 관리 시스템 설계 - 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
HTML FORM 기반 등록의 특징
- GET, POST만 지원하므로 제약이 존재한다.
- 제약을 해결하기 위해 동사로 된 리소스의 경로를 사용한다.
- POST의 /new, /edit, /delete가 컨트롤 URI(동사 형태).
- HTTP 메서드로 해결하기 애매한 경우 사용(HTTP API 포함)
정리
HTTP API - 컬렉션
- POST 기반 등록
- 서버가 리소스 URI 결정
HTTP API - 스토어
- PUT 기반 등록
- 클라이언트가 리소스 URI 결정
HTML FORM 사용
- 순수 HTML + HTML form 사용
- GET, POST만 지원
참고하기 좋은 URI 설계 개념
- 문서 - 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row)
- 컬렉션(collection) - 서버가 관리하는 리소스 디렉터리(
/members
) - 스토어(store) - 클라이언트가 관리하는 자원 저장소(
/files
) - 컨트롤러(controller), 컨트롤 URI - 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행(
/members/{id}/delete
)
Reference
https://www.inflearn.com/course/http-웹-네트워크
반응형