오늘은 이전글인 HTTP 메서드에 대한 연장선인 활용방법에 대해서 알아보겠다.
HTTP 메서드는 서버에 데이터를 전송하게 될 때 사용하게된다.
먼저 GET 메서드이다.
GET - 쿼리 파라미터를 통한 데이터 전송
주로 검색어를 치거나 정렬 필터를 사용할 때 사용하게된다. (조회할 때 주로 사용)
다음으로는 POST, PUT, PATHC 메서드이다.
POST, PUT, PATCH - 메시지 바디를 통한 데이터 전송
주로 회원가입, 상품주문, 리소스 등록과 변경 등 사용된다.
4가지 상황을 예로 들어 각 메서드를 활용해보자.
1. 정적 데이터 조회
이미지, 정적 텍스트 문서를 얻어올 때 사용된다.
정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회가 가능하다.
GET /static/star.jpg HTTP/1.1
Host: location:8080
클라이언트는 static 폴더 아래에 있는 star.jpg 사진을 location:8080에 요청하게 된다.
2. 동적 데이터 조회
주로 검색, 게시판 목록에서 정렬 또는 필터를 걸 때 사용된다.
조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용된다.
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
클라이언트는 google.com에 검색어(q) hello를 검색하여 요청하게 된다.
*** GET 메서드이기 때문에 쿼리 파라미터를 이용하여 데이터를 전달하게된다.
3. HTML Form을 통한 데이터 전송 (GET과 POST만 가능)
<form action="/save" method="post">
<table>
<tr>
<td>username : </td><td><input type="text" name="username"/></td>
</tr>
<tr>
<td>age : </td><td><input type="text" name="age"/></td> <td rowspan="2"><button type="submit">전송</button></td>
</tr>
</table>
</form>

