IT STUDY LOG

블로그 애플리케이션 REST API 작성 본문

devops bootcamp 4/pair/team log

블로그 애플리케이션 REST API 작성

roheerumi 2023. 3. 23. 15:11

#해결 과제

블로그에 필요한 데이터 모델을 디자인하세요. → YAML 파일 수정

블로그 글(Article), 댓글(Comment)에 필요한 필드와 각 필드의 자료형이 무엇인지 정하세요. 스프레드시트로 정리되면 간편합니다.

스프레드시트로 작성한 데이터 모델을 Sheety와 연동하세요. → 구글 스프레드 시트 및 Sheety 사용

Sheety를 통해 블로그에 필요한 API 명세 및 요청/응답을 확인하세요. 블로그에는 다음과 같은 기능을 필요로 합니다.

  1. 조회
    1. 블로그 글 전체 조회
    2. 특정 블로그 글 조회
    3. 모든 댓글 조회
    4. 특정 댓글 조회
  2. 생성
    1. 새 블로그 글 생성
    2. 새 댓글 생성
  3. 삭제
    1. 특정 블로그 글 삭제
    2. 특정 댓글 삭제
  4. 수정
    1. 특정 블로그 글 수정
    2. 특정 댓글 수정

API 문서화를 진행하세요. → YAML 파일 완성 후 Swagger 사용

 

#실습 자료

 

#과제 항목별 진행 상황

💡 스프레드시트에 시트를 만들고 (Article, Comment 두 개가 필요합니다) 필드와 데이터를 입력해 넣으세요.

 

💡 과제 repository를 살펴보면, apidoc.yaml 이 존재합니다. 이 문서는 데이터 모델 및 URI Path에 대한 명세서입니다. 다음과 같이 블로그 글, 댓글에 대한 데이터 모델 디자인을 완성하세요.

components: # 데이터 모델
  schemas:
    Article:
      type: object
      required:
        - article_seq
        - title
        - content
        - user_id
      properties:
        article_seq:
          type: number
          example: '1'
        title:
          type: string
          example: '3월 15일의 TIL'
        content:
          type: string
          example: '오늘은 REST API를 배웠다!'
        user_id:
          type: string
          example: 'kimcoding'
        reg_date:
          type: string
          format: date-time
          example: '2023-03-23 00:00:00'
        mod_user_id:
          type: string
          example: 'kimcoding'
        mod_date:
          type: string
          format: date-time
          example: '2023-03-23 00:00:00'
    Comment:
      type: object
      required:
        - comment_seq
        - article_seq
        - user_id
        - content
      properties:
        comment_seq:
          type: number
          example: '1'
        article_seq:
          type: number
          example: '1'
        user_id:
          type: string
          example: 'kimcoding'
        content:
          type: string
          example: '열심히 공부하셨군요. 잘 보고 갑니다.'
        reg_date:
          type: string
          format: date-time
          example: '2023-03-23 00:00:00'
        mod_user_id:
          type: string
          example: 'kimcoding'
        mod_date:
          type: string
          format: date-time
          example: '2023-03-23 00:00:00'

💡 Path에 대한 정보를 완성하세요. (Sheety는 전체 row 조회, 특정 row 조회, 새 row 생성, 특정 row 수정, 특정 row 삭제에 대한 API가 이미 제공되므로 요구 사항의 대부분은 Sheety가 제공하는 대로 적어 넣으면 됩니다.)

