Code States/TIL

[0323] HTTP - REST API 문서 작성

ki1111m2 2023. 3. 23. 18:14

학습 목표

  • 쿠키의 작동 원리를 이해할 수 있다
  • HTTP 헤더의 역할에 대해 이해할 수 있다.
    • 표현, 콘텐츠 협상 등 다양한 헤더의 역할에 대해 알 수 있다.
  • REST API에 대해 이해할 수 있다.
    • REST API 문서를 읽을 수 있다.
    • REST API에 맞춰 디자인할 수 있다.
  • HTTPS의 개념을 이해할 수 있다.
    • HTTP와 HTTPS의 차이점을 이해할 수 있다.

API 디자인의 선행 과정


  • 관계형 데이터 모델링
    • REST API는 데이터나 자원을 HTTP URI로 표현하는 것이 목표
      • 어떤 리소스를 요청/응답으로 주고 받을 것인가?
      • 해당 리소스에는 어떤 내용을 포함하는가?
    • 전달 과정에 필요한 데이터를 디자인 하는 이러한 과정은 큰 틀에서 데이터 모델링의 한 부분으로 볼 수 있음
    • 여러 개의 표 형식으로 정의할 것이므로 관계형 데이터 모델링이라고 할 수 있음
  • 블로그에 필요한 데이터 모델은?
    • 사용자
      • 예시

      login_name  name  email  is_admin
      kimcoding 김코딩 kimcoding@codestates.com false
      devlee 이개발 dev@codestates.com false
      choiops 최운영 ops@codestates.com true
    • 블로그 글
    • 댓글
    • 데이터가 행(row)의 형태로 쌓옂기 전에 필드(열, column)이 먼저 정의되어야 함
    • 필드 정의 후 데이터를 넣을 때는 모든 값이 일관된 자료형(type)이어야 함
      • 따라서, 필드 정보(스키마)만 표시하고자 할 때에는 반드시 자료형을 같이 적어주어야 함

      필드 이름  타입(자료형)
      login_name 문자열
      name 문자열
      email 문자열
      is_admin 불린(boolean)
  • HTTP API를 통한 데이터 전송
    • 위와 같은 데이터가 HTTP 프로토콜을 통해 전달되려면, 표를 문자열로만 표현해야 함
      • 이와 같이, 데이터가 어떠한 정해진 문자열 형태로 변환되는 과정을 직렬화(serialize)라고 함
    • 위의 표를 직렬화하는 대표적인 방법으로, JSON 형태의 포맷을 사용하는 것이 일반적
    [
      {
        "login_name": "kimcoding",
        "name": "김코딩",
        "email": "kimcoding@codestates.com",
        "is_admin": false
      },
      {
        "login_name": "devlee84",
        "name": "이개발",
        "email": "dev@codestates.com",
        "is_admin": false
      },
      {
        "login_name": "choiops",
        "name": "최운영",
        "email": "ops@codestates.com",
        "is_admin": true
      }
    ]
    
    • JSON에서 허용하는 자료형은 다음과 같으며, 자료형은 암묵적으로 정의되어 있음
      • 문자열
      • 숫자
      • 불린(boolean)
      • 객채
      • null
  • 리소스에 따른 HTTP API
    • 데이터 모델링을 통해 리소스 정의와 HTTP로 전송할 준비가 끝났다면, URI Path 디자인
    • REST API는 리소스를 대표하는(repersentational) 문자열로 Path를 지정함
    GET /users
  • POST /article Content-Type: application/json { "title": "오늘의 TIL", "body": "오늘은 REST API를 배웠다", "author": "devlee84" }

API 디자인 실습 도구 안내


  • 실제로 애플리케이션을 개발할 때에는 데이터베이스와 데이터베이스 접근 코드를 사용
  • 스프레드시트는 API 연습 도구로 사용
  • 스프레드시트 (Google Sheet)
    • 어떤 형태로 데이터가 저장되어 있는지, 필드는 어떤 것들이 있는지 쉽게 알아볼 수 있어서 유용함
    • 첫번째 행(row)에는 반드시 필드 이름이 들어가야 하며, 공백을 포함하지 않는 영문자로 작성되어야 함
    • 두번째 행부터는 필드에 맞는 데이터가 들어가야 함
    • 필드에 데이터르 ㄹ넣을 때는 모든 값이 일관된 자료형(type)이어야 함
  • 스프레드시트 기반 API 변환 도구 (Sheety)
    • HTTP 호출로 구글 시트의 내용을 조회하거나 새로운 열을 생성하는 등의 작업 가능

