[SpringBoot] REST API

LaStella·2023년 4월 3일
0

REST

  • REST(Representational State Transfer)는 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식입니다.
  • 로이 필딩(Roy Fielding)의 2000년 박사학위 논문에서 소개되었으며, 필딩은 HTTP의 주요 저자 중 한 사람입니다.
  • 엄격한 의미로 REST는 네트워크 아키텍처 원리의 모음입니다.
  • '네트워크 아키텍처 원리'란 자원을 정의하고 자원에 대한 주소를 지정하는 방법을 말합니다.
  • 간단한 의미로는, 웹 상의 자료를 HTTP위에서 SOAP이나 쿠키를 통한 세션 트랙킹 같은 별도의 전송 계층 없이 전송하기 위한 아주 간단한 인터페이스를 말합니다.
    출처-https://ko.wikipedia.org/wiki/REST

API

  • API는 Application Programming Interface(애플리케이션 프로그램 인터페이스)의 줄임말입니다.
  • API의 맥락에서 애플리케이션이라는 단어는 고유한 기능을 가진 모든 소프트웨어를 나타냅니다.
  • 인터페이스는 두 애플리케이션 간의 서비스 계약이라고 할 수 있습니다.
  • 이 계약은 요청과 응답을 사용하여 두 애플리케이션이 서로 통신하는 방법을 정의합니다.
  • API 문서에는 개발자가 이러한 요청과 응답을 구성하는 방법에 대한 정보가 들어 있습니다.
    출처-https://aws.amazon.com/ko/what-is/api/

REST 아키텍쳐 스타일

  • 클라이언트-서버 (client-server)
    사용자 인터페이스에 대한 관심을 데이터 저장에 대한 관심으로부터 분리함으로써 클라이언트의 이식성과 서버의 규모확정성을 개선한다.
  • 스테이트리스 (stateless)
    클라이언트의 상태를 서버에서 관리하지 않습니다. 모든 요청에 필요한 모든 정보가 담겨 있어 가시성이 좋고
    요청 실패시 복원이 쉽기 때문에 신뢰성이 좋습니다. 상태를 저장할 필요가 없어 규모 확장성이 개선됩니다.
    이와 반대로 스테이트풀하게 만드는 대표적인 것은 Cookie를 사용하여 세션 관리입니다.
  • 캐시 (cache)
    캐시가 가능해야 합니다. HTTP가 가진 캐싱 기능이 적용 가능합니다. HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능합니다.
  • 균일한 인터페이스 (uniform interface)
    URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말합니다.
    • Richardson Maturity Model
  • 계층화된 시스템 (layered system)
    REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 합니다.

Richardson Maturity Model

REST인지 판별하는 모델

이미지출처-https://martinfowler.com/articles/richardsonMaturityModel.html

  • Level0
    HTTP로 리소스를 전달합니다.
    SOAP기반의 프로토콜을 말합니다.
    SOAP은 원격 프로시져 호출(Remote Procedure Call)로 외부에 메소드를 호출하는 합니다.
    단 하나의 엔드포인트(즉, URL)만이 존재하며 요청을 xml로 정의하고 POST방식으로 호출합니다.
    서버에서 요청에 대한 응답 역시 xml로 전달합니다.
  • Level1
    리소스 개념이 생기고, 리소스 단위로 여러개의 엔드포인트가 존재합니다.
    리소스 중심 설계(리소스 단위 URL 설계)
    Representation Data를 사용합니다.

  • Level2
    GET, PUT, POST, DELETE 등 HTTP 메소드(HTTP Verbs)를 도입합니다.
    리소스에 접근하는 용도에 맞게 적절한 HTTP메소드를 사용하는 것을 의미합니다.

  • Level3
    HATEOAS를 말합니다.

HATEOAS

Hypermedia as the Engine of Application State (hey-dee-us)
리소스에 안에 전달한 리소스를 가지고 할 수 있는 행위를 모두 기술합니다.

Representation Data

헤더에 의해 표현되는 데이터가 다릅니다.
ex.

하나의 리소스에 대해서 다양한 형태로 표현이 가능합니다.

API 설계

  1. URI는 정보의 자원을 표현해야 합니다. (리소스명은 동사보다는 명사를 사용)
❌ GET /members/delete/1
  1. 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)로 표현합니다.
✅ DELETE /members/1
❌ GET /members/show/1
✅ GET /members/1
✅ POST /task/1/run
  1. 슬래시 구분자(/)는 계층 관계를 나타내는 데 사용합니다.
    ex. /hotels/hotelname/rooms/roomnumber

  2. URI 마지막 문자로 슬래시(/)를 포함하지 않습니다.
    특정한 동사를 사용하여 단순한 리소스의 CRUD가 아닌 액션을 표현하고 싶다면 마지막에 두는 것이 좋습니다.
    ex. /task/1/run

  3. 하이픈(-)은 URI 가독성을 높이는데 사용합니다.

Rest Controller

이미지출처-https://bepoz-study-diary.tistory.com/374

Argument Resolver애서 핸들러에 파라미터에 전달할 Argument값들을 변환합니다.
@RequestBody나 @ResponseBody를 반환하게 되면 HTTP메세지 컨버터가 동작합니다.
HTTP메세지 컨버터는 반환된 값을 Http 메세지(JSON)로 변환시켜줍니다.

실습

CumstomerController

    @GetMapping("/api/v1/customers")
    @ResponseBody
    public List<Customer> findCustomers() {
        return customerService.getAllCustomers();
    }

    @GetMapping("/customers")
    public String viewCustomersPage(Model model) {
        var allCustomers = customerService.getAllCustomers();
        model.addAttribute("serverTime", LocalDateTime.now());
        model.addAttribute("customers", allCustomers);
        return "views/customers";
    }

url에 버전과 api임을 명시해줍니다.
HTTP메세지로 변환하기 위해 @ResponseBody 어노테이션을 붙여줍니다.

결과

참고글

알고보니-REST 아키텍처 스타일

profile
개발자가 되어가는 중...

0개의 댓글