필요 API 스펙 정의

손대중·2022년 3월 20일
0

이제는 API 서버를 코딩해야겠다. (express 사용)

근데 뭘 코딩해야하지? 먼저 블로그에서 사용할 API 들을 정의해야겠지...

블로그에서는 어떤 API 를 사용하지? 결국 먼저 블로그 컨셉부터 대충이라도 정의해야겠지...

블로그 간단 구조

구조는 단순하게 가자.

  • Menu 와 Article 이 존재한다.
  • Menu 끼리 계층 구조를 가질 수 있으며, Menu 는 최대 하나의 부모를 가질 수 있다. (자식 Menu 의 개수에는 제한이 없다.)
    • 자연스럽게 부모가 없는 Menu 는 최상단 Menu, 자식이 없는 Menu 는 leaf Menu 가 된다.
  • Menu 계층 구조의 깊이는 최대 3 이다.
  • leaf Menu 는 N개의 Article 을 가질 수 있다.
  • Article 은 무조건 하나의 leaf Menu 에 속한다.

필요한 API 는?

일단 Menu 리스트 & Article 리스트를 가져오는 API 가 필요하겠지?

  • GET /menus
    • Menu 리스트 가져오기
  • GET /articles
    • Article 리스트 가져오기

먼저 Menu 와 Article 에 어떤 데이터들이 필요로 하는지 생각해보자.

  • key
    • Menu private key
  • name
    • Menu 명
  • parent
    • 부모 Menu key
  • children
    • 자식 Menu key 리스트
  • articles
    • 내가 가지고 있는 Article key 리스트

Article Data

  • key
    • Article private key
  • title
    • Article 제목
  • contents
    • Article 본문
  • created
    • Article 생성 날짜
  • menu
    • 내가 속한 Menu key

당연히 더 필요한 데이터가 있겠지만, 일단 Menu 와 Article 의 최소 조건은 요 정도가 아닐까?

지금까지의 내용을 바탕으로 /menus 와 /articles 의 세부 내용 정의를 하자.

아 참고로 모든 API 의 response 는 json 형식으로 리턴할거다.

추가로 Menu 는 몇개 안될 거기 때문에 그냥 모든 데이터를 한꺼번에 줘도 되는데, Article 은 N 개가 존재한다고 가정하면 모든 Article 을 한번에 가져오는 건 부하가 클 듯 하다. (낭비이기도 하고)
/articles 는 페이징 방식을 차용하자.

  • GET /menus

    • request - 없음
    • respone
      • Menu 리스트
      • Menu - {}
        • key - string (not null)
        • name - string (not null)
        • parent - string (default: '')
        • children - string [] (default: [])
        • articles - string [] (default: [])
      • ex)
        [
        	{key: 'menu 0', name: 'menu 0', chilrend: [], articles['article 0', 'article 1', ...]},
        	{key: 'menu 1', name: 'menu 1', chilrend: ['menu 11', 'menu 12', ...], articles[]},
           ...
        ]
  • GET /articles

    • request - parameter
      • pageSize - number (default: 10)
        • 페이지당 article 개수
      • page - number (default: 0)
        • 현재 페이지
      • menus - string (default: '')
        • 타겟 Menu 리스트
        • , 으로 Menu key 구분
      • ex)
        /articles?pageSize=10&page=0&menus=menu0,menu1
    • response
      • Article 리스트
      • Article - {}
        • key - string (not null)
        • title - string (not null)
        • contents - string (default: '')
        • created - string (not null)
          • YYYYMMDDHHMMSS
        • menu - string (not null)
      • ex)
        [
        	{key: 'article 0', title: 'title', contents: 'contents', created: '19851031052222', menu: 'menu 0'},
        	{key: 'article 1', title: 'title', contents: 'contents', created: '19851031053333', menu: 'menu 0'},
          ...
        ]

0개의 댓글