REST API 와 URI 설계

2023. 2. 11. 23:03JAVA Back-End

REST (Representational State Transfer : 자원의 상태 전달) - 네트워크의 아키텍처

 

특징

1. client, server

client와 server가 독립적으로 분리 되어 있어야 한다.

 

2. Stateless

요청에 대해서 client의 상태를 서버에 저장하지 않는다.

 

3. Cache

client는 서버의 응답(response)를 Cache(임시저장) 할 수 있어야 한다.

client가 Cache를 통해 response를 재사용! 할 수 있어야 하고, 이를 통해 서버의 부하(오버헤드)를 낮춘다.

(서버에서도 캐싱해서 부하를 낮추기도한다. ex) redis cache같은?)

 

4. 계층화된 시스템 ( Layered System)

server와 client 사이에 방화벽, Gateway, Proxy같은 다양한 계층 형태로 구성할 수 있고 이를 확장할 수 있다

 

5. 인터페이스 일관성

일터페이스 일관성을 지키고. 아키텍쳐를 작은 단위로 분리해 클라, 서버가 독립적으로 개선될 수 있어야한다.

  • 자원의 식별
     웹 기반 REST 에서는 리소스 접근할 때 URI를 사용
     https://foo.co.kr/user/100
     Resource: user
     식별자: 100 
     100번째 유저라는 것을 식별할 수 있어야함

  • 메세지를 통해 리소스 조작
    HTML, XML, JSON, TEXT 등으로 데이터를 전달 가능하다. 어떤 타입인지 알려주기 위해
    HTTP Header의 Content-type으로 테이터 타입 지정할 수 있음.
    메시지 형태로 데이터를 주고받아야하며 data를 전체로 주고받지 말아야 함.  특정 API 스펙을 공유해 클라이언트 서버가 독립적으로!
  • 자기 서술적 메세지
    요청 데이터가 어떻게 처리 되는지 충분한 데이터를 포함할 수 있어야 함.
    Http기반의 REST에선 Http Method와 Header정보, 그리고 URI에 포함되는 정보로 표현할 수 있다. 그 외에 담지 못한 정보들은 URI의 메세지를 통해 표현해야 한다.

이런 조건들을 잘 갖춘 경우를 REST ful하다고 하고 이를 REST API라고 한다.

 


URI과 URL 

* URI ( Uniform Resource Identifier ) 

인터넷에서 특정 자원을 나타내는 주소 값. 해당 값을 유일. 

Request:  https://www.udemy.co.kr/reousrce/sample/1

Response:  study.pdf

 

* URL (Uniform Resource Locator)

인터넷 상에서 자원, 특정 파일이 어디에 위치하는 지 식별하는 주소

Request: https://www.udemy.co.kr/study.pdf 

 

URL주소 자체가 특정 서버의 특정 디렉토리의 위치한 특정 파일

따라서 URL은 URI의 하위개념

 

 

 

 

URI 설계 원칙

* RFC-3986을 따라서 설계원칙을 세움

 

  • 슬래시 구분자는 계층 관계를 나타내는 데 사용
    https://hyeokjin-store/category/pants

  • URI 마지막에는 / 포함하지 않음
    https://hyeokjin-store/category/pants/

  • 하이픈은 URI가독성을 높이는 데 사용. 2단어 이상일때 카멜케이스말고 하이픈으로!
    https://hyeokjin-store/my-point

  • 밑줄 (_) 은 사용하지 말 것
    https://hyeokjin-store/my_point


  • URI 경로는 소문자로
    https://hyeokjin-store/my/point (o)
    https://hyeokjin-store/MY/point (x)


  • 파일 확장자는 URI에 포함하지 않음
    https://hyeokjin-store/usage.jsp (x)
  • 프로그래밍 언어에 의존적인 확장자를 사용하지 않음
    https://hyeokjin-store/usage.go (x)

  • 구현에 의존적인 경로를 사용하지 않음
    https://hyeokjin-store/servlet/classes/java/usage (x)
  • 세션 ID는 포함하지 않음
    https://hyeokjin-store/my?session-id=dke132 (x)

  • 프로그래밍 언어의 Method명을 이용하지 않음 (introduce메소드를 실행시려라 라는..)
    https://hyeokjin-store/my?action=introduce
  • 명사에 단수형 보다 복수형으로 사용. 컬렉션에 대한 표현은 복수로 사용함
    https://hyeokjin-store/pants/short/reds

  • 컨트롤러 이름으로는 동사를 사용
    https://hyeokjin-store/pants/re-order
  • 경로 부분 중 변하는 부분은 유일한 값으로 대체함
    pants/shorts/{shorts-category-id}/product/{product-id}
    pants/shorts/2/product/12033



  • CROD 기능을 URI에 사용하지 않음
    /user/100/READ (x)

  • URI Query Parameter 디자인
    URI쿼리 부븐으로 컬렉션 결과에 대해 필터링 할 수 있음
    pants/short?szise=32


  • URI 쿼리는 컬렉션의 결과를 페이지로 구분하여 나타내는 데 사용
    pants/short?szise=32&page=0&sort=asc

'JAVA Back-End' 카테고리의 다른 글

상태유지(Cookie & Session)  (0) 2019.06.14
[Web API] Web API 정리  (0) 2019.03.09
[REST API] REST API인가? Web API인가?  (0) 2019.03.09
[JDBC] MySQL에서 JDBC 사용  (0) 2019.03.09
[JDBC] JDBC (Java Database Connectivity)  (1) 2019.03.06