Spring/series

[spring 9편] rest api 정리

무대포 개발자 2022. 6. 15. 21:33
728x90
반응형

목차는 spring series 목차 에 있습니다.

[spring 9편] rest api 정리

rest 란?

  • Representational state transfer
  • rest 는 스펙이 아니라 규칙의 집합입니다.
  • HTTP 기반으로 자원에 접근하는 방법을 명시한 아키텍처 입니다.
  • 자원은 DB 데이터, 이미지, 파일 등을 의미 합니다.
  • URI 을 통해 자원을 명시하고, HTTP METHOD 를 통해 해당 자원에 대한 행위를 표현합니다.

rest 특징

1. 서버에 있는 resource 는 고유 URI 를 가지고 있습니다.

  • Member 테이블에 접근하고자 할 때, '/member/1 (GET)' URI 로 클라이언트에서 요청합니다.
  • Address 테이블에 접근하고자 할 때, '/addr/1' (GET)' URI 로 클라이언트에서 요청합니다.

2. 세션 정보를 별도로 관리할 필요가 없음.

  • rest api 는 http 프로토콜을 사용하며, http 프로토콜은 stateless 입니다. 즉, 서버에 상태를 저장할 수 없으며, 이는 분산 환경에 사용하기 적합합니다.

3. HTTP METHOD 사용

  • GET,POST,PUT,DELETE 4개 메소드를 통해 자원에 대한 행위를 정의할 수 있습니다.
  • HTTP Method 로만 행위를 표현할 수 있기에 복잡한 행위를 표현하기에 부족할 수 있습니다.
  • 멱등성이란 여러 번 수행을 해도 같은 경우를 의미합니다.
  • HTTP Method
    • GET : 조회 메소드입니다. 멱등성을 보장합니다.
    • POST : 데이터 생성 메소드입니다. 멱등성 보장하지 않습니다.
    • PUT : 데이터 갱신을 의미하며, 멱등성 보장합니다.
    • PATCH : 해당 자원의 일부 교체합니다. PUT 은 자원 전체를 갱신하는 것을 의미합니다. PATCH 는 그렇기에 멱등성을 보장하지 않습니다.
    • DELETE : 데이터를 삭제합니다.
  • 응답 상태 코드
    • 1xx : 리퀘스트를 받고 처리중에 있다는 상태입니다.
    • 2xx : request 성공적으로 처리한 상태입니다.
    • 3xx : 리다이렉션을 의미하는 상태입니다.
    • 4xx : 클라이언트 오류 입니다.
    • 5xx : 서버 오류입니다.

rest api (구성요소, 멱등성 등)

  • rest 한 것을 따른 API 를 restful api 라고 합니다.

REST (Representational state transfer) 구성요소

  • 리소스, 메서드, 메세지 3가지 요소로 구성됩니다.
  • 리소스를 통해 자원을 명시하고, 메서드를 통해 자원에 대한 행위를 결정하며, 메세지를 통해 행위에 대한 상세 또는 응답에 대한 상세를 표현할 수 있습니다.
HTTP POST https://localhost/members/
{
    "members": {
         "name" : "test",
         "age" : 20
     }
}

Resource Naming

  • 리소스를 지칭하는 것 이기에 명사를 사용하는 것이 좋으며, 복수를 쓰는 것이 좋습니다. 세부, 상세 내용에 접근할 때는, ID, seq 등을 사용합니다.

    • /members/{memberId}
  • 하나의 REST API 에 복잡한 관계를 표현해야할 때도 있습니다. '/' 를 이용해서 계층관계를 표현할 수 있습니다.

    • 예를 들면, /users/{userId}/articles/{articlesId}
    • 특정 user 의 article 상세 정보를 접근하는 리소스명
  • URI 길이가 긴 경우 하이픈을 사용합니다.

    • /users/{userId}/payment-method

캐시 기능

  • REST 는 HTTP 프로토콜을 사용하기에 HTTP 프로토콜 캐시를 사용할 수 있습니다.
  • 동작 방식은 다음과 같습니다.
    • Client —> Server 로 Last-Modified 태그를 보내고, 서버에서 변한게 없다면 304 Not Modified 라고 응답을 줍니다.
Client --> Server
HTTP GET /api/members/1
Last-Modified: Mon, 20 Feb 2022 11:12:13 GMT

Server --> Client (304 Not Modified)
If-Modified-Since: Mon, 20 Feb 2022 11:12:13 GMT

spring rest api source

@RestController
@RequiredArgsConstructor
public class MemberApiController {
    private final MemberService memberService;
    @GetMapping("/api/v1/members/{memberId}")
    public CommonResponse getMember(@PathVariable("memberId") String memberId) {
        MemberDto.Main response = memberService.getMember(memberId);
        return CommonResponse.success(response);
  }
}

reference