API 문서 작성하기 (Open API)


  • API 문서를 잘 작성해야 하는 이유
    • REST API를 사용하기 위해 필요한 정도
      • 엔드포인트
      • Path
      • Path 파라미터 또는 쿼리 파라미터
      • 헤더 정보
      • 요청 본문
    • API 문서에 응답 정보도 같이 적혀있다면, 굳이 요청을 보내지 않아도 응답이 어떤 형태인지 알 수 있음
      • 상태코드
      • 응답 본문
  • OpenAPI 명세
    • 데이터는 key: value의 형태이며, key: 와 value 사이에는 반드시 공백 필요
    • 계층 구조를 표현하기 위해서 2칸 혹은 4칸의 들여쓰기를 사용해야 하며, 탭 문자열은 허용되지 않음
    • 주요 key
      • openapi: OpenAPI의 명세 버전 입력
      • info: API 문서 정보, 하위 계층이 존재하며 하위 계층에서 사용할 수 있는 키는 다음과 같음
        • description: API 문서 설명
        • version: API의 버전 명시
        • title: API 문서 제목
      • components: 데이터 모델과 관련한 내용
        • <Model> 모델 이름 기입
        • <Field> 필드 이름 기입
        • type에는 string, number, boolean, array, object 포함 가능
        • required 항목에는 필수적으로 데이터가 있어야 하는 필드 이름을 목록으로 넣음
        components:
          schemas:
            Article:  # 여기에 모델명을 넣습니다.
              type: object
              required:
                - 필드이름1
                - 필드이름2
              properties:
                필드이름1:
                  type: 자료형
                  example: '이 필드에 실제로 들어갈 데이터의 예시를 적습니다'
                필드이름2:
                  type: 자료형
                  example: '이 필드에 실제로 들어갈 데이터의 예시를 적습니다'
            Comment:  # 여기에 모델명을 넣습니다.
              type: object
              required:
                - 필드이름1
                - 필드이름2
              properties:
                필드이름1:
                  type: 자료형
                  example: '이 필드에 실제로 들어갈 데이터의 예시를 적습니다'
                필드이름2:
                  type: 자료형
                  example: '이 필드에 실제로 들어갈 데이터의 예시를 적습니다'
        
        components:
          schemas:
            User:  # 여기에 모델명을 넣습니다.
              type: object
              required:
                - login_name
                - name
              properties:
                login_name:
                  type: string
                  example: 'kimcoding'
                name:
                  type: string
                  example: '김코딩'
                is_admin:
                  type: boolean
                  example:true
        
      • components ─ schemas ─ <Model> ┬ type ├ required └ properties ─ <Field> ┬ type └ example
      • paths: URI Path와 관련한 내용
        • <Resource> Path 자체 입력, / 문자열로 시작
        • <Method> HTTP 메소드 입력, get, post, put, delete 등
        • <StatusCode> 응답 코드 입력, ‘200’ 처럼 따옴표로 묶어서 써줘야 함
        • <ContentType> MIME 타입 입력
        • <DataModel> 데이터 모델 포맷, 직접 넣거나 $ref 지시자 이용하여 참조로 넣음
        paths:
          /패스1:  # 여기에 url path를 넣습니다.
            get:
              description: '해당 엔드포인트에 대한 설명'
              parameters:
                - in: path
                  name: 파라미터명
                  description: '패스 파라미터에 대한 설명'
                  schema:
                    type: 자료형
                  required: 필수여부
              responses:
                '응답코드':
                  description: '응답 코드에 대한 설명'
                  content:
                    application/json:
                      schema:
                        $ref: '#/components/schemas/모델이름'
            post:
              description: '해당 엔드포인트에 대한 설명'
              requestBody:
                content:
                  application/json:
                    schema:
                      $ref: '#/components/schemas/모델이름'
              responses:
                '응답코드':
                  description: '응답 코드에 대한 설명'
                  content:
                    application/json:
                      schema:
                        $ref: '#/components/schemas/모델이름'
        
       

servers: URI 엔드포인트와 관련된 정보로, 목록 형태의 값을 입력


앞으로 개발하려면 꼭 알아야할.. API 작성 요령

처음 보는 거라서 너무 어려웠다

앞으로 반복해서 보다보면 익숙해지겠지?

'Code States > TIL' 카테고리의 다른 글

[0324] WAS와 Web Server - 서버  (0) 2023.03.24
[0323] HTTP - HTTPS  (0) 2023.03.23
[0323] (페어) HTTP - REST API 문서 작성  (0) 2023.03.23
[0322] HTTP - 잘 설계된 HTTP API (REST API)  (0) 2023.03.22
[0322] HTTP - HTTP 헤더  (0) 2023.03.22