📖/spring(김영한)
모든 개발자를 위한 HTTP 웹 기본 지식 2일차
모팔구
2023. 8. 14. 08:17
728x90
반응형
섹션4 HTTP 메서드
HTTP API를 만들어보자
- 요구사항
- 회원 목록 조회
- 회원 조회
- 회원 등록
- 회원 수정
- 회원 삭제
- URI 설계
- URI 설계
- /read-member-list
- /read-member-by-id
- /create-member
- /update-member
- /delete-member
- ⛔️위 uri는 리소스 식별이 전혀 되지 않는다
- 회원을 등록하고 수정하고 조회하는게 리소스가 아니다 회원이라는 개념 자체가 리소스다
그럼 리소스를 어떻게 식별하는게 좋을까? 회원에 대한 동작은 모두 배제하고 회원이라는 리소스만 식별하면 된다 즉 회원 리소스를 uri에 매핑시킨다 - 리소스를 식별해 uri를 설계하면 (참고: 계층 구조상 컬렉션으로 보고 복수단어 사용 권장)
- 회원 목록 조회 → /members
- 회원 조회 → /members/{id}
- 회원 등록 → /members/{id}
- 회원 수정 → /members/{id}
- 회원 삭제 → /members/{id}
- 회원 목록 조회를 제외한 나머지는 어떻게 구별해야 할까? 리소스를 행위를 분리해야 한다
- 리소스(명사): 회원
- 행위(동사): 조회, 등록, 삭제, 변경
- URI 설계
HTTP 메서드 - GET, POST
- HTTP 메서드 종류
- 주요 메서드
- GET: 리소스 조회
- POST: 요청 데이터 처리, 주로 등록에 사용
- PUT: 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH: 리소스 부분 변경
- DELETE: 리소스 삭제
- 기타 메서드
- HEAD, OPTIONS, CONNECT, TRACE
- 주요 메서드
- GET
- 리소스 조회
- 서버에 전다랗고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달함
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만 지원하지 않는 곳이 많아서 권장하지 않음
- POST
- 서버가 아직 식별하지 않은 새 리소스 생성(등록)
- 요청 데이터 처리
- 단순히 데이터를 새엇ㅇ하거나 변경하는 것을 넘어서 프로세스를 처리해야 하는 경우
- 주문에서 결제 완료 → 배달 시작 → 배달 완료처럼 단순히 값 변경을 넘어 프로세스의 상태가 변경되는 경우
- POST의 결과로 새로운 리소스가 생성되지 않을 수 있음
- 프로세스 처리 uri로 보통 동사 uri(ex. /orders/{orderId}/start-delivery)를 사용한다 이를 컨트롤 uri라고 함
- 다른 메서드로 처리하기 애매한 경우
- json으로 조회 데이터를 넘겨야 하는데, GET메서드를 사용하기 어려운 경우
- 애매하면 POST사용
HTTP 메서드 - PUT, PATCH, DELETE
- PUT
- 리소스를 대체하고 해당 리소스가 없으면 생성한다 즉 리소스 덮어쓰기를 한다
- 클라이언트가 리소스 위치를 알고 URI 지정 ex) PUT /members/100, POST /members
- json데이터의 일부 키만 지정해 값을 전송하면 지정되지 않은 키와 값들은 그냥 사라짐
- PATCH
- 리소스를 부분 변경한다. PUT의 마지막 항목 단점을 보완한다
- PUT과 마찬가지로 클라이언트가 리소스의 위치를 알고 URI를 지정한다
- HTTP가 PATCH 자체를 못 받아들이는 경우가 있는데 이럴 때는 POST를 사용하면 된다
- DELETE
- 리소스를 삭제한다
- 위와 마찬가지로 클라이언트가 리소스의 위치를 알고 URI를 지정한다
- 위 세가지 모두 POST로 대체 가능해 보인다 .. . .
HTTP 메서드의 속성
- 안전(Safe Methods): 호출해도 리소스를 변경하지 않으면 안전하다는 의미이다
- GET, HEAD, OPTIONS, TRACE 해당
- 멱등(IdemPotent Methods): 한번 호출하던 두번 호출하던 100번 호출하던 결과는 똑같다.
- GET, HEAD, PUT, DELETE, OPTIONS, TRACE 해당
- 멱등의 활용
- 서버가 TIMEOUT 등으로 정상 응답을 주지 못했을 때 클라이언트가 같은 요청을 다시 하지 해도 괜찮다
- 만약 재요청 중간에 다른 곳에서 리소스를 변경해버려도(PUT) 변경된다 멱등은 중간에 리소스가 변경되는 것까지 고려하지는 않는다.
- 캐시가능(Cacheable Methods)
- GET, HEAD, POST, PATCH 해당. 실제로는 GET, HEAD 정도만 캐시로 사용함
섹션5 HTTP 메서드 활용
클라이언트에서 서버로 데이터 전송
- 클라이언트에서 서버로 데이터를 전송하는 방식은 크게 두가지
- 쿼리 파라미터를 통한 데이터 전송
- GET
- 주로 정렬 필터(검색어)
- 메시지 바디를 통한 데이터 전송
- POST, PUT, PATCH
- 회원 가입, 상품 주문, 리소스 등록, 리소스 변경 등
- 쿼리 파라미터를 통한 데이터 전송
- 클라이언트에서 서버로 데이터를 전송하는 네가지 상황
- 정적 데이터 조회
- 이미지, 정적 테스트 문서 등을 조회하는 경우를 말하며 메서드는 GET을 사용한다 정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회 가능
- 동적 데이터 조회
- https://www.google.com/search?q=hello&hl=ko 요게 쿼리 파라미터
- 주로 검색, 게시판 목록에서 정렬 필터(검색어), 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용하며 메서드는 GET을 사용한다
- HTML form태그를 통한 데이터 전송
- HTML form submit 시 post 전송 ex) 회원 가입, 상품 주문, 데이터 변경
- Content-Type: application/x-www-form-urlencoded 사용
- form의 내용을 메시지 바디를 통해서 전송(key=value, 쿼리 파라미터 형식)
- 전송 데이터를 url encoding 처리
- HTML form은 get 전송도 가능함
- Content-Type: multipart/form-data
- 파일 업로드같은 바이너리 데이터 전송 시 사용
- 다른 종류의 여러 파일과 폼의 내용 함께 전송 가능
- 참고로 HTML form 태그는 get, post만 지원함
- HTTP API를 통한 데이터 전송
- 서버끼리 통신할 때, 앱 클라이언트와 통신할 때, 웹 클라이언트와 통신할 때(AJAX) 등에 사용
- Content-Type: application/json 주로 사용(사실상 표준)
- 정적 데이터 조회
HTTP API 설계 예시
- HTTP API - 컬렉션(POST 기반 등록)
- 회원 관리 시스템 API 설계
- 회원 목록 /members → GET
- 회원 등록 /members → POST
- 회원 조회 /members/{id} → GET
- 회원 수정 /members/{id} → PATCH, PUT, POST
- 회원 삭제 /members/{id} → DELETE
- POST - 신규 자원 등록 특징
- 클라이언트는 등록될 리소스의 URI를 모른다.
- 서버가 새로 등록된 리소스 URI를 새엇ㅇ해준다
- 컬렉션의 의미
- 서버가 관리하는 리소스 디렉토리
- 서버가리 소스의 URI를 생성하고 관리
- 여기서 컬렉션은 /members
- 회원 관리 시스템 API 설계
- HTTP API - 스토어(PUT 기반 등록)
- 파일 관리 시스템 API 설계
- 파일 목록 /files → GET
- 파일 조회 /files/{filename} → GET
- 파일 등록 /files/{filename} → PUT(기존 파일이 있으면 덮어써야 하기 때문)
- 파일 삭제 /files/{filename} → DELETE
- 파일 대량 등록 /files → POST
- PUT - 신규 자원 등록 특징
- 클라이언트가 리소스 URI를 알고있어야 한다
- 클라이언트가 직접 리소스의 URI를 지정한다
- 스토어의 의미
- 클라이언트가 관리하는 리소스 저장소
- 클라이언트가 리소스의 URI를 알고 관리함
- 여기서 스토어는 /files
- 파일 관리 시스템 API 설계
- HTML FORM 사용
- HTML form태그는 get, post만 지원하고 ajax 같은 기술을 사용할 수 있음
- 회원 관리 시스템
- 회원 목록 /members → GET
- 회원 등록 폼 /members/new → GET(폼으로 이동하는 url)
- 회원 등록 /members/new(쌤 선호) || /members → POST(데이터를 전송하는 url)
- 회원 조회 /members/{id} → GET
- 회원 수정 폼 /members/{id}/edit → GET(폼으로 이동하는 url)
- 회원 수정 /members/{id}/edit(쌤 선호) || /members/{id} → POST(데이터를 전송하는 url)
- 회원 삭제 /members/{id}/delete → POST
- HTML form 태그는 get, post만 지원하기 때문에 컨트롤 uri를 사용해야 한다는 제약이 있다 즉 POST 메서드 사용 시 동사로 된 리소스 경로를 사용하는 것이다 ex) /new, /edit, /delete 등
- 참고하면 좋은 URI 설계 개념
- 문서(document): 단일 개념(파일 하나, 객체 인스턴스, 데이터베이스 등)
- 컬렉션(collection): 서버가 관리하는 리소스 디렉터리. 서버가 리소스의 uri를 생성하고 관리
- 스토어(store): 클라이언트가 관리하는 자원 저장소. 클라이언트가 리소스의 uri를 알고 관리함
- 컨트롤러(controller), 컨트롤 URI: 문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스를 실행할 때 사용. 동사를 직접 사용함
섹션6 HTTP 상태코드
HTTP 상태코드 소개
- 상태코드: 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능
- 1xx(Informational): 요청이 수신되어 처리 중
- 2xx(Successful): 요청 정상 처리
- 3xx(Redirection): 요청을 완료하려면 추가 행동이 필요
- 4xx(Client Error): 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
- 5xx(Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함
- 만약 클라이언트가 인식할 수 없는 상태 코드를 서버가 반환하면 상위 코드로 해석해서 처리하면 된다 ex) 299 -> 2xx 라고 생각
2xx - 성공
- 200 OK: 요청 성공
- 201 Created: 요청 성공해서 새로운 리소스가 생성됨. 생성된 리소스는 응답의 Location 헤더 필드로 식별할 수 있음
- 202 Accepted: 요청이 접수되었으나 처리가 완료되지 않음. 배치 처리 등에서 사용
- 204 No Content: 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음
3xx - 리다이렉션1
- 리다이렉트: 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면 Location 위치로 자동 이동함
- 리다이렉션의 종류
- 영구 리다이렉션: 특정 리소스의 uri가 영구적으로 이동함. 그래서 원래 url을 사용하면 안된다 ex) /members → /users
- 301 Moved Permanently: 리다이렉트 요청 시 메서드가 GET으로 변하고 본문이 제거될 수 있음
- 308 Permanent Redirect: 301과 기능은 같다. 리다이렉트시 요청 메서드와 본문을 유지한다(처음 POST로 보내면 리다이렉트도 POST가 된다)
- 영구 리다이렉션: 특정 리소스의 uri가 영구적으로 이동함. 그래서 원래 url을 사용하면 안된다 ex) /members → /users
3xx - 리다이렉션2
- 일시 리다이렉션: 일시적인 변경 ex) 주문 완료 후 주문 내역 화면으로 이동
- 302 Found(기본): 리다이렉트시 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음
- 307 Temporary Redirect(권장): 302와 기능은 같음. 리다이렉트시 요청 메서드와 본문을 유지한다(요청 메서드를 변경하면 안된다)
- 303 See Other(권장): 302와 기능은 같음. 리다이렉트시 요청 메서드가 GET으로 변경
- PRG(Post/Redirect/Get) 패턴
- POST로 주문 후에 새로고침으로 인한 중복 주문을 방지하기 위한 패턴
- POST로 주문 후에 주문 결과 화면을 GET 메서드로 리다이렉트함
- 새로고침해도 결과 화면을 GET으로 조회함
- 특수 리다이렉션: 결과 대신 캐시를 사용
- 300 Multiple Choices(안씀)
- 304 Not Modified: 캐시를 목적으로 사용함. 클라이언트에게 리소스가 수정되지 않았음을 알려줌. 따라서 클라이언트는 로컬피씨에 저장된 캐시를 재사용한다(캐시로 리다이렉트함) 304 응답은 로컬 캐시를 사용해야 하므로 응답에 메시지 바디를 포함하면 안된다
4xx - 클라이언트 오류, 5xx - 서버 오류
- 4xx: 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없음. 즉 오류의 원인이 클라이언트에 있다. 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에 똑같은 재시도(새로고침 등)를 해도 실패함
- 400 Bad Request: 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음. 클라이언트는 요청 내용을 다시 검토하고 보내야함
- 401 Unauthorized: 해당 리소스에 대한 클라이언트의 인증이 필요함
- 인증(Authentication): 본인이 누구인지 확인
- 인가(Authorization): 권한 부여. 인증이 있어야 인가가 있음
- 403 Forbidden: 서버가 요청을 이해했지만 승인을 거부함. 주로 인증 자격 증면은 있지만, 접근 권한이 불충분한 경우
- 404 Not Found: 요청 리소스가 서버에 없어 찾을 수 없음.
- 5xx: 서버 문제로 발생한 오류. 서버에 문제가 있기 때문에 재시도하면 성공할 수 있음
- 500 Internal Server Error: 서버 문제로 오류 발생. 애매하면 보통 500 오류가 발생함
- 503 Service Unavailable: 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음
반응형
728x90
반응형