면접준비[프론트,백,데이터,CS]/InterView 준비 [ 백엔드 ]

[ 백엔드 면접 준비 ] REST & REST API & RESTfull API 란??

안다미로 : Web3 & D.S 2024. 12. 9. 17:13

 

 

 

 

[ 백엔드 면접 준비 ]  REST & REST API & RESTfull API 란??

 

 


 

∇ 백엔드 면접 준비 : REST & REST API & RESTful API 란??

목  차

1. REST.
2. REST API.
3. RESTfull API.

 

 


Ⅰ. REST.


 

 

       Ⅰ - ⅰ  REST 정의.

                 REST( Representational State Transfer ) 는 월드 와이드 웹 같은

                 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍쳐의 한 형식입니다.

 

                      1. REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 

                             웹의 장점을 최대한 활용할 수 있는 아키텍쳐 스타일입니다.

 

                      2. REST는 네트워크 상에서 Client(프론트) - Server(백) 사이의 통신 방식 중 하나입니다.

 

 

               ◎ 자원을 이름(자원의 표현) 으로 구분하여, 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미합니다.

                        === 자원(resource)의 표현(representaion)에 의한 상태 전달.

 

 

                           1. 자원(resource)의 표현(representation)

                                   ● 자원 : 해당 소프트웨어가 관리하는 모든 것

                                                   ex) 문서, 그림, 데이터, 해당 소프트웨어 자체 등

                                   ● 자원의 표현 : 그 자원을 표현하기 위한 이름

                                                   ex) DB의 학생 정보가 자원일 때, 'students'를 자원의 표현

 

                           2. 상태(정보) 전달

                                   ● 데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달합니다.

                                   ● JSON 혹은 XML을 데이터를 주고 받는 것이 일반적.

 


 

       Ⅰ - ⅱ  REST 구체적인 개념.

          HTTP URI( Uniform Resource Identifier) 를 통해 자원(Resource)을 명시하고,

       HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미합니다.

 

