스프링

REST ? RESTful ? REST API?

쿠쿠s 2022. 5. 26. 14:21

자바 스프링을 공부하기에 카테고리는 마땅히 추가할 곳이 없어 스프링에 분류했습니다.

 

F-lab 2주차 RESTful 에 대하여 한번 공부해보라는 과제가 주어져 한번 찾아보게 되었다. 자바 스프링 공부를 하면 자연스럽게 HTTP 도 공부를 하게 되는데 그 과정에서 REST라는 단어를 많은 사람들이 쓰는것을 보았고 RESTful 하다. RESTful 하지않다. REST API 를 만드려면 어떻게 해야하나요? 라는 글 같은 것을 많이 봤지만 아직 나랑은 먼 단계 라고 생각하여 자세하게 알아 볼 생각은 없었다.. 반성하자

 

과제도 과제이지만 이미 많은 사람들이 언급하는 것으로 보아 중요할 것 같은데 왜 이런 말들이 많을까 한번 알아보고 정리해봤다.

왜? 라는 이유에 집중을 해봤다.

 

 

REST


 

REST(REpresentational State Transfer)?

Representational State => 상태를 표현한다.

  • URL 로 리소스를 표현(=식별)하고 조작은 메서드를 통해 조작한다.
  • State: URI안의 상태(State) 를 포함해라
  • URL 자체는 정보의 완정성을 띄어야 한다. => HTTP 메서드를 바꿔도 하나의 컨텐츠를 조작할 수 있어야 한다.
  • 웹에서 컴퓨터 시스템 간에 표준을 제공하여 시스템이 서로 더 쉽게 통신할 수 있도록 하는 아키텍처 스타일

*아키텍쳐 스타일 ⇒ 제약조건의 집합

 

 

탄생하게 된 이유?

How do I improve HTTP without breaking in the web
- roy Fielding -

 

- 웹을 깨뜨리지 않고 HTTP를 개선할 수 있을까?  라는 고민에서 시작 

 

 

 

REST API 란?

- REST 아키텍쳐 스타일을 따르는 API

- 하이퍼텍스트를 포함한 self-descriptive한 메시지의 uniform interface를 통해 리소스에 접근하는 API

 

제약 조건(아키텍쳐 스타일)

 

1. client - server

  • 클라이언트-서버의 각 파트가 독립적으로 개선될 수 있도록 해준다.

 

2. stateless

  • 클라이언트의 context가 서버에 저장되어서 안됨
  • 요청만 처리하면 되기 때문에 서버에서 불필요한 정보를 관리 하지 않아 구현이 단순하여 확장성이 좋다
  • 분리를 통해 구성 요소를 독립적으로 발전시켜 여러 조직 도메인의 인터넷 규모 요구 사항을 지원할 수 있다

 

3. cache

  • 캐시는 클라이언트가 동일한 리소스에 대해 반복해서 서버를 요청할 필요가 없도록 하는 것
  • 캐시 제약 조건은 요청에 대한 응답 내의 데이터에 암시적 또는 명시적으로 캐시 가능 또는 캐시 불가능으로 레이블이 지정되어야 함

 

4. uniform interface

  • REST 아키텍처  코드스타일을 다른 네트워크 기반 스타일과 구별하는 핵심 기능은 구성 요소 간의 균일한 인터페이스를 강조

 

5. layered system

  • 인터넷 규모 요구 사항에 대한 동작을 더욱 개선하기 위해 계층화된 시스템 제약 조건을 추가

 

6. code-on-demand (optional)

  • 서버에서 코드를 클라이언트로 보내서 실행시킬 수 있어야 한다. (자바스크립트)

 

 

*Uniform Interface의 제약 조건

 

1. identification of resources

  • 리소스가 URI 로 식별되면 된다.
  • 각 URL이 단일 리소스에 매핑되어야 하며 이 리소스에 대한 모든 액세스는 해당 URL을 통해 수행

 

2. manipulation of resources through representations

  • representations을 통한 리소스를 조작
  • 서버가 리소스 표현을 전송하므로 클라이언트가 클라이언트의 요구에 맞는 특정 표현을 요청할 수 있다

 

3. self-descriptive messages

  • 메시지는 스스로 설명해야한다. → 요청, 응답 메시지의 내용으로 온전히 해석이 다 가능해야한다.
  • 서버나 클라이언트가 변경이 되더라도 오고가는 메시지는 언제나 self-descriptive 하므로 해석이 가능하다.

 

4. hypermedia as the engine of application state(HATEOAS)

  • 애플리케이션 상태는 Hyperlink를 이용해 다음 상태로 전이되어야 한다.
  • 이것은 HTML처럼 하이퍼링크가 추가되어서 다음에 어떤 API를 호출해야 하는지를 해당 링크를 통해서 받을 수 있어야 합니다.

하지만 대부분 RESTful API는 self-descriptive messageshypermedia as the engine of applicationstate(HATEOAS) 두 개가 잘 지켜지지 않는다. 사실상 대부분이 HTTP API 그렇지만 실무, 많은 사람들이 저 두가지를 제외해도 REST API 라고 부른다.

 

 

