REST API

이정수·2025년 10월 23일

CS/웹 관련 공부

목록 보기
4/5

REST API
HTTP를 기반으로 하여 REST 제약조건을 준수하는 API
클라이언트Web Application데이터를 주고받기위한 인터페이스

언어 , 프레임워크 , 기술 등에 영향을 받지 않으면서 지정된 데이터 형식( JSON , XML )을 통해 클라이언트서버간 데이터 교환이 가능

HTTP Method를 지원 및 HTTPSTATELESS 특징을 승계하여 서버클라이언트를 알 수 없다.
▶ 매 Request 마다 인증을 요구.
GET, POST, DELETE, PUT, HEAD, PATCH, OPTIONS를 지원

SpringREST APISpring MVC에서 @RestController를 통해 Controller로서 구축되어 요청응답이 수행
@ResponseBody 기능 추가

REST Architecture 제약 조건
HTTP만 잘 지키더라도 Client-Server, Stateless, Cache, Layered System을 모두 준수
HTTP 프로토콜을 사용하는 상태에서 REST API 설계Uniform Inteface만 중점적으로 고려

  • Client-Server
    HTTP 프로토콜을 사용하는 구조 자체가 Client - Server Architecture 이므로 준수

  • Stateless
    HTTP 프로토콜STATELESS 특징으로 서버에서 클라이언트에 대한 정보를 알 수 없으므로 준수

  • Cache
    HTTPWeb Cache를 사용

  • Layered System
    HTTP클라이언트서버 사이에 프록시서버 ( 웹캐시 ) , API 게이트웨이 등 다양한 중간 계층들 간에 서로 기능별로 독립되어 분리
    계층유지보수 시 다른 계층에 영향을 주지않음.
    클라이언트서버와 통신 시 어떤 중간 계층을 거치는지 알 수 없음

  • Code-on-Demand ( Optional )
    Code-on-Demand서버에서 코드클라이언트로 전송하여 실행할 수 있도록 한다.
    ▶ 이는 JS를 의미하며 꼭 준수할 필요는 없음.

  • Uniform Interface
    클라이언트서버자원에 접근하는 방식이 일관되도록 하도록 하는 것
    REST API 설계 시 가장 신경쓸 부분

Uniform Interface
클라이언트서버자원에 접근하는 방식이 일관되도록 하도록 하는 것
서버 내 다른 자원에 접근하더라도 항상 동일한 Type ( Http Method, URI 구조, Response Format )으로 접근이 가능하도록 하는 것

  • Identification of Resource
    서버 내 모든 자원은 고유한 URL로 식별되어야함
    ▶ 명확한 비즈니스 모델로 설정
    ex ) /users/1, /orders/2 , ...

  • Manipulation of resources through representations
    클라이언트에서 Representation ( JSON, XML, ... )를 전송하여 서버 내 자원의 조작( CRUD )이 가능한 것

  • Self-Descriptive Message
    API요청응답외부 문서 없이 스스로 설명할 수 있어야한다.
    HTTP Message에 표현을 작성하여 추가 문서 없이 HTTP Message 자체만으로 의미를 이해해야할 수 있어야하는 능력

    Self DescriptiveHTTP Message 예시

    POST /api/index.html HTTP/1.1
    Host: example.com
    Content-Type: application/json-patch+json // Data type 지정
    Content-Length: 45
    { 						 	//	 Http Message Body 부분
      "name": "홍길동",			
      "email": "hong@example.com"
    }

    목적지 Host : example.com
    요청할 서버내 자원 : /api/index.html
    Content-Type 헤더 : application/json-patch+json
    json-patch 명세를 통해 HTTP Message Body변수를 설명

    ▶ 다음처럼 작성하여 메시지 내용으로 온전히 해당 메시지를 해석 할 수 있어야한다.



  • HATEOAS
    REST APIHypertext-driven 되어야한다.

    클라이언트에서 REST API를 통해 제공된 다른 자원을 지시하는 하이퍼링크를 통해 어플리케이션상태전이
    Http MessageLink 헤더를 통해 다른 자원에 대한 하이퍼링크를 제공
HTTP/1.1 200 OK
Content-Type: application/json
Link: </articles/1>; rel="previous",
			</articles/3>; rel="next";

REST API 설계

  • REST APIHypertext-driven 되어야한다
    APIHATEOAS 적용
    클라이언트에서 Hyperlink를 통해 어플리케이션상태를 변화

  • Resource명사 표현 :
    URLResource이므로 도메인( = 비즈니스 모델 )으로 지칭하며 동사가 아닌 명사들로 구성되어야 한다.
    REST API 설계 시 단수, 복수형을 섞어 사용하지 않으며, 모든 Resource에 대해 복수형 명사 사용!

  • 자원 검색 시 Path Variable 사용 :
    Query String/getUser?id=1이 아닌 @RestController에 의한 Path Variable/users/{id} 가 맞는 표현.
    ▶ 해당 자원에 대해 추가 질의가 존재하는 경우에만 query string을 사용

    ex ) URI : https://{serviceRoot}/{collection}/{id}

  • 적절한 Http Status Code를 반환
    @ResponseStatus 어노테이션을 통해 클라이언트가 요청 후 성공 시 200을 반환하도록 @ResponseBody( code=HttpStatus.OK ) 설정

  • HTTP Method의 적절한 사용 :
    REST는 해당 요청의 의도를 쉽게 파악 할 수 있도록 HTTP Method를 목적에 따라 구분하여 사용.
    POST /users/1/delete가 아닌 DELETE /users/1로 표기.

    HTTP MethodEndpoint
    。특정 Resource를 조작하기 위한 URL 패턴

    users백엔드 기준 도메인( = 비즈니스 모델 )인 user에서 복수로 표현가능하므로 관례적으로 users로 설정

    GET /api/users : 모든 사용자 조회
    GET /api/users/{id} : 특정 사용자 조회
    POST /api/users : 새로운 사용자 생성
    PUT /api/users/{id} : 특정 사용자 정보 전체 수정
    PATCH /api/users/{id} : 특정 사용자 정보 일부 수정
    DELETE /api/users/{id} : 특정 사용자 삭제
    GET /api/users/{id}/posts : 특정 사용자와 연결된 모든 게시물 검색
    POST /api/users/{id}/posts : 특정 사용자와 연결된 게시물 생성
    GET /api/users/{id}/posts/{post_id} : 특정 사용자와 연결된 특정 게시물 검색

출처 - 그런 REST API로 괜찮은가

profile
공부기록 블로그

0개의 댓글