내가 공부한것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼겸 상세히 기록하고 얕은부분들은 가겹게 포스팅 하겠습니다.
1. 클라이언트에서 서버로 데이터 전송
▶ 클라이언트에서 서버로 데이터 전송
클라이언트에서 서버로 데이터 전달 방식은 크게 2가지가 있다.
1) 쿼리 파라미터를 통한 데이터 전송
- GET
- 주로 정렬 필터(검색어)
2) 메시지 바디를 통한 데이터 전송
- POST, PUT, PATCH
- 회원 가입, 상품 주문, 리소스 등록, 리소스 변경
▶ 클라이언트에서 서버로 데이터 전송 4가지 상황
1) 정적 데이터 조회
이미지, 정적 텍스트 문서등을 조회하며, 보통 GET을 많이 사용한다. 쿼리 파라미터 없이 단순하게 리소스 경로를 명시한다.
2) 동적 데이터 조회
주로 검색, 게시판 목록에서 정렬 필터(검색어)로 사용하며, 쿼리파라미터 인자로 넘겨 이를 기준으로 필터링하고 검색한다.
조회 시 GET 쿼리파라미터 사용해 데이터 전달
3) HTML Form을 통한 데이터 전송
Content-Type: application/x-www-form-urlencoded 을 사용한 Key : Value 조합 사용
URL 인코딩 (ex. abc김 -> abc%EA%B9%80)
HTML Form submit 시 POST 전송(저장) => 메시지 바디에 인코딩된 URL 데이터가 key=value 형식으로 들어감 (ex.username=kim&age=20)
회원 가입, 상품 주문, 데이터 변경 등에 사용
GET 전송 시 쿼리 파라미터에 인코딩된 URL 데이터가 들어감 (ex. GET /member?username=kim&age=20)
Content-Type: multipart/form-data
파일 업로드와 같은 바이너리 데이터 전송 시 주로 사용한다. 다른 종류의 여러 파일과 폼 내용 함께 전송 가능하다.
웹브라우저가 생성한 요청 HTTP 메시지를 보면 boundry = -----XXX를 기준으로 나눠서 데이터를 보내고 있다.
HTML Form 전송은 GET, POST만 가능하다. 나머지 PUT, PATCH 등은 자바스크립트를 통해서 사용해야한다.
4) HTTP API를 통한 데이터 전송
- 서버 to 서버(백엔드 시스템 통신)
- 앱 클라이언트(아이폰, 안드로이드)
- 웹 클라이언트, HTML에서 Form 전송 대신 자바 스크립트를 통한 통신에 사용(AJAX)
예) React, VueJs 같은 웹 클라이언트와 API 통신
- POST, PUT, PATCH: 메시지 바디를 통해 데이터 전송
- GET: 조회, 쿼리 파라미터로 데이터 전달
- Content-Type: application/json을 주로 사용 (사실상 표준), TEXT, XML, JSON 등등
2. HTTP API 설계 예시
이번 시간은 진짜 중요한 내용들로 가득이였다.
▶ HTTP API - 컬렉션
컬렉션 방식은 POST 기반 등록을 할때 사용된다. 신규 자원을 POST를 통해 등록 해야 하는 상황이라고 해보자.
핵심은 "클라이언트는 등록될 리소스의 URI를 모른다" 는 점 이다. 다음 그림을 살펴보자.
Client가 신규로 등록할 리소스에 대한 정보를 POST 방식을 통하여 /members 주소로 보내고 있다.
이를 서버에서 받으면 다음과 같을 것 이다.
서버가 신규 리소스를 받은 후, 서버가 알맞게 처리하여 100번지에 저장한다.
서버가 새로 등록된 리소스 URI를 생성해준다 => /members/100 이 생성됬다.
이를 다시 Client에게 반환하게 되는데, Client에게 전송된 정보는 다음과 같다.
그림에 보이듯 /members/100 이라는 신규 리소스 URI를 서버가 정한 후, 클라이언트에게 통보한 것 이다.
컬렉션(Collection)
- 서버가 관리하는 리소스 디렉토리
- 서버가 리소스의 URI를 생성하고 관리
- 여기서 컬렉션은 /members
지금까지 위에서 본 Collection 방식을 Java 코드로 확인해 봅시다!
(강의에 없는 혼자 실습한 부분입니다.)
우선 Client에서 보내는 Json 형식으 data는 다음과 같습니다.
POST 방식으로 보내고 있으며, http://localhost:8080/sp5-chap16/api/members 에게 보내고 있습니다.
보내는 데이터는 Json 형식으로 신규 등록하는 user의 정보입니다.
이를 처리하는 코드를 살펴봅시다!
regReq라는 커맨드 객체에 위에서 client가 보낸 정보가 저장되어 객체로 생성된다고 생각하면 편합니다.
이 객체를 다음 코드를 통해 서버의 저장소에 저장하게 됩니다.
Long newMemberId = registerService.regist(regReq);
따라서 신규 유저를 등록한 후, 등록된 user id를 반환받게 됩니다.
이 id를 response의 헤더에 setHeader() 메서드를 이용하여 "/api/members/4" 와 같은 형태로 등록하게 됩니다.
또한 상태코드도 201 CREATED로 등록합니다.
이후 생성된 정보를 다시 client에게 반환하게 됩니다.
클라이언트에게 201 CREATED 가 뜨고 성공적으로 유저가 생성됬음을 알 수 있습니다.
마지막으로 GET방식으로 조회를 해보면 정상적으로 확인할 수 있습니다.
위에서 보았듯 User의 ID는 서버가 정하였습니다!
▶ HTTP API - 스토어
스토어 방식은 PUT 기반의 등록이다. POST의 컬랙션과 달리 클라이언트가 URI를 관리한다.
파일관리 시스템이 있다고 해보자.
새로운 파일을 전송하여 등록할때는 PUT으로 전달하여 기존 파일이 있다면 덮어씌우고, 기존 파일이 없다면 새로 생성해야 한다.
이 방식은 클라이언트가 리소스 URI를 알고 있어야 한다.
우선 파일 등록을 위해 다음 URI로 파일을 전송한다 => /files/{filename}
이때 다음과 같이 정확한 URI를 지정해줘야 한다. => PUT /files/star.jpg
스토어(Store)
- 클라이언트가 관리하는 리소스 저장소
- 클라이언트가 리소스의 URI를 알고 관리한다.
- 여기서 스토어는 /files
▶ HTML FORM 사용
HTML은 GET, POST 방식만을 지원하기 때문에 URI를 설계시 다음과 같아진다.
이러한 제약사할 때문에 컨트롤 URI 가 등장하였다.
URI를 리소스만을 사용하여 설계하면 좋겠지만, 이는 이상이다.
현실적으로 모든 URI를 리소스 중심으로 작성하기가 어렵다. 따라서 컨트롤 URI를 사용하여 이를 보완한다.
컨트롤 URI는 /members/{id}/delete 에서 delete 와 같이 행동에 해당하는 부분을 URI에 포함한 방식이다.
컨트롤 URI
• GET, POST만 지원하므로 제약이 있음
• 이런 제약을 해결하기 위해 동사로 된 리소스 경로 사용
• POST의 /new, /edit, /delete가 컨트롤 URI
• HTTP 메서드로 해결하기 애매한 경우 사용(HTTP API 포함)
'BackEnd > WEB' 카테고리의 다른 글
[HTTP] HTTP 헤더 - 일반헤더 (0) | 2022.02.02 |
---|---|
[HTTP] HTTP 상태 코드 (0) | 2022.02.01 |
[HTTP] HTTP 메서드 (0) | 2022.01.28 |
[HTTP] HTTP 기본 (0) | 2022.01.27 |
[HTTP] URI와 웹 브라우저 요청 흐름 (0) | 2022.01.25 |
댓글