Spring Boot에 대해 배우기 이전에,
간단하게 HTTP에 대하여 짚고 넘어가보자!
모든 것이 HTTP
*HyperText Transfer Protocol
아래와 같은 형태의 Data들을 HTTP 규약에 따라 전송이 가능하다.
- HTML, TEXT
- IMAGE, 음성, 영상
- JSON, XML(API)
- 거의 모든 형태의 Data 전송 가능
현재 HTTP/1.1 Version을 가장 많이 사용하고, 우리에게 중요하다.
- HTTP/2 : 2015년, 성능 개선.
- HTTP/3 : TCP대신 UDP사용, 성능 개선, 현재 개발 중.
HTTP의 특징
Clinet 서버 구조
- HTTP는 Request - Response 구조로 이루어진다.
- Client는 Server에 요청을 보내고, 응답을 대기한다.
- Server는 요청을 받아 결과를 만들어 응답한다.
Stateless Protocol
- Stateful : Server가 Clinet의 상태를 보존한다.
- Client의 상태를 보존하기 때문에, Client는 요청을 끊어서 할 수 있다.
- 하지만 Server는, 중간에 마음대로 바뀔 수 없다.
- Server가 바뀔 때엔 상태를 모두 넘겨주고 바뀌어야 한다!
- Stateless : Server는 Client의 상태를 보존하지 않는다.
- Server가 바뀌는 경우엔?
- 어차피 Client가 필요 정보를 모두 담아서 보내기 때문에, 상관이 없다.
- 갑자기 Client가 증가해도 Server를 대거 투입할 수 있다!
- Stateless의 실무 한계
- 모든 것을 무상태로 설계할 수 없는 경우도 있다.
- ex) 로그인, 상태 유지가 필요하다.
- 일반적으로 쿠키, 세션 등을 생성해서 상태를 유지한다.
- 하지만 최대한 무상태로 설계를 하도록 노력한다.
- 모든 것을 무상태로 설계할 수 없는 경우도 있다.
Connectionless
- 여러 Client들에 동시에 응답하는 경우엔 서버는 어떨까?
- 동시에 여러 연결을 유지를 하고 있다면, 자원이 낭비될 것이다.
- 요청을 주고 받을 때만 연결을 유지하고, 다른 땐 끊어버린다면?
- 서버는 최소한의 자원만을 사용할 수 있다.
- HTTP는 기본적으로 연결을 유지하지 않는 모델이다.
- 일반적으로 초 단위의 빠른 속도로 응답을 하기 때문이다.
- 1시간 동안 수천명이 서비스를 사용해도, 동시 처리되는 요청은 매우 적다.
- 한계점
- 매번 TCP/IP 연결을 새로 맺어야 한다.
- 3 Way Handshake Overhead (Client 입장에서 단점)
- Web browser로 요청을 넣으면, HTML뿐만 아니라 CSS, 추가 이미지 등 수많은 자원이 동시에 다운로드 된다.
- 매번 TCP/IP 연결을 새로 맺어야 한다.
- 현재는 Persistent Connection으로 문제를 해결했다.
HTTP Message
- Start Line
- Request Line : method request-target HTTP-version
- Method : 서버가 수행해야 할 동작 지정
- Target : 보통 절대 경로로 삽입. (‘/’로 시작하는 경로)
- Status Line : HTTP-version status-code reason-phrase
- Status Code : 요청의 결과 상태를 나타내는 Code.
- Reason Phrase : 상태 코드에 대한 간결한 설명.
- Request Line : method request-target HTTP-version
- Header
- field-name: (OWS) field-value (OWS) 와 같은 형태.
- OWS는 띄어쓰기를 허용함을 의미한다.
- HTTP 전송에 필요한 모든 부가정보가 포함된다.
- Body의 내용, 크기, 압축
- 인증, 요청 클라이언트 정보 ..
- field-name: (OWS) field-value (OWS) 와 같은 형태.
- Body
- 실제 전송할 Data가 담긴다.
- Byte 형태로 저장 가능한 모든 정보가 담김!
HTTP Method
API는 어떻게 만들어질까?
- API URI 설계
- 회원 목록 조회 /read-member-list
- 회원 조회 /read-member-by-id
- 회원 등록 /create-member
- 회원 수정 /update-member
- 회원 삭제 /delete-member
위 설계 방식은 과연 좋은 설계인가? 그렇지 않다!
- Resource의 의미는 무엇일까?
- 회원에 대한 동작이 Resource가 아니다.
- 회원 그 자체가 Resource가 된다.
- 그에 맞춰서 Resource 중저 URI를 설계 해보자.
- Resource 중점의 URI 설계
- 회원 목록 조회 /members
- 회원 조회 /members/{id}
- 회원 등록 /members/{id}
- 회원 수정 /members/{id}
- 회원 삭제 /members/{id}
이렇게 설계를 하면 조회, 등록, 수정, 삭제를 어떻게 구분할 것인가? 그럼 Resource(명사)와 행위(동사)를 분리하자!
HTTP Method의 종류
- GET : Resource 조회
- 전달하고자 하는 Data를 Query Parameter(String)으로 전달.
- Body로도 전달 가능하지만, 지원하는 곳이 많이 없다.
- POST : 요청 Data 처리. 주로 등록하는 데에 사용.
- Body를 통해서 요청 Data를 전달한다.
- 주로 신규 Resource 등록, Process 처리에 사용한다.
- POST 요청이 오면, 어떻게 처리할지 Resource 마다 정해주어야 한다.
- 어떤 Method로 처리하기 애매한 경우에, 그냥 POST를 쓰기도 한다.
- PUT : Resourec를 대체, 없으면 새로 생성
- 기존 Resource를 덮어쓰기(완전 대체) 한다.
- ex) name과 age가 이미 있을 때, age만 보내면 name은 없어진다.
- POST와의 차이는, Client가 리소스 URI를 지정한다는 것!
- 기존 Resource를 덮어쓰기(완전 대체) 한다.
- PATCH : Resource 수정
- Patch는 Put과 다르게 Resource 중 일부만 보내도 수정이 된다.
- 만약 Patch가 지원이 안되는 서버라면 Post를 쓰자!
- DELETE : Resource 삭제
- HEAD : GET과 유사하지만, Header와 Status Line만 반환.
- OPTIONS : 통신 가능한 Method 목록을 반환
HTTP Method의 특징
- Safe
- 호출해도 Resource를 변경하지 않는다.
- GET이 안전한 Method 중 하나이다.
- Idempotent
- 몇 번을 호출해도 결과가 바뀌지 않는다.
- GET, PUT, DELETE 가 멱등 Method이다.
- POST는 멱등성이 없다!
- 중복 호출 시, 같은 결제가 중복해서 발생할 수가 있다!
- 자동 복구 메커니즘에 활용되는 성질이다.
- 서버가 정상 작동을 하지 않을 때, 같은 요청을 받아도 되는가?
- Cacheable
- 응답 결과 Resource를 Cache해서 사용해도 되는가?
- GET, HEAD, POST, PATCH는 Cache 가능.
- 하지만 실제로는 GET, HEAD 정도만 사용한다.
- POST와 PATCH는 본문 내용까지 고려를 해야해서 구현이 어렵다.
HTTP Method의 활용 : Data 전송
- 정적 Data 조회
- GET Method와, URI 경로만 지정해서 요청을 한다.
- 단순히 조회 결과만 응답에 보낸다.
- Query Parameter 없이 조회 가능!
- 동적 Data 조회
- 이 경우에는 Query Parameter이 필요하다.
- Query Parameter을 이용하는 GET Method를 이용한다.
- URI에 Query Parameter을 포함시켜서 요청을 보낸다.
- 주로 검색이나 게시판 목록, 정렬 필터(검색어)에 쓰인다.
- 이 경우에는 Query Parameter이 필요하다.
- HTML Form Data 전송
- 우리는 HTML의 Form 태그를 Data를 전송받을 때 주로 사용한다.
- POST Method를 통해서 Data와 함께 요청을 전송한다.
- Form의 내용을 Message body를 통해서 전송 (Key = Value 형식)
application/x-www-form-urlencoded
에 의해 Url이 Encoding 처리.- HTML Form은 GET 전송도 가능하다.
- 하지만 Resource 변경이 일어나는 경우는 POST를 써야한다!
- HTML API Data 전송
application/json
을 Content-Type으로 POST Method를 사용한다.- JSON 형태로 Data를 Body에 넣어서 전송한다.
- 어떤 상황에서 주로 사용하나요?
- Server와 Server 간에 통신할 때
- App Client를 대상으로 통신할 때
- Web Client를 대상으로 Javascript를 이용할 때 사용.
- 사진 및 자료 출처 : [김영한의 HTTP 웹 기본 지식]https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard)