이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.
기초개념 › 네트워크
GET과 POST는 무엇이 다른가
HTTP 요청의 첫 줄 맨 앞 낱말을 메서드라고 합니다. 메서드는 서버에게 "그 주소에서 무엇을 해 달라"는 요청인지를 알리는 낱말이어서, 같은 /memos 주소라도 GET을 보내는지 POST를 보내는지에 따라 서버가 하는 일이 다릅니다. GET은 서버에 있는 것을 가져오는 메서드로, 서버의 것을 바꿔 달라는 요청이 아닙니다. POST는 요청에 실어 보낸 내용(본문)을 서버가 처리해 달라는 메서드입니다. 서버는 자기가 맡을 메서드를 코드로 만들어 두고, 만들어 두지 않은 메서드로 요청이 오면 405 상태 코드로 답합니다. 이 실습은 메모 목록을 가진 서버에 요청을 보내면서 첫 줄의 메서드를 바꾸고, 같은 요청을 한 번 또는 두 번 보내, 서버의 메모가 어떻게 되는지를 봅니다. 코드 칸의 위쪽은 서버에 실제로 보낸 요청의 글자이고, # 으로 시작하는 줄은 서버에 보내지 않는 설명입니다(서버에 무엇을 만들어 두었는지, 보내는 횟수). 코드 칸은 서버 프로그램의 코드가 아니라 주고받은 것을 적은 것입니다. (빈 줄)은 아무 글자도 없는 줄을 눈에 보이게 적은 것입니다.
실행으로 대조 · Node.js 24.18.0의 http 서버에 요청 글자를 그대로 보내는 여섯 가지 조합을 실행해 대조
GET /memos HTTP/1.1 Host: localhost:8080 (빈 줄) # 서버: 처음 목록에는 메모 first 하나가 있다 # 서버: GET /memos → 목록을 돌려준다 # 서버: POST /memos → 본문의 글을 목록에 더한다
서버는 Node.js 24.18.0의 http 모듈로 127.0.0.1의 빈 포트에 띄운 것으로, 처음 목록에는 메모 first 하나가 있고, GET /memos에는 목록을 ", "로 이은 글을 본문으로 200 OK를, POST /memos에는 요청 본문의 글을 목록에 더한 뒤 더한 뒤의 목록을 본문으로 200 OK를, /memos에 오는 그 밖의 메서드에는 서버 코드가 Allow: GET, POST 줄을 붙인 405를, 그 밖의 주소에는 404를 돌려줍니다. 코드 칸은 서버 프로그램의 코드가 아니라 주고받은 것을 적은 것이고, # 으로 시작하는 줄은 서버에 보내지 않는 설명입니다. 메서드 세 가지와 보내는 횟수 두 가지, 모두 여섯 가지 조합을 실제로 실행했습니다. 클라이언트는 net 모듈로 코드 칸 위쪽의 요청 글자를 줄 끝 CRLF로 그대로 보내고(두 번 보낼 때는 연결을 새로 맺어 같은 글자를 한 번 더), 서버가 연결을 닫을 때까지 받은 응답의 상태 줄, Allow 줄, 본문을 해석했습니다. 서버가 받은 메서드와 경로와 본문, 요청 뒤 서버의 메모 개수와 목록이 바뀌었는지, 마지막에 GET /memos를 한 번 더 보내 읽은 목록이 서버의 실제 목록과 같은지, 없는 주소 /nothing에 GET을 보내면 404가 오는지를 확인해 모형과 대조했고, 화면의 코드가 실행한 요청 글자와 같은 글자인지도 조합마다 확인했습니다. 모두 모형과 일치했습니다. 화면의 Host: localhost:8080은 예시이고, 실제로는 빈 포트에 보냈으며 이 서버는 Host의 값을 따지지 않습니다. GET이 서버의 것을 바꾸지 않은 것은 이 서버를 그렇게 만들었기 때문입니다. 표준은 GET에 읽기 전용의 의미를 정해 두었을 뿐이어서, GET에서 서버의 것을 바꾸는 서버가 어떻게 되는지는 실행해 보지 않았습니다. POST에 200 OK로 답한 것도 이 서버의 선택입니다. 표준은 새 자원이 만들어졌으면 201 Created와 Location 줄로 답하라고 권하는데(9.3.3절), 이 서버의 메모에는 따로 주소가 없어 쓰지 않았습니다. 문서로 확인한 것은 RFC 9110의 9.1절(메서드 이름은 대소문자를 구분하고, 서버가 알지 못하거나 구현하지 않은 메서드에는 501을, 알지만 그 자원이 받지 않는 메서드에는 405를 쓰도록 권한다), 9.2.1절(안전한 메서드: 읽기 전용 의미로 정의되어 클라이언트가 서버의 상태 변화를 요청하지도 기대하지도 않는다), 9.2.2절(멱등), 9.3.1절(GET: 대상 자원의 현재 표현을 전달해 달라는 요청), 9.3.3절(POST: 요청에 실린 표현을 대상 자원이 처리해 달라는 요청과 그 쓰임), 10.2.1절(Allow), 15.5.6절(405 Method Not Allowed: 알지만 대상 자원이 지원하지 않는 메서드, 405 응답에는 Allow를 반드시 붙인다)입니다. 이 문서들은 WebFetch로 열었으나 긴 문서를 구간으로 나누어 열었고 돌아온 것이 요약과 짧은 발췌여서, 문장 전체를 원문으로 대조하지는 못했습니다. 이 실습이 다루지 않는 것: PUT, PATCH, DELETE가 성공하는 경우, 같은 요청을 여러 번 보내도 결과가 같은 성질(멱등)과 응답을 못 받았을 때 다시 보내도 되는지는 "세부 동작 실습: 재시도와 멱등성"에서, 요청과 응답의 글자 모양과 상태 코드 전체는 "세부 동작 실습: HTTP 메시지와 상태 코드"에서, 스프링에서 메서드와 주소로 요청을 가르는 것은 "세부 동작 실습: 요청 매핑과 파라미터 바인딩"에서 다룹니다. 브라우저는 쓰지 않았고, 브라우저 주소창에 주소를 입력하면 GET이 가고 HTML 양식은 POST를 쓸 수 있다는 것은 확인하지 않았습니다.
줄을 그은 곳은 처음 코드에서 지운 것이고, 색을 칠한 곳은 새로 쓴 것입니다.