HTTP METHOD

 

                  ● 즉, REST는 자원 기반의 구조(ROA :: Resource Oriented Architecture) 설계의 중심에 Resource가 있고

                         HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐를 의미합니다.

 

                  ● 웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URI를 부여합니다.

 

                  ● CRUD Operation

                          - Create : 생성 ( POST)

                          - Read : 조회 (GET)

                          - Update : 수정(PUT)

                          - Delete : 삭제(DELETE)

                          - HEAD : header 정보 조회(HEAD)

 


       Ⅰ - ⅲ  REST의 장단점.

 

                ∇ 장점.

 

                     ● HTTP 프로토콜의 인프라를 그래도 사용하므로

                        REST API 사용을 위한 별도의 인프라를 구축할 필요가 없습니다.

       

                     ● HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해줍니다.

         

                     ● HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능합니다.

 

                     ● Hypermedia API의 기본을 충실히 지키면서 범용성을 보장합니다.

 

                     ● REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악 가능합니다.

 

                     ● 여러가지 서비스 디자인에서 생길 수 있는 문제를 최소화합니다.

 

                     ● 서버와 클라이언트의 역할을 명확하게 분리시킵니다.

 

 

                ∇ 단점.

 

                     ● 표준이 존재하지 않습니다.

 

                     ● HTTP Method 형태가 제한적입니다.

 

                     ● 브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL 보다 Header 값이 더 복잡.

 


       Ⅰ - ⅳ  REST가 필요한 이유.

                  ●  애플리케이션 분리 및 통합.

 

                  ●  다양한 클라이언트의 등장.

                    - 최근의 서버 프로그램은 다양한 브라우저와 안드로이드*아이폰과 같은 디바이스에서도 통신 가능해야함.

                    - 멀티 플랫폼에 대한 지원을 위해 서비스 자원에 대한 아키텍쳐를 구축하고 활용하기 위해 REST가 필요해짐.

 


 

       Ⅰ - ⅳ  REST 구성 요소.

                   ◎자원(Resource) : URI

                         ●  모든 자원에 고유한 ID가 존재하고, 이 자원은 '서버/DB'에 존재합니다.

                         ●  자원을 구별하는 ID는 '/groups/:group_id' 와 같은 HTTP URI입니다.

                         ●  클라이언트(프론트)는 UIR를 이용해서 필요한 자원을 지정하고,

                             해당 자원의 상태(정보)에 대한 조작을 서버단에 요청합니다.

 

 

                   ◎행위(Verb) : HTTP Method

                         ●  HTTP 프로토콜의 Method를 사용합니다.

                         ●  HTTP 프로토콜은 GET, POST, PUT, DELETE 와 같은 메서드를 제공합니다.

 

 

                   ◎표현(Representation of Resource) 

                         ●  '클라이언트'가 자원의 상태(정보)에 대한 조작을 요청하면

                              '서버'는 이에 적절한 응답(Representation)을 보냅니다.

                         ●  REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 표현 가능.

                         ●  JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적입니다..(현재 웹은 거의 JSON)

 


 

       Ⅰ - ⅳ  REST 특징 정리.

 

                   ◎ Client(프론트) - Server(백) [클라이언트-서버 구조]

                         ●  자원이 보내주는 쪽이 Server(백),  자원을 요청하는 쪽이 Client(프론트)가 됩니다.

                                ○  REST Server : API를 제공하고 비즈니스 로직 처리 및 저장을 책임집니다.

                                ○  Client : 사용자 인증이나 context(세션,로그인 정보) 등을 직접 관리하고 책임집니다.

 

                         ●  클라이언트(프론트)-서버(백엔드) 간의 의존성이 줄어들게 됩니다.

 

 

                   ◎ Stateless(무상태성)

                         ●  HTTP 프로토콜은 Stateless Protocol이므로, REST 역시 무상태성을 가집니다.

                         ●  Client의 context를 Server에 저장하지 않습니다.

                                ○ 세션과 쿠키와 같은 context 정보를 신경쓰지 않아도 되므로 구현이 단순해집니다.

                         ●  Server는 각각의 요청을 완전히 별개의 것으로 인식하고 처리합니다.

                                ○ 각 API 서버는 Client의 요청만을 단순 처리합니다.

                                ○ 즉, 이전 요청이 다음 요청의 처리에 연관되어선느 안됩니다.

                                ○ 물론 이전 요청이 DB를 수정하여, DB에 의해 바뀌는 것은 허용합니다.

                                ○ Server의 처리 방식에 일관성을 부여하고 부담이 줄어들며, 서비스의 자유도가 높아집니다.

 

 

                   ◎ Cacheable(캐시 처리 가능)

                         ●  웹 표준 HTTP 프로토콜을 그대로 사용하므로 웹에서 사용하는 기존의 인프라를 그대로 활용 가능.

                                ○ 즉, HTTP가 가진 가장 강력한 특징 중 하나인 캐싱 기능을 적용 가능합니다.

                                ○ HTTP 프로토콜 표준에서 사용하는 Last-Modified 태그나 E-Tag를 이용하면 캐싱 구현이 가능.

                         ●  대량의 요청을 효율적으로 처리하기 위해서 캐시가 요구됩니다.

                         ●  캐시 사용을 통해 응답시간이 빨라지고 REST Server 트랜잭션이 발생하지 않기 때문에 

                                 전체 응답시간, 성능, 서버의 자원 이용률을 향상시킬 수 있습니다.

 

 

                   ◎ Layered System ( 계층화 )

                         ●  REST Server는 다중 계층으로 구성될 수 있습니다.

                                ○ API Server는 순수 비즈니스 로직을 수행하고,

                                   그 앞단에 보안/로드밸런싱/암호화/사용자 인증 등을 추가하여 구조상의 유연성을 줄 수 있습니다.

                                ○ 또한 로드밸런싱/공유 캐시 등을 통해 확장성과 보안성을 향상시킬 수 있습니다.

                         ●  Client는 REST API Server만 호출합니다.

                         ●  PROXY, 게이트웨이 같은 네트워크 기반의 중간 매체를 사용 가능합니다.

 

 

                   ◎ 자체 표현 구조. (Self - descriptiveness)

                         ●  JSON을 이용한 메시지 포맷을 이용하여, 직관적으로 이해할 수 있고 

                                 REST API 메시지만으로 그 요청이 어떤 행위를 하는지 알 수 있습니다.

 

 

                   ◎ Code-On-Demand(optional)

                         ●  Server로부터 스크립트를 받아서 Client에서 실행합니다.

                         ●  반드시 충족할 필요는 없습니다.

 

                   ◎ Uniform Interface(인터페이스 일관성)

                         ●  URI로 지정한 Resource에 대한 조작을 통일되고 한정적인 인터페이스로 수행합니다.

                         ●  HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능합니다.

                               ○ 즉, 특정 언어나 기술에 종속되지 않습니다.

 

 


 

       Ⅰ - ⅴ  중심 규칙.

               ∇ REST에서 가장 중요하며, 기본적인 규칙은 아래 두가지 !

                       ●  URI는 정보의 자원을 표현해야 합니다.

                       ●  자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등) 으로 표현합니다.

 

 