왜 제약조건을 지켜야 하는가?

독립적 진화 를 하기 위해, REST는 웹의 독립적의 진화를 위해 만들어졌다.

  • 서버와 클라이언트는 각각 독립적 진화한다.
  • 서버의 기능이 변경되어도 클라이언트를 업데이트할 필요가 없다.

 

어떻게 확인하는가?

  1. 웹 페이지를 변경한다고 웹 브라우저를 업데이트할 필요가 없다.
  2. 웹 브라우저를 업데이트했다고 웹 페이즈를 변경할 필요가 없다.
  3. HTTP 명세가 변경되어도 웹은 잘 동작한다.
  4. HTML 명세가 변경되어도 웹은 잘 동작한다.

 

API는 왜 REST 하기 어려울까?

- HATEOAS 와 Self-descriptive 를 지키기위한 단점과 번거로움이 있다. (참조된 유튜브 40:30)

 

 

 

REST 왜 사용할까?

  • 결국 REST의 모든 이유는 웹을 표준화하는 것
  • 각 요청이 어떤 동작이나 정보를 위한 것인지를 그 요청의 모습 자체로 추론이 가능해짐

 

 

 

API?


API는 애플리케이션 소프트웨어를 빌드하고 통합하기 위한 정의 및 프로토콜 세트인 애플리케이션 프로그래밍 인터페이스(Application Programming Interface)를 뜻합니다.

  • 소프트웨어가 다른 소프트웨어로부터 지정된 형식으로 요청, 명령을 받을 수 있는 수단
  • API는 사용자가 원하는 것을 시스템에 전달할 수 있게 지원하여 시스템이 이 요청을 이해하고 이행하도록 할 수 있다.
  • API를 사용자 또는 클라이언트, 그리고 사용자와 클라이언트가 얻으려 하는 리소스 사이의 조정자로 생각

 

 

Best practices REST API ?


*가장 중요한 사항은 웹 표준 및 규칙을 준수하여 일관성을 유지해야 한다.

 

1. JSON으로 수락 및 응답

  • JSON은 데이터 전송의 표준입니다. 거의 모든 네트워크 기술에서 사용할 수 있습니다.

 

2. 마지막 경로에서 동사 대신 명사 사용

  • HTTP 요청 메서드에 이미 동사가 있기 때문
  • GET은 리소스를 검색
  • POST는 새 데이터를 서버에 제출
  • PUT은 기존 데이터를 업데이트
  • DELETE는 데이터를 제거

 

3. 마지막 경로에 논리적 중첩 사용

 

4. 오류를 적절하게 처리하고 표준 오류 코드를 반환

  • API의 유지 관리자들에게 발생한 문제를 이해하기에 충분한 정보를 제공한다.

5. 필터링, 정렬 및 페이지 지정 허용

  • 데이터베이스가 매우 커질 수 있어 속도저하, 시스템 다운 방지를 위해 한 번에 모두 반환X →항목을 필터링
  • 한 번에 몇가지 결과만 반환하도록 데이터를 페이징
  • 필터링 및 페이지 분할은 모두 서버 리소스 사용을 줄임으로써 성능을 향상. 데이터베이스에 더 많은 데이터가 축적될수록 이러한 기능들은 더욱 중요해짐

 

6. 우수한 보안 유지

  • 개인 정보를 자주 주고 받기 때문에 이런 통신은 비공개여야 한다.
  • SSL / TLS 사용

 

7. 성능 향상을 위한 캐시 데이터

  • 사용자가 데이터를 더 빨리 얻을 수 있다

 

8. API 버전 관리

  • 모든 사람이 동시에 새 API로 이동하도록 하는 대신 이전 엔드포인트를 점진적으로 단계적으로 제거가능
  • v1 엔드포인트는 변경을 원하지 않는 사람들을 위해 활성 상태를 유지할 수 있는 반면, 새로운 기능을 갖춘 v2는 업그레이드할 준비가 된 사람들에게 서비스를 제공 가능

 

 

 

[reference]

https://stackoverflow.blog/2020/03/02/best-practices-for-rest-api-design/

https://www.youtube.com/watch?v=RP_f5dMoHFc&ab_channel=naverd2

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

https://en.wikipedia.org/wiki/Representational_state_transfer

https://sookocheff.com/post/api/how-rest-constraints-affect-api-design/

 

참고로 https://www.youtube.com/watch?v=RP_f5dMoHFc&ab_channel=naverd2 이 유튜브는 꼭 한번 시청하기를 권해봅니다.

'스프링' 카테고리의 다른 글

서블릿(Servlet)  (0) 2022.05.31
싱글톤 패턴(Singleton)  (0) 2022.05.26
관심사의 분리(Seperation Of Concern)  (2) 2022.05.18
스프링(Spring)은 왜 사용할까?  (0) 2022.03.25
@Bean 과 @Component 의 차이?  (0) 2022.03.22