티스토리 뷰

해당 글은 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의를 수강하고 정리한 게시글입니다.

HTTP 메서드 활용

지난 [Network] 05. HTTP 메서드에서는 서버에서 클라이언트로 전송받을 때만 예시를 들었기 때문에 이번에는 클라이언트에서 서버로 데이터 전송과 HTTP 메서드를 어떻게 설계하는지 예시를 통해 알아보자.

클라이언트에서 서버로 데이터 전송

데이터 전달 방식은 크게 2가지이다.

1. 쿼리 파라미터를 통한 데이터 전송
GET 메서드나 정렬 필터(검색어)를 사용할 때 많이 사용한다.
예시: GET /search?q=hello&hl=ko

 

2. 메시지 바디를 통한 데이터 전송
POST, PUT, PATCH 메서드에서 회원 가입, 상품 주문, 리소스 등록, 리소스 변경시에 사용한다.

 

이제 이 2가지 전송 방식을 4가지 상황을 예시로 들어서 알아보자.

1. 정적 데이터 조회

  • 이미지, 정적 텍스트 문서

2. 동적 데이터 조회

  • 주로 검색, 게시판 목록에서 정렬 필터(검색어)

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

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

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

  • 회원 가입, 상품 주문, 데이터 변경
  • 서버 to 서버, 앱 클라이언트, 웹 클라이언트(Ajax)

정적 데이터 조회

간단하게 정적 데이터 조회의 경우는 쿼리 파라미터없이 리소스 경로로 단순하게 조회가 가능하다.


클라이언트에서 정적 데이터(이미지, 정적 텍스트 문서)를 조회하기 위해 리소스 경로만 지정하주면 조회(GET 메서드 사용)가 가능하다.

동적 데이터 조회


주로 검색, 게시판 목록에서 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 조건을 위해 주로 사용된다. (이 역시 조회이기 때문에 GET을 사용)

이때 서버에서 쿼리 파라미터를 key = value 형태로 꺼내서 찾고 응답 해준다.

참고:
GET은 쿼리 파라미터를 사용해서 데이터를 전달한다.
또한 GET은 메시지 바디를 통해 데이터를 전송할 수 있지만 지원하지 않는 경우가 많아 사용하지 않는다.

HTML Form을 통한 데이터 전송


HTML에서 위의 그림과 같은 형태로 FORM을 만들어서 전송버튼을 누르게 되면 웹 브라우저가 해당 FORM을 가지고 오른쪽과 같은 요청 메시지를 만들어준다. (이때, 넘어온 데이터를 보면 key = value와 비슷한 형태를 갖고 있다.)

 

이때 만약 POST메서드를 GET으로 바꾸면?

POST를 GET으로 바꿔서 전송 버튼을 누르면 웹 브라우저가 요청 메시지를 GET 메서드로 바꾸고 메시지 바디 대신 쿼리 파라미터에 넣어서 전달한다.(GET이기 때문에)

주의 :
GET은 조회에서만 사용하고 리소스 변경이 발생하는 곳에서는 사용하면 안된다!

 

데이터를 전송할때 기본 형식은 application/x-www-form-urlencoded 의 형식이지만 (한글 같은경우 인코딩되서 넘어가기 때문에) 다음과 같이 여러 데이터가 전송되는 경우는 아래 그림과 같이 multipart/form-data의 형식을 갖는다.


오른쪽 웹 브라우저가 생성한 요청 메시지를 보면 메시지 바디에 필드의 이름과 구분자(“——XXX”)위에 값을 나타낸다.

참고 : multipart/form-data는 네임뿐만 아니라 바이트로 되있는 사진도 같이 전송하기 때문에(여러 종류의 데이터 쓸 때) 이 형식을 사용한다. 또한 HTML FORM 전송은 GET, POST만 지원하기 때문에 PUT, PATCH 대신 POST로 처리해야한다.

정리

HTML Form submit시 POST 전송

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

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

  • form의 내용을 메시지 바디를 통해서 전송(key=value, 쿼리 파라미터 형식)
  • 전송 데이터를 url encoding 처리 (예: abc김 -> abc%EA%B9%80 )

Content-Type: multipart/form-data

  • 파일 업로드 같은 바이너리 데이터 전송시 사용
  • 다른 종류의 여러 파일과 폼의 내용 함께 전송 가능(그래서 이름이 multipart)
    (HTML Form은 GET 전송도 가능 조회시 사용)

HTTP API를 통한 데이터 전송

안드로이드나 아이폰 애플리케이션에서 클라이언트에서 서버로 바로 데이터 전송하거나 서버에서 서버로 전송할 때 사용한다.


이 경우는 위의 요청 메시지를 직접 만들어서 넘긴다. (이때는 라이브러리 사용)

정리

서버에서 서버로

  • 백엔드 시스템 통신

앱 클라이언트

  • 아이폰, 안드로이드

웹 클라이언트

  • HTML에서 Form 전송 대신 자바 스크립트를 통한 통신에 사용(AJAX)
  • 예) React, VueJs 같은 웹 클라이언트와 API 통신

 

Content-Type: application/json을 주로 사용 (사실상 표준)

  • TEXT, XML, JSON 등등도 있다.

참고:
HTML Form과 다르게 API 데이터 전송은 다음과 같은 메서드들을 다 사용할 수 있다.
POST, PUT, PATCH: 메시지 바디를 통해 데이터 전송
GET: 조회, 쿼리 파라미터로 데이터 전달

HTTP API 설계 예시

위에서 데이터 전송 상황에서 알아봤다면 이제 APIHTML FORM을 사용해서 URI를 어떻게 설계해야될 지 예시를 통해 알아보자.