◎ 세부 규칙.

 

1. 슬래시 구분자 ( / )는 계층 관계를 나타내는데 사용한다.

2. URI 마지막 문자로 슬래시 ( / )를 포함하지 않는다.

  • 즉 URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것
  • 역으로 리소스가 다르면 URI도 달라져야 한다.

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

4. 밑줄 ( _ )은 URI에 사용하지 않는다.

5. URI 경로에는 소문자가 적합하다.

  • URI 경로에 대문자 사용은 피하도록 한다.

6. 파일확장자는 URI에 포함하지 않는다.

  • REST API 에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않는다.
  • 대신 Accept Header 를 사용한다.
  • ex) GET: http://restapi.exam.com/orders/2/Accept: image/jpg

7. 리소스 간에 연관 관계가 있는 경우

  • /리소스명/리소스ID/관계가 있는 다른 리소스 명
  • ex) GET: /users/2/orders (일반적으로 소유의 관계를 표현할 때 사용)

 

 

HTTP Method

 


       Ⅰ - ⅵ . 설계 목표.

                - REST의 핵심 설계 목표.

 

                     1. 컴포넌트들간의 유연한 (쉽게 확장 가능한) 상호 연동성 확보.

 

                              ● 상호 연동성 : 서로 상이한 컴포넌트들을 쉽게 연결할 수 있는 성질.

                                   상호연동성은 두 개 이상의 컴포넌트들을 결합함으로써,

                                    작업을 더 효율적으로 수행하도록 하는데 목적.

                              ● 즉, REST는 HTTP와 URI 기반인데, HTTP와 URI 모두 표쥰이며

                                  직관적이고 사용이 간단하며 어디에서든 동일하게 작동하는 것을 보장합니다.

 

                     2. 범용 인터페이스.

 

                              ● 상호연동성과 비슷한 개념으로, REST 모델을 위한 HTTP와 URI는 표쥰으로 

                                   어디서든지 사용가능한 범용 인터페이스를 제공합니다.

 

                              ● 개발자는 비즈니스 로직만 고민하면 됩니다.

 

 

                     3. 각 컴포넌트들의 독립적인 배포.

 

                              ● 각 컴포넌트들과의 독립적인 배포의 의미

                                   :: 다른 컴포넌트들과 독립적으로 개발을 할 수 있다는 것.

                              ● 규격에 맞추어 개발이 되었다면, 다른 컴포넌트가 추가된다 해도 연동에 걱정 X

 

                     4. 지연 감소, 보안강화, 레거시 시스템을 "인캡슐레이션" 하는 중간-컴포넌트의 역할

 

                              ● 클라이언트는 엔드 서버에 직접 연결할 필요 없이 서비스를 이용할 수 있습니다.

                                   :: REST 서버가 클라이언트와 엔드 서버 중간에서 중계 역할.

                              ● 이러한 중계 서버로 이용하면 로드 밸런싱, 공유 메모리 등을 이용해서 

                                    확장성/성능을 향상 시킬 수 있으며 보안 정책을 적용하기도 용이합니다.

 

 

 

 


 

