김영한 님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 듣고 정리한 내용입니다.
클라이언트는 서버에 요청을 보내고 서버 응답이 올 때까지 기다린다.
이렇게 분리 되어 있어서 좋은 점은? 클라이언트와 서버가 각자 독립적으로 진화할 수 있다.
고객: 노트북 얼마에요?
점원A: 100만원이요
고객: 2개 주세요.
점원A: 200만원입니다. 현금, 신용카드 중 어떤 걸로 계산하시겠어요?
고객: 신용카드로 결제해 주세요.
점원A: 신용카드로 200만원 결제 완료되었습니다.
고객: 노트북 얼마에요?
점원A: 100만원이요
고객: 2개 주세요.
점원B: ?? 어떤 거 2개 말씀이신가요?
고객: 신용카드로 결제해 주세요.
점원A: ?? 어떤 걸요?
Stateful에서는 컨텍스트(맥락)을 알아야 응답이 가능하다. 그래서 중간에 다른 점원으로 바뀌면 안 된다. 바꾸려면 다른 점원에게 정보를 미리 알려줘야 된다.
고객: 노트북 얼마에요?
점원A: 100만원이에요
(점원 B에게 A가 노트북 얼마냐고 물어봤다는 사실을 전한다)
고객: 2개 주세요.
점원B: 200만원입니다. 현금, 신용카드 중 어떤 걸로 계산하시겠어요?
이렇게 해야만 다른 점원(서버)에게 요청했을 때도 응답이 가능하다.
상태 유지가 되지 않는 상황에서 고객(클라이언트)은 이렇게 요청해야 한다.
고객: 노트북 2개 신용카드로 결제해 주세요.
점원A: 신용카드로 200만원 결제 완료되었습니다.
그러면 어떤 점원에게 가든 제대로 결제할 수 있다.
고객: 노트북 2개 신용카드로 결제해 주세요.
점원B: 신용카드로 200만원 결제 완료되었습니다.
고객: 노트북 2개 신용카드로 결제해 주세요.
점원C: 신용카드로 200만원 결제 완료되었습니다.
어떤 점원에게든 결제가 가능하기 때문에 확장성이 좋다.
예를 들어, A 서버로 요청을 보냈는데 A 서버에 장애가 발생하면 B 서버로 보내면 응답을 받을 수 있다. 갑자기 클라이언트 요청이 증가하면 서버를 증설해서 대거 투입할 수 있다.
단점: 많은 정보를 보내야 된다(노트북 2개 신용카드로 결제해 주세요.)
리소스(미네랄을 캔다고 하면 '캔다'는 행위가 아니라 '미네랄'이 리소스다)를 기준으로 이름을 짓는다.
근데 그렇게 되면
회원 목록: members
회원 조회: members/{id}
회원 생성: members/{id}
회원 삭제: members/{id
}.............?? 조회/생성/삭제 구분 어떻게 하지??
바로 HTTP 메서드로 구분한다!
호출해도 리소스를 변경하지 않는 속성
같은 메소드를 한 번 호출하든 여러 번 호출하든 같은 결과가 나오는가? 그럼 '멱등하다'라고 한다.
멱등: 같은 메서드를 1번 호출하나 100번 호출하나 결과가 같은 것
이걸 왜 알아야 할까? 💡 서버가 타임아웃 등으로 정상 응답을 못 주었을 때 클라이언트가 재요청을 해야 하는지 판단하기 위해
(결제 요청 후 정상 응답이 안 와서 결제가 됐는지 안 됐는지 모를 때는 재요청 하면 안 된다. 결제가 여러 번 될 수도 있으니까)
캐시란?
💡 크기가 큰 리소스를 요청해서 응답을 받았을 때, 웹 브라우저가 그 리소스를 내 로컬 PC에 저장하는 것.
그래서 다음에 그 리소스가 필요할 때는 또 요청할 필요 없이 내 로컬 PC에서 가져와서 사용할 수 있다.
실제로는 GET이랑 HEAD 정도만 캐시로 사용 가능하다.
form 태그 안의 전송 버튼을 누르면 웹 브라우저가 form의 데이터를 읽어서 HTTP 메시지를 생성해 준다.