보통 설계를 하게 될 경우 크게 다음 3가지로 나누어진다.

 

1. HTTP API - 컬렉션

  • POST기반 등록
  • 예) 회원 관리 API 제공

2. HTTP API - 스토어

  • PUT기반 등록
  • 예) 정적 컨텐츠 관리, 원격 파일 관리

3. HTML FORM 사용

  • 웹 페이지 회원 관리
  • GET, POST만 지원

위 3가지 경우를 회원 관리 및 파일 관리 시스템에 예를 들어 알아보자.
(여기서, HTTP API를 컬랙션과 스토어로 나눈 것은 URI 설계 시 좋은 Pracice들을 가지고 체계를 나눈 것이다.)

참고 : REST Resource Naming Guide

HTTP API - 컬랙션

컬랙션은 API 설계시 POST 기반 등록에 따른 것이고 해당 방식으로 회원 관리 시스템을 설계하면 다음과 같다.

 

[API 설계 - POST 기반 등록]
회원 목록 /members -> GET
회원 등록 /members -> POST
회원 조회 /members/{id} -> GET
회원 수정 /members/{id} -> PATCH, PUT, POST
회원 삭제 /members/{id} -> DELETE

참고:
회원 수정에서 개념적으로는 PATCH가 제일 좋다.
PUT은 완전히 덮어도 될 때(예: 게시판에서 게시글 수정)
이것도 저것도 애매할 땐 천하무적 POST 사용

 

[POST - 신규 자원 등록 특징]
1. 클라이언트는 등록될 리소스의 URI를 모른다.
예시:
회원 등록 /members -> POST

 

2. 서버가 새로 등록된 리소스 URI(리소스의 식별자)를 생성해준다.
예시 :
HTTP/1.1 201 Created
Location: /members/100

참고:
컬랙션(Collection) 은 서버가 관리하는 리소스 디렉토리이며 서버가 리소스의 URI를 생성하고 관리한다. (여기서 컬랙션은 /members)

HTTP API - 스토어

스토어는 API 설계시 PUT 기반 등록에 따른 것이고 해당 방식으로 파일 관리 시스템을 설계하면 다음과 같다.

 

[API 설계 - PUT 기반 등록]
파일 목록 /files -> GET
파일 조회 /files/{filename} -> GET
파일 등록 /files/{filename} -> PUT
파일 삭제 /files/{filename} -> DELETE
파일 대량 등록 /files -> POST

 

[POST - 신규 자원 등록 특징]
1. 클라이언트가 리소스 URI를 알고 있어야 한다.
예시:
파일 등록 /files/{filename} -> PUT


2. 클라이언트가 직접 리소스의 URI를 지정한다.

참고:
스토어(Store)는 클라이언트가 관리하는 리소스 저장소이며 클라이언트가 리소스의 URI를 알고 관리한다.(여기서 스토어는 /files)

HTML FORM 사용

HTML FORM은 HTTP API와 다르게 GET, POST만 지원한다. 그럼으로 제약이 있어 컨트롤 URI를 지정해줘야 한다.

 

[HTML FORM 사용시 설계]
회원 목록 /members -> GET
회원 등록 폼 /members/new-> GET
회원 등록 /members/new or /members -> POST
회원 조회 /members/{id} -> GET
회원 수정 폼/members/{id}/edit -> GET
회원 수정 /members/{id}/edit or /members/{id}-> POST
회원삭제 /members/{id}/delete -> POST

 

[HTML FORM 사용 특징]
HTML FORM은 GET, POST만 지원하므로 제약이 있다. 이런 제약을 해결하기 위해 동사로 된 리소스 경로를 사용한다.(= 컨트롤 URI) 이때, 무작정 컨트롤 URI를 쓰는게 아니라 리소스와 메서드만으로 해결이 되지 않을 때 사용한다.

참고:
메서드를 GET, POST 두 종류 밖에 지원하지 않아 API 설계에 비해 URI가 복잡해 질 수 밖에 없고 이는 컨트롤 URI로 처리하는데 이때 /new, /edit, /delete등 동사형으로 이름을 지어주는게 좋다. 또한 회원 등록과 수정의 경우 /members/new 나 /members로 설정할 수 있는데 회원 등록 폼과 회원 등록을 1대1로 맞추는게 오류가 났을 때 다시 돌아갈 수 있어서 좋다 (즉 등록도 /members/new로)

정리

HTTP API - 컬렉션

  • POST기반 등록
  • 서버가 리소스 URI 결정

HTTP API - 스토어

  • PUT 기반 등록
  • 클라이언트가 리소스 URI 결정

HTML FORM 사용

  • 순수 HTML + HTML form 사용
  • GET, POST만 지원

 

[URI 설계 개념]
1. 문서(document)

  • 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 row)
  • 예) /members/100, /files/star.jpg

2. 컬렉션(collection)

  • 서버가 관리하는 리소스 디렉터리
  • 서버가 리소스의 URI를 생성하고 관리
  • 예) /members

3. 스토어(store)

  • 클라이언트가 관리하는 자원 저장소
  • 클라이언트가 리소스의 URI를 알고 관리
  • 예) /files

4. 컨트롤 URI, 컨트롤러(controller)

  • 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행
  • 동사를 직접 사용
  • 예) /members/{id}/delete

 

'Computer Science > Computer Network' 카테고리의 다른 글

[Network] 08. HTTP 헤더1 - 일반 헤더  (0) 2022.03.01
[Network] 07. HTTP 상태 코드  (0) 2022.02.28
[Network] 05. HTTP 메서드  (0) 2022.02.23
[Network] 04. HTTP 메시지  (0) 2022.02.21
[Network] 03. HTTP 기본  (0) 2022.02.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함