Ⅱ. REST API.


 

     ☆ REST API란?

             =>> REST API는 위에서 설명한 REST 아키텍쳐를 기반으로 설계된 웹 API입니다.

 

              ◆ API ( Application Programming Interface ) 란

                    :: 데이터와 기능의 집합을 제공하여서, 컴퓨터 프로그램간 상호작용을 촉진하며, 

                            상호간 정보를 교환가능 하도록 하는 것.

 

 

              ◆ REST API의 정의.

                         ●  REST 기반으로 서비스 API를 구현하는 것.

                         ●  최근 OpenAPI, MSA 등을 제공하는 업체 대부분은 REST API를 제공.

 

 

              ◆ REST API의 탄생 배경.

                         ●  웹의 장점을 최대한 활용할 수 있는 아키텍쳐로써 REST가 발표됨.

 

 

              ◆ REST API의 주요 특징.

  1. 자원(Resource) 중심: HTTP URI를 통해 자원을 식별합니다 => HTTP를 지원하는 프로그램 언어로 클라이언트-서버를 구현할 수 있습니다.
  2. HTTP 메소드 활용: GET, POST, PUT, DELETE 등의 HTTP 메소드를 사용하여 자원에 대한 CRUD 작업을 수행합니다
  3. 무상태성(Stateless): 각 요청은 독립적으로 처리되며, 서버는 클라이언트의 상태를 저장하지 않습니다
     


  4. 캐시 가능성: HTTP의 캐싱 기능을 활용할 수 있습니다
     


  5. 인터페이스 일관성: 표준화된 방식으로 데이터를 전송합니다
     


 

              ◆ REST API 설계 기본 규칙.

 

                       ●  도큐먼트 : 객체 인스턴스나 데이터베이스 레코드와 유사한 개념.

                       ●  컬렉션: 서버에서 관리하는 디렉터리하는 리소스

                       ●  스토어: 클라이언트에서 관리하는 리소스 저장소.

 

 

                     1. URI는 정보의 자원을 표현해야 합니다.

                               ●  resource는 동사보다는 명사를, 대문자보다는 소문자를 사용해야합니다.

                               ●  resource는 도큐먼트 이름으로는 단수 명사를 사용해야 합니다.

                               ●  resource는 컬렉션 이름으로는 복수 명사를 사용해야 합니다.

                               ●  resource는 스토어 이름으로는 복수명사를 사용해야 합니다.

 

                                      ex) GET / members/1

 

 

                     2. 자원에 대한 행위는 HTTP Method (GET, PUT, POST, DELETE 등) 로 표현합니다.

                               ● URI에 HTTP Method가 들어가면 안됩니다.

                                       ex)  GET/members/delete/1 ->> DELETE/members/1

                               ●  URI에 행위에 대한 동사 표현이 들어가면 안됩니다

                                       {즉, CRUD 기능을 나타내는 것은 URI에 사용하지 않습니다}

                                       ex)  GET/members/show/1 -> GET/members/1

                                       ex)  GET/members/insert/2 ->> POST/members/2

                               ●  경로 부분 중 변하는 부분은 유일한 값으로 대체합니다.

                                       { 즉, :id는 하나의 특정 resource를 나타내는 고유값입니다.}

                                       ex)  student를 생성하는 route:POST/students

                                       ex)  id=12인 student를 삭제하는 route: DELETE/students/12

 

 

              ◆ REST API 설계 시 주의할점.

  1. 슬래시 구분자(/ )는 계층 관계를 나타내는데 사용한다.
    ex) http://restapi.example.com/houses/apartments
  2. URI 마지막 문자로 슬래시(/ )를 포함하지 않는다.
    • URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 한다.
    • REST API는 분명한 URI를 만들어 통신을 해야 하기 때문에 혼동을 주지 않도록 URI 경로의 마지막에는 슬래시(/)를 사용하지 않는다.
      ex) http://restapi.example.com/houses/apartments/ (X)
  3. 하이픈(- )은 URI 가독성을 높이는데 사용
    • 불가피하게 긴 URI경로를 사용하게 된다면 하이픈을 사용해 가독성을 높인다.
  4. 밑줄(_ )은 URI에 사용하지 않는다.
    • 밑줄은 보기 어렵거나 밑줄 때문에 문자가 가려지기도 하므로 가독성을 위해 밑줄은 사용하지 않는다.
  5. URI 경로에는 소문자가 적합하다.
    • URI 경로에 대문자 사용은 피하도록 한다.
    • RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문
  6. 파일확장자는 URI에 포함하지 않는다.
    • REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않는다.
    • Accept header를 사용한다.
      ex) http://restapi.example.com/members/soccer/345/photo.jpg (X)
      ex) GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg (O)
  7. 리소스 간에는 연관 관계가 있는 경우
    • /리소스명/리소스 ID/관계가 있는 다른 리소스명
      ex) GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)

 

 

              ◆ REST API 작동 방식.

                      1. 클라이언트가 서버에 요청을 보냅니다.

                      2. 서버는 클라이언트를 인증하고 권한을 확인합니다.

                      3. 서버가 요청을 처리합니다.

                      4. 서버가 클라이언트에 응답에 맞는 값을 반환합니다

 


 

 

