[Spring] HTTP (2)

이연우·2025년 7월 21일

TIL

목록 보기
13/100

⚙️ HTTP Method 속성

- HTTP Method별 속성표
사진출처 : https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
→ Optional은 "Java의 Optional과 같이 있을 수 있다"라는 말과 동일

속성의미예시 메서드
안전성(Safe)서버의 상태를 변경하지 않음GET, HEAD
멱등성(Idempotent)여러 번 요청해도 결과가 같음GET, PUT, DELETE
캐시 가능성(Cacheable)응답을 클라이언트/프록시에서 저장해 재사용 가능GET, HEAD (POST는 조건부)

1. 안정성(Safe)

  • GET 메소드(조회)는 안전함
    • 저장된 데이터를 변환하지 않음
  • POST, DELETE, PUT, PATCH는 안전하지 않음
    • 데이터를 생성, 수정, 삭제함

2. 멱등성(Idempotent)

  • 한번을 호출하거나 수천번을 호출하거나 항상 결과는 같음

    1. GET → 같은 결과가 계속 조회됨
    2. PUT → 수정해서 대체된 후의 결과는 계속 같음
    3. DELETE → 같은 요청을 여러번해도 삭제된 결과는 같음
    4. POST → 멱등성을 보장하지 않음
      ex) 계좌 송금을 두 번 한다면?, 게시판 글쓰기, 회원 가입
  • 요청이 실패한 경우, 재시도하기 위해 필요함

    1. 항상 결과가 같다면 마음껏 재시도해도 됨
    2. 만약 멱등하지 않다면, 중복 요청을 보내서는 안 됨
    3. 복구 매커니즘에 사용함
      ex) 요청 실패시 서버에서 자동으로 재시도
  • 리소스 조회(GET Method)가 재요청 중간에 변경된다면?
    → 재요청 중간에 리소스가 변경되는 것은 멱등성으로 고려하지 않음

3. 캐시 가능성(Cacheable)

  • 재사용을 위해 요청에 대한 응답을 저장할 수 있는가?
    1. GET, HEAD, POST 메소드는 캐시가 가능함
    2. 일반적으로 GET, HEAD 정도만 캐시로 사용함
      ex) 변경 가능성이 적은 정적 자원(HTML, CSS, IMAGE, JS 등)을 주로 캐싱함

🔢 HTTP 상태 코드

  • 서버의 응답 상태를 나타내는 3자리 숫자 코드
  • 1xx~5xx의 의미만 정확히 이해하면 충분함
범위의미대표 코드 및 설명
1xx정보처리 중 (거의 사용 X)
2xx성공200 OK, 201 Created, 204 No Content
3xx리다이렉션301, 302, 307, 308
4xx클라이언트 오류400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xx서버 오류500 Internal Server Error, 503 Service Unavailable

📍 리다이렉션 코드 (3xx)

코드설명
301영구 이동 (GET으로 변환될 수 있음)
308영구 이동 (메서드 & Body 유지)
302임시 이동 (GET으로 변환될 수 있음)
303다른 URI 참조 (GET으로 변환)
307임시 이동 (메서드 & Body 유지)
304캐시 사용 권장, 변경 없음 (Body 없음)

PRG 패턴(Post-Redirect-Get)에서 302/303/307 사용

🧱 HTTP API 설계 원칙

❌ 잘못된 설계 예시 (동사 기반 URL)

/create/board
/read/board/1
/update/board/1
  • 게시글 생성
    • /create/board
      URL에 create라는 동사가 들어가 있음
      리소스를 "생성한다"는 동작은 POST 메서드로 표현해야 함
  • 게시글 1개 조회
    • /read/board/1
      read라는 동사는 필요 없음
      단일 리소스 조회는 GET /board/1
  • 게시글 목록 조회
    • /read/board-list
      URL에 read라는 동사가 들어가 있음
      "조회한다"는 동작은 GET 메서드로 표현해야 하고,
      URL은 리소스(명사)만 써야 함
      board-list도 중복된 표현이라 /board만 써도 됨
  • 게시글 수정
    • /update/board/1
      수정은 PUT 또는 PATCH로 처리해야 함
      URL에 update가 불필요하게 동사로 명시됨
  • 게시글 삭제
    • /delete/board/1
      삭제는 DELETE 메서드로 처리해야 하므로,
      URL은 /board/1이면 충분

⭕ 좋은 설계 예시 (RESTful 설계)

  • HTTP API는 설계 시, 항상 리소스 식별을 기준으로 삼아야 함
  • 리소스 이름은 복수형 사용
  • 동사를 URI에 쓰지 않음 → HTTP Method로 동작 정의
  • 예외 상황은 상태 코드로 구분
작업MethodURI 예시
게시글 생성POST/boards
게시글 1개 조회GET/boards/{id}
게시글 목록 조회GET/boards
게시글 수정PUT / PATCH/boards/{id}
게시글 삭제DELETE/boards/{id}

0개의 댓글