톰켓 : 클라이언트와 서버가 통신하기 위한 툴 (동적)
내장톰켓 : 스프링엔 없고 스프링부트엔 존재한다. (동적)
아파치 : Apache재단에서 만든 HTTP서버로 포트 관리나 분기점을 나눠주는 등 다양한 기능이 있다. (정적)
정적 데이터(Static Data)는 일방적인 관계로 HTML이나 이미지, js, css파일 등을 말한다. 스프링부트 프로젝트를 사용해본 사람들이라면 익히 알고 있을 'static' 폴더에 들어있는 자료들을 처리하는 역할을 하는 서버가 웹 서버라고 생각하면 된다.
동적 데이터(Dynamic Data)는 소통관계로 정적인 데이터가 아닌 입력받은 값을 내부적인 로직에 따라 처리해 만들어낸 결과값을 의미한다. 기존의 웹 서버로는 해낼 수 없는 역할이다.
HTTP 첫번째 버전은 데이터를 전송하기 위한 단순한 프로토콜
인터넷에서 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위해 사용되는 통신 규약으로 데이터의 전송과 요구.응답에 대해 수정 등에 대한 수행등이 일어난다. 이때 HTTP의 메소드를 이용해 수행이 일어나게 되는데 오늘 정리할 GET과 POST가 HTTP 메소드에 속한다.
GET은 요청을 전송할 때 필요한 데이터를 Body가 아닌 Query String을 통해 전송한다.
URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터를 Query String이라고 부르는데 만약 요청 파라미터가 여러개라면 &으로 연결한다.
불필요한 요청을 제한하기 위해 요청이 캐시될 수 있어 JS나 CSS,이미지 같이 데이터 양이 크고 변경될 일이 적은 정적 컨텐츠들은 반복적으로 동일한 요청을 보낼 필요가 없기 때문에 브라우저에 요청을 캐시해두고 동일한 요청이 발생되면 캐시된 데이터를 사용하게 된다. 이때 정적 컨텐츠가 캐시돼 컨텐츠를 변경해도 내용이 바뀌지 않는 경우가 발생할 수 있으니
POST는 리소스를 생성/변경하기 위해 설계되어 GET과 달리 데이터를 HTTP 메세지의 Body에 담아 전송하게 된다. HTTP 메세지의 Body는 길이의 제한없이 데이터를 전송할 수 있어서 POST의 요청은 GET과 달리 대용량 데이터를 전송할 수 있다. GET과 마찬가지로 크롬 개발자 도구 등과 같은 툴로 요청 내용을 확인할 수 있으니 민감한 데이터의 경우 암호화가 필요하다.
POST 또한 GET처럼 URL의 query를 이용해 데이터를 가져올 수 있지만(필터링 제한 등) 일반적인 URL링크, 북마크 등을 통해 POST의 데이터 전송방식인 request body를 URL에 나타낼 수 없다.
GET은 데이터가 Header에 전부 담겨있지만 POST는 데이터가 Body에 담겨있다. GET은 POST와 달리 큰 용량을 보낼 수 없다.
GET과 POST의 가장 큰 차이는 바로 멱등성(idempotent)이다. 멱등성이란 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다. 즉, 동일한 연산을 반복 하더라도 결과가 항상 같은지 아닌지라고 볼 수 있다.
GET은 멱등하게 설계되어 서버에 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야한다. (EX. 게시글을 읽는 등의 행위) POST는 멱등하지 않게 설계되어서 서버에 동일한 요청을 여러 번 전송한다면 응답이 다를 수 있다. (EX.생성, 수정, 삭제 등에 사용할 수 있지만 생성은 POST, 수정은 PUT, 삭제는 DELETE라는 각각의 메소드를 사용한다.)