Ⅲ. RESTful  API.


 

◎ RESTful API는 REST 아키텍쳐의 제약 조건을 준수하며,

        REST API의 설계 원칙을 충실히 따르는 API를 의미합니다!

 

        ◆ HTTP 와 URI 기반으로 자원에 접근할 수 있도록 제공하는 앱 개발 인터페이스.

                기본적으로 HTTP 메소드와 URI 만으로 인터넷에 자료를 CRUD 가능합니다!

 

        ◆ 'REST API'를 제공하는 웹 서비스를 'RESTful' 하다고 할 수 있습니다.

 

        ◆ RESTful은 REST를 REST 답게 쓰기 위한 방법으로, 

                 누군가가 공식적으로 발표한 것은 아닙니다.

              === 즉, REST 원리를 따르는 시스템은 RESTful이란 용어로 지칭됩니다.

 

 

◎ RESTful API의 목적.

 

       ● 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것.

 

       ● RESTful한 API를 구현하는 근본적인 목적이 성능 향상 측면이 아니라, 

               일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것!!

             => 성능 측면에서는 굳이 RESTful한 API를 구현할 필요는 없습니다.

 

       ● RESTful 하지 못한 경우.

              √ ex) CRUD 기능을 모두 POST로만 처리하는 경우.

              √ ex) route에 resource,id 외의 정보가 들어가는 경우 (/students/updateName)

 

 

 

   

◎ RESTful API의 개발 원칙.

 

       A. 자원을 식별할 수 있어야 합니다.

 

             ● URI (Uniform Resource Locator) 만으로 내가 어떤 자원을 활용/제어하려고 하는지 알 수 있어야합니다.

                     == 자원을 제어하기 위해서 자원의 위치는 물론 자원의 종류까지 알 수 있어야 한다는 의미.

 

             ● 서버단에서 제공하는 정보는 JSON 형태로 HTTP body에 포함되어 전송시킵니다.

 

 

       B. 행위는 명시적이어야 합니다.

 

             ● REST는 아키텍처 혹은 방법론과 비슷합니다. (강제적이지 않다는 의미)

                   -> 기존처럼, GET을 이용해서 UPDATE와 DELETE를 해도 상관없습니다.

                          [단, 이건 REST를 따른다고 할 수 없습니다. ]

 

 

       C. 자기 서술적이어야 합니다.

 

             ● 데이터에 대한 메타정보만 가지고도, 어떤 종류의 데이터인지, 

                    데이터를 위해서 어떤 앱을 실행해야 하는지를 알 수 있어야 합니다.

 

             ● 즉, 데이터 처리를 위한 정보를 얻기 위해서,

                    데이터 원본을 추가로 읽어야 한다면 자기 서술적이지 못합니다.

 

 


 

 

 

REST의 단점들.

 

     1. REST는 point-to-point 통신모델을 기본으로 합니다. 

             - 서버와 클라이언트가 연결을 맺고 상호작용해야하는 앱의 개발에는 적당하지 않습니다.

 

     2. REST는 URI, HTTP 이용한 아키텍쳐링 방법에 대한 내용만을 담고 있습니다.

                     - 보안과 통신규약 정책은 전혀 다루지 않습니다.

                     - 개발자는 통신과 정책에 대한 설계와 구현을 따로 진행해야 합니다.

 

     3. HTTP에 상당히 의존적입니다.

                     - REST는 설계 원리이기 때문에 HTTP와는 상관없이 다른 프로토콜에서도 구현할 수 있기는 하지만 

                          자연스러운 개발이 힘듭니다.

                     - 다만 REST를 사용하는 이유가 대부분의 서비스가 웹으로 통합되는 상황이기에

                         큰 단점이 아니게 되었습니다.

 

     4. CRUD 4가지 메소드만 제공합니다. 

            대부분의 일들을 처리할 수 있지만, 4가지 메소드만으로 처리하기에는 모호한 표현이 있습니다.