paths: # 메서드
  # 게시글 관련 메서드
  /article: 
    get: # 블로그 글 전체 조회
      description: '블로그 글 전체 조회'
      responses:
        '200':
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                    type: array
                    items:
                      $ref: '#/components/schemas/Article'
    post:   # 새 블로그 글 생성
      description: '새 블로그 글 작성'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              $ref: '#/components/schemas/Article'
      responses:
        '200':
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                    $ref: '#/components/schemas/Article'
  /article/{article_seq}:
    get: # 특정 블로그글 조회
      description: '특정 블로그글 조회'
      parameters:
        - name: article_seq
          in: path
          description: '게시글 seq로 블로그 글 조회'
          required: true
          schema:
            type: integer
      responses:
        '200':   
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                      $ref: '#/components/schemas/Article'
    put: # 특정 블로그글 수정
      description: '특정 블로그글 수정'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              $ref: '#/components/schemas/Article'
      responses:
        '200':
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                    $ref: '#/components/schemas/Article'
    delete: # 특정 블로그글 삭제
      description: '특정 블로그글 삭제'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              $ref: '#/components/schemas/Article'
      responses:
        '200':
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                    $ref: '#/components/schemas/Article'
  /comment: # 댓글 관련 메서드
    get: # 모든 댓글 조회 - 특정 글의 모든 댓글
      description: '모든 댓글 조회 - 특정 글의 모든 댓글'
      responses:
        '200':
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                    type: array
                    items:
                      $ref: '#/components/schemas/Comment'
    post:   # 새 댓글 생성
      description: '새 댓글 작성'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              $ref: '#/components/schemas/Comment'
      responses:
        '200':
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                    $ref: '#/components/schemas/Comment'
  /comment/{comment_seq}:
    get: # 특정 댓글 조회 - 특정 글의 특정 댓글 팝업 가정
      description: '특정 댓글 조회 - 특정 글의 특정 댓글 팝업 가정'
      parameters:
        - name: comment_seq
          in: path
          description: '댓글 seq로 댓글 조회'
          required: true
          schema:
            type: integer
      responses:
        '200':   
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                      $ref: '#/components/schemas/Comment'
    put: # 특정 댓글 수정
      description: '특정 댓글 수정'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              $ref: '#/components/schemas/Comment'
      responses:
        '200':
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                    $ref: '#/components/schemas/Comment'
    delete: # 특정 댓글 삭제
      description: '특정 댓글 삭제'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              $ref: '#/components/schemas/Comment'
      responses:
        '200':
          description: '성공 응답'
          content:
            application/json:
              schema:
                type: object
                properties:
                  article:
                    $ref: '#/components/schemas/Comment'

 💡 ****YAML 문서의 오류를 찾아내세요. (**node.js 개발환경이 준비되어 있다면, npm test 명령을 통해 openapi.yaml 파일의 오류를 파악할 수 있습니다.)

  • swagger editer(https://editor-next.swagger.io/)에 yaml 파일을 업로드하면 코드 창에 밑줄 표시, 디스크립션창에 관련 내용이 나와 에러가 발생한 부분을 교정 가능
    • 오류1 : 타입명에서 오타
    • 오류2 : date타입의 경우 type: string에 format : date-time으로 지정해야 함
    • 오류3 : $ref의 경우 openapi 3.1.0부터 지원
openapi: 3.1.0
info:
  description: '블로그 API 문서입니다.'
  version: '1.0.0'
  title: '블로그 API'
$ npm test

> sprint-open-api-doc-managed@1.0.0 test
> swagger-cli validate openapi.yaml

openapi.yaml is valid

💡 **repository를 fork하고 apidoc.yaml 문서를 완성시킨 후, PR로 제출하세요.

$ git add openapi.yaml 
$ git commit -m "openapi"
$ git status
$ git remote -v
$ git push origin

 

#TROUBLE SHOOTING LOG

📝 문제 1 : npm test 시 에러 발생

$ npm test

> sprint-open-api-doc-managed@1.0.0 test
> swagger-cli validate openapi.yaml

sh: 1: swagger-cli: not found
  • 원인 : npm과 swagger 모듈이 다운로드되어있지 않음
  • 해결 방안
  1. sudo apt update : apt 업데이트
  2. sudo apt install nodejs : node.js 다운
  3. nodejs -v : 설치 확인
  4. sudo apt install npm : 노드 매니저 다운
  5. sudo npm install -g @apidevtools/swagger-cli 다운로드 하여 다시 실행

 

#참고 자료

https://swagger.io/docs/specification/basic-structure/

https://swagger.io/specification/v3/#schema

https://swagger.io/docs/specification/describing-request-body/

https://swagger.io/docs/specification/describing-parameters/

 

'devops bootcamp 4 > pair/team log' 카테고리의 다른 글

Sprint - Cozstory WAS 개발  (0) 2023.03.28
Mini WAS 개발 hands-on  (0) 2023.03.28
CozStory 클라이언트 호스팅  (0) 2023.03.27
nginx Web Server Hands-on  (0) 2023.03.24
simple git log  (0) 2023.03.21
Comments