[네트워크] REST / REST API / RESTful 개념 및 특징

딱지의겨울

·

2021. 8. 19. 13:14

1-1 REST

REST의 개념

  • "Represntational State Transfer"의 약자
    • 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미.
      • 자원: 해당 소프트웨어가 관리하는 모든 것.
      • 상태 전달: JSON 혹은 XML을 통해 데이터를 주고 받는 것이 일반적.
    • 월드 와이드 웹(www)과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 개발 아키텍처의 한 형식
      • REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일임.
      • REST는 네트워크 상에서 클라이언트와 서버 사이의 통신 방식 중 하나.
  • HTTP URI를 통해 자원을 명시하고 HTTP Method(GET, POST, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것.
    • 웹 사이트의 이미지, 텍스트, 디비 내용 등 모든 자원에 고유한 ID인 HTTP URI를 부여함.
    • CRUD Operation
      • Create: 생성 (POST)
      • Read: 조회 (GET)
      • Update: 수정 (PUT)
      • Delete: 삭제 (DELETE)
  • 쉽게 말해 URI와 HTTP 메소드를 이용해 객체화된 서비스에 접근하는 것.

REST의 구성 요소

  1. 자원: URI
    • 모든 자원에 고유한 ID 가 존제하고, 이 자원은 Server에 존재.
    • 자원을 구별하는 ID는 '/groups/:groupsid' 와 같은 HTTP URI
    • 클라이언트는 URI를 이용해서 자원을 지정하고 해당 자원의 상태에 대한 조작을 서버에 요청.
  2. 행위: HTTP Method
  3. 표현
    • 클라이언트가 자원에 대한 조작을 요청하면 서버는 이에 적절한 응답을 보냄.
    • JSON, XML을 통해 데이터를 주고받는 것이 일반적.

REST의 장단점

  • 장점
    • HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구출할 필요가 없다.
    • HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.
    • REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.
    • 서버와 클라이언트의 역할을 명확하게 분리한다.
  • 단점
    • 표준이 존재하지 않음.
    • 사용할 수 있는 메소드가 4가지 밖에 없음.
    • 구형 브라우저가 아직 제대로 지원해지지 못하는 부분(PUT, DELETE)이 존재함.

REST의 특징

  1. Server-Client 구조
    • 자원이 있는 쪽이 Server, 자원을 요청하는 쪽이 Client가 됨.
      • REST Server: API를 제공하고 비즈니스 로직 처리 및 저장을 책임 짐.
      • Client: 사용자 인증이나 정보를 직접 관리하고 책임짐.
    • 서로간의 의존성이 줄어듬.
  2. 무상태
    • HTTP 프로토콜은 무상태성이므로 REST 역시 무상태성을 갖는다.
    • 클라이언트의 Context를 서버에 저장하지 않음. (구현이 단순해짐)
    • 서버는 각각의 요청을 완전히 별개의 것으로 인식하고 처리함. (서버 처리 방식에 일관성을 부여하여 부담이 줄어들고 서비스의 자유도가 높아짐.)
  3. 캐시 처리 가능
  4. 계층화
    • REST Server 는 다중 계층으로 구성될 수 있음.
    • API 서버는 순수 비즈니스 로직을 수행하고 그 앞단에 보안, 로드밸런싱, 암호화 등을 추가하여 구조상의 유연성을 줄 수 있고 확장성과 보안성을 향상시킬 수 있음.
  5. Code-On-Demend
    • 서버로부터 스크립트를 받아서 클라이언트에서 실행. (반드시 충족할 필요는 없음.)
  6. 인터페이스 일관성
    • URI로 지정한 자원에 대한 조작을 통일되고 한정적인 인터페이스로 수행함.
    • HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능함.

REST가 필요한 이유

  • 어플리케이션 분리 및 통합
  • 다양한 클라이언트의 등장
    • 서버 프로그램이 다양한 브라우저, 모바일 환경에서도 통신을 할 수 있어야 함.

 

1-2 REST API

REST API란

  • REST 기반으로 서비스 API를 구현한 것.
  • OpenAPI, 마이크로 서비스 등을 제공하는 업체 대부분은 REST API를 제공함.

REST API의 특징

  • 사내 시스템들도 REST 기반으로 시스템을 분산해 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 할 수 있음.
  • REST는 HTTP 표준을 기반으로 구현하므로, HTTP를 지원하는 프로그램 언어로 클라이언트, 서버를 구현할 수 있음.
  • REST API 설계 예시restapi-example

 

1-3 RESTful

RESTful이란

  • 'REST API'를 제공하는 웹서비스를 'RESTful'하다고 할 수 있음.
  • REST 원리를 따르는 시스템은 RESTful이란 용어로 지칭됨.

RESTful의 목적

  • 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것.
  • RESTful한 API를 구현하는 근본적인 목적은 일관적인 컨밴션을 통한 API의 이해도 및 호환성을 높이는 것이 주 동기이므로, 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 겂다.

RESTful하지 못한 경우

  • CRUD 기능을 모두 POST로만 처리하는 API
  • route에 resource, id외의 정보가 들어가는 경우 (/students/updateName)

참고문헌

https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

 

2-1 HTTP

HTTP 통신 개념

  • HyperText Transfer Protocol의 약자로 인터넷에서 데이터를 주고받는 프로토콜.
  • HTML 뿐만 아니라 JSON 등 다영한 포맷이 가능함.

HTTP 통신 방식

  • 클라이언트가 서버에 요청을 보내면 그에 맞는 응답 결과를 돌려주고, 클라이언트는 사용자에게 서버로부터 응답받은 결과를 보여줌.
  • 클라이언트의 요청이 있을 때 서버가 응답하는 방식으로 단방향 통신임.
  • 비연결성
    • 클라이언트가 서버에 요청을 보내고 응답을 받으면 통신이 종료됨.
    • 서버는 클라이언트가 웹사이트에 접속해있는지 알 수 없음.
    • 통신을 주고 받아도 서버와 클라이언트가 연결되어있는 것이 아니라 각각의 통신은 독립적.
      image
  • HTTP request, response 구조
    image (1)

 

3-1 웹 브라우저 요청 흐름

  1. 주소표시줄에 URL을 입력하고 Enter를 입력한다.
  2. 웹 브라우저가 URL을 해석한다.
  3. HSTS 목룍을 로드해서 확인 후, HTTPS 혹은 HTTP로 보낸다.
  4. DNS를 조회한다.
  5. ARP로 대상의 IP와 MAC address를 알아낸다.
  6. 대상과 TCP 통신을 통해 소켓을 연다.
    • 이전 단계에서 찾은 IP와 PORT 정보를 가지고 SYN, SYN+ACK, ACK 과정을 통해 서버와 연결함.
    • 연결이 성공되면 TCP/IP 계층으로 데이터를 전달한다.
    • TCP/IP 패킷을 생성함. HTTP 메시지 포함.
  7. HTTP 프로토콜로 요청한다.
  8. HTTP 서버가 응답한다.
    • HTTPD 서버가 요청을 수신.
    • 서버는 요청을 매개변수로 구분. (HTTP Method)
    • 가상 호스트가 있는지 체크.
    • 서버는 GET 요청 수락 가능한지 체크.
    • 요청에 따른 컨텐츠 불러옴.
    • 해석 후 출력을 클라이언트로 스트리밍.
  9. 웹브라우저에서 응답메시지를 받아 그린다.

 

4-1 API 응답 방식

@PathVariable

  • Spring에서 제공하는 기능으로 URL경로에 파라미터를 보내서 사용할 수 있음.
  • 경로의 특정 위치 값이 고정되지 않고 달라질 때 사용.

    @GetMapping("/user/{userName}")
    public String user(@PathVariable String userName){
        System.out.println(userName);
        return "index";
    }

JSON

  • Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷
  • 웹 어플리게이션에서 데이터를 전송할 때 일반적으로 사용. 일반적으로 서버에서 클라이언트로 데이터를 보낼때 사용. 클라이언트가 사용하는 언어에 관계 없이 통일된 데이터를 주고받을 수 있도록 하기 위해.
  • NoSQL에서 표준 표기법으로 취급되고 있으며 관계형DB인 PostgreSQL, MySQL에서도 지원하기 시작함.
  • 단점: 문법 오류에 민감, 주석을 지원하지 않음, 데이터 타입을 강제할 수 없음.
  • {} 는 객체, [] 는 배열

스크린샷 2021-08-18 오후 1 26 11