위와 같은 HTML Form이 있다.
우리가 많이 사용하는 입력창을 통해서 데이터를 전송하게 될 때 사용하게 된다.
우리는 위 폼에 username과 age를 입력받아 submit 버튼을 누르게 된다.
/save라는 곳으로 post 메서드를 통해 보내게 된다.
POST /save HTTP/1.1
Host: location:8080
Content-Type: application/x-www-form-urlencoded
username=kim&age=20
전송은 위와 같이 입력한 내용과 함께 보내지게 된다.
Get 메서드도 전송할 때 사용이 가능은 하나 리소스 변경(저장)이 일어나는 곳에는 사용하지 않아야 한다.
*** 함께 알면 좋은 지식💡
Content-type: application/x-www-form-urlencoded 를 사용하게 되면?
form의 내용을 메시지 바디를 통해서 Key=value, 쿼리 파라미터 형식으로 전송하게 된다.
전송 데이터를 url encoding 처리한다.
ex_) abc김 → abc%EA%B9%80 과 같이 처리함
Content-type: multipart/form-data 를 사용하게 되면?
주로 파일 업로드 같은 바이너리 데이터 전송 시 사용한다.
다른 종류의 여러 파일과 폼의 내용을 함께 전송 가능하다.
ex_) Content-Disposition: form-data; name=”username” kim
Content-Disposition: form-data; name=”age” 20
Content-Disposition: form-data; name=”file” filename=”star.jpg”
위와 같이 Content-type을 지정하여 사용 할 수 있다.
***
4. HTTP API를 통한 데이터 전송
서버끼리 통신 (백엔드 시스템), 앱 클라이언트, 웹 클라이언트 (AJAX)에 주로 사용된다.
Content-type은 TEXT, XML, JSON 등등 있지만 사실상 JSON을 주로 사용한다.
위와 같은 상황들을 통해 HTTP 메서드를 활용할 수 있다.
이런 메서드들을 활용해서 HTTP API를 설계 해볼 수 있는데, 이를 한번 같이 살펴보자.
HTTP API 설계 방식
우리가 서비스를 만들어야된다고 가정하고 HTTP API를 어떻게 설계할 지에 대한 방식들을 살펴보자.
먼저 POST 기반 등록 방식에 대해서 살펴보도록하자.
회원관리 시스템 (POST 기반 등록)
1. 회원 목록
/members
GET 메서드를 사용하여 목록을 조회한다.
2. 회원 조회
/members/{id}
GET 메서드와 id 값을 통해서 조회한다.
(검색어, 정렬 등 파라미터에 넣도록 설계하여 사용)
3. 회원 등록
/members
POST 메서드를 사용하여 등록한다.
4. 회원 수정
/members/{id}
PATCH, PUT, POST와 같은 메서드들을 사용하여 id 값의 회원정보를 수정한다.
5. 회원 삭제
/members/{id}
DELETE 메서드를 사용하여 해당하는 id 값의 회원을 삭제한다.
*** 클라이언트는 등록될 리소스의 URI를 모르기 때문에 위처럼 서버에서 새로 등록된 리소스의 URI를 생성해주게 된다. ***
*** 함께 알면 좋은 지식💡
위와 같은 방식을 컬렉션 방식이라고 한다.
컬렉션 (Collection)
서버가 관리하는 리소스 디렉토리를 뜻한다. (위에서는 /members)
서버가 리소스의 URI를 생성하고 관리하는 형식이다.
***
다음으로는 PUT 기반 등록 방식이다.
파일관리 시스템 (PUT 기반 등록)
1. 파일 목록
/files
GET 메서드를 사용하여 목록을 조회한다.
2. 파일 조회
/files/{filename}
GET 메서드와 filename 값을 통해서 특정 파일을 조회한다.
(검색어, 정렬 등 파라미터에 넣도록 설계하여 사용)
3. 파일 등록
/files/{filename}
PUT 메서드를 사용하여 등록한다.
4. 파일 삭제
/files/{filename}
DELETE 메서드를 사용하여 해당하는 filename 값의 파일을 삭제한다.
5. 파일 대량 등록
/files
POST와 같은 메서드를 사용하여 파일들을 등록하게된다.
클라이언트가 리소스 URI를 알고 있어야 하며, 클라이언트가 직접 리소스의 URI를 지정한다.
*** 함께 알면 좋은 지식💡
스토어 (Store)
클라이언트가 관리하는 리소스 저장소를 뜻한다. (위에서는 /files)
클라이언트가 리소스의 URI를 알고 관리하는 형식이다.
*** 요즘에는 주로 POST 기반의 컬렉션 방식을 사용한다.
다음으로는 HTML FORM을 사용했을 때의 설계를 해보자.
HTML FORM 사용
1. 회원 목록
/members
GET 방식을 사용하여 회원 목록을 조회한다.
2. 회원 등록 폼
/members/new
GET 방식을 통해 회원등록 폼에 접근한다.
3. 회원 등록
/members/new 또는 /members
POST 방식을 통해 폼에서 입력받은 값들을 통해 회원 등록을 진행한다.
4. 회원 조회
/members/{id}
GET 방식을 통해 id 값에 해당하는 회원을 조회한다.
5. 회원 수정 폼
/members/{id}/edit
GET 방식을 통해 id 값에 해당하는 회원을 수정하는 폼에 접근한다.
6. 회원 수정
/members/{id}/edit 또는 /members/{id}
POST 방식을 통해 id 값에 해당하는 회원을 수정하는 폼에서 입력받은 값들로 수정한다.
7. 회원 삭제
/members/{id}/delete
POST 방식을 통해 id 값에 해당하는 회원을 삭제한다.
*** 함께 알면 좋은 지식💡
컨트롤러(Controller), 컨트롤 URI
GET, POST 방식만으로는 제약이 있기 때문에 동사로 된 리소스 경로를 사용한다.
/new, /edit, /delete 와 같은 형식
HTTP 메서드로 해결하기 어려운 경우 사용한다.
컨트롤 URI도 남용하는 것은 좋지 않은 방법이기 때문에,
최대한 HTTP 메서드로 해결을 하되 해결하기 어려운 경우 컨트롤 URI를 사용하는게 좋다.
실제로는 많이 사용되는 방식이라 최대한 HTTP 메서드로 해결을 하려고 생각하면 될 것 같다.
***
이외에도 문서 접근 방식이 있다.
문서 접근
문서 (Document)
단일 개념(파일 하나, 객체 인스턴스, DB row)를 뜻한다.
/members/100, /files/stars.jpg
결론
먼저 기본 리소스를 가지고 URI를 설계를 하자.
GET, POST, PUT, DELETE 이용
이를 통해서 안되는 것들은 Controller를 통해서 처리하자.
나는 지금까지는 POST 또는 GET를 통해서만 웹사이트를 개발했었기에 (HTML Form만 사용했었다...)
PUT, PATCH, DELETE를 사용하라는 말이 크게 와닿지는 않는다.
이에 다음에 API를 설계하게 된다면 PUT, PATCH, DELETE를 먼저 생각해보려고 한다.
오랜만의 글이라 조금 어색한 점이 있는 것 같다.
꾸준하게 공부해야 된다는 생각을 다시 새기고 시작해야겠다.
참고 - https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC