HTTP(Hypertext Transfer Protocol)은 웹에서 사용하는 통신 프로토콜. 통신 프로토콜은 간단히 말해 상호 간 데이터를 주고 받는 통신을 위해 정의한 규칙(약속)이라고 생각하면 됩니다. 웹에서는 브라우저와 서버 간에 데이터를 주고받기 위한 방식으로 HTTP 프로토콜을 사용하고 있습니다.
1) 비연결성 (Connectionless): 기본적으로 자원 하나에 대해서 하나의 연결만을 생성하며 요청을 받은 서버가 응답하면 바로 연결을 끊습니다. 인터넷은 불특정 다수가 사용하기 때문에 서버에서 다수의 클라이언트와 계속해서 연결을 유지할 경우 리소스는 끊임없이 생성, 사용되고 결국 리소스가 부족한 상황에 이릅니다. 그러면?
운 안좋은 클라이언트들은 이용하지 못하는 위와 같은 사례가 빈번히 발생하겠죠.. ;ㅅ; 우리 엄마 눈감아
장점 : 응답 후 바로 연결을 끊으면 리소스를 줄일 수 있고 그러면 더 많은 클라이언트들과 연결을 할 수 있습니다.
단점 : 연결을 끊어버리기 때문에, 당연히 클라이언트의 이전 상태를 기억하지 못합니다(이게 밑 에 나오는 Stateless).
2) 무상태성 (Stateless): 클라이언트의 이전 상태를 유지하지 않습니다.
예를 들어 쇼핑을 하기 위해 로그인을 하고 구매할 물건을 장바구니에 담아서 페이지 이동을 했는데 무상태성은 이전 상태를 유지하지 않기 때문에 로그아웃이 됩니다. ㅎ 그래서 로그인하고 장바구니 페이지로 오면 또 로그아웃되고ㅎ 그래서 필요한 경우에는 개발자가 쿠키와 세션을 이용해서 클라이언트의 정보를 저장하고 기억(유지)합니다.
1) URL (Uniform Resource Locators) : 서버에 자원을 요청하기 위해 입력하는 영문 주소.
2) 메소드 : URL을 이용해 서버에 특정 데이터를 요청한 뒤 해당 데이터에 특정 동작을 수행하기 위해 사용하는 방법으로 해당 URL에 취할 동작(요청)의 방법입니다.
GET : 존재하는 자원을 부름
POST : 새로운 자원을 생성
PUT : 존재하는 자원에 대한 변경
DELETE : 존재하는 자원을 삭제
post 메소드는 말 그대로 "신규 포스트 생성" 이라고 생각하면 됩니다. http 메세지로 넘어온 엔티티를 새로운 자원으로 등록히며, 새로운 자원으로 등록하지 않는 경우엔 200(ok)이나 204(no content) response code로 응답합니다. 새로운 자원으로 만들어진 경우에는 201(created) response code로 응답하며 신규 생성된 자원의 위치를 헤더에 포함해야한다. 예를들어 게시판에 새로 게시물을 등록하면 이를 따라갈 수 있게 위치를 응답 헤더에 넣어야 합니다. (아래 이미지 참고)
put 메소드가 post 메소드와 다른 점 중 제일 중요한 포인트는 자원의 식별자를 이미 알고있는 상태여야한다는 점입니다. put 메소드는 식별자의 자원을 http 메세지로 함께 넘어온 엔티티로 교체하는데 이 때 response code는 200(ok), 204(no content)를 사용합니다. 다만 put 메소드로 넘어온 식별자가 꼭 존재하고있는 식별자일 필요는 없습니다. 만약 존재하지않는 식별자를 넘기는 경우, 넘어온 식별자를 id로 하는 새 자원을 생성하고 201(created) 응답을 합니다. 단, 식별자를 id로 사용할수없는 경우엔 에러코드로 응답합니다.
새 자원을 생성한다는 점에서 POST랑 같네?! 라고 생각할수도있지만 POST와 PUT의 가장 큰 차이는 POST는 request message로 포함된 엔티티를 이용해 새로운 자원을 생성해 내는것이고, PUT은 request message와 함께 넘어온 식별자의 자원을 만든다는 것입니다. 즉, 똑같은 요청이 POST로 2번 날아오면 POST는 2개의 자원을 생성합니다. 게시판에 글쓰기 요청을 2번 날리면 2개의 게시물이 등록되는 것이고. PUT으로 동일한 요청을 2번 날리는 경우를 생각해보면(식별자가 있다고 가정), 다만 꼭 존재하는 식별자를 포함할 필요는 없으므로 존재하지않는 식별자로 요청을 할 시에 POST와 동일하게 자원을 생성합니다. 하지만 두번째 요청에선 이미 첫번째 요청에서 생성된 자원이 있으므로 자원을 생성하지않고 교체하게된다. 이 부분에서 POST와 PUT이 달라지게된다.
그래도 이해가 안되면?
POST, PUT 모두 요청하는 자원이 없다면 새롭게 신규등록을 하게 되지만, 동일한 요청이 2번 이상 들어가게 된다면 post 는 계속해서 신규로 등록을 할테고 put은 첫번째 요청에서 생성이 되었기 때문에 그 자원의 수정이 이루어집니다. 이러한 성질을 멱등성(idempotent)이라고 한다. (post: 멱등성을 만족하지 않음, 그래서 계속 신규등록/ put: 멱등성을 만족함, 그래서 자원이 있다면 수정이 이루어짐)
선수교체라고 생각하세요..
13번이 없을 경우 13번 생성, 13번이 있다면 기존 13번 강퇴 후 새로운 13번을 투입합니다. (PUT)
13번 두 명 생성합니다. (POST)
HTTP는 상태코드로 응답 하는데 크게 성공과 실패로 나뉘겠지만 그외에도 여러가지가 있다. 해당 응답코드를 해석할 수 있어야 오류를 쉽게 파악하고 고칠 수 있습니다.
1) 2XX 성공 : 서버가 요청을 성공적으로 처리했음을 의미
200 : GET 요청에 대한 성공
204 : No Content. 성공했지만 응답 본문에 데이터가 없음
205 : Rest Content. 성공했으나 클라이언트의 화면을 새로고침을 권고
206 : Partial Content. 성공했으나 일부 범위의 데이터만을 반환
2) 3XX 리다이렉션: 대부분 클라이언트가 이전 주소로 데이터를 요청해 서버에서는 새 URL로 리다이렉트를 유도하는 경우
301 : Moved Permanently. 요청한 자원이 새 URL로 완전히 이동했음
303 : See Other. 요청한 자원이 임시 주소에 존재
3) 4XX 클라이언트 에러: 대부분 클라이언트의 코드가 잘못된 경우. 유효하지 않은 자원을 요청했거나, 요청방법 혹은 권한이 잘못된 경우 발생
400 : Bad Request. 잘못된 요청
401 : Unauthorized. 요청에 대한 권한 없음. 인증 헤더가 잘못된 경우
403 : Forbidden. 서버에서 해당 자원에 대해 접근을 금지시켜 놓음
404 : 제일 많이 보는 Not Found. 서버 자체는 존재하지만 서버에서 요청한 해당 데이터(자원)를 찾을 수 없음. 주 원인은 페이지가 이동되거나 삭제된 경우
405 : Method Not Allowed. 허용되지 않은 요청 메소드
409 : Conflict. 최신 자원이 아닌 상태에서 업데이트 하는 경우
4) 5XX 서버 에러: 서버에서 오류가 난 경우
501 : Not Implemented. 요청한 동작에 대해 서버가 수행할 수 없음
503 : Service Unavailable. 서비스가 가능하지 않음. 서버가 과부하 또는 유지 보수로 셧다운된 경우
브라우저는 URL + 요청 메서드를 보내 요청하고 서버는 상태코드 + 응답 Body로 응답합니다.
그렇게 사용자는 웹상에서 어떠한 동작을 취할 때마다 바뀐 브라우저를 볼 수 있게 됩니다. . 한 장면 장면 하나마다 요청과 응답을 반복하니 브라우저가 잠깐 반짝하고 바뀌는 그 순간 클라이언트와 서버는 서로 요청과 응답을 주고 받았구나 라고 생각하면 되겠습니다.