[백엔드 개발] 요구사항 분석, 페이징 기법

이나형·2024년 8월 29일
0
post-thumbnail

이 포스팅은 인프런 강의 중 쥬쥬님의 '쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS' 에 올라온
코드 및 사진 이미지 모두 해당 강의를 참고하였습니다.

(인프런)쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS링크


요구사항

😆기획자

안녕하세요! 저희는 지금부터 맛집 리뷰 서비스를 만들어볼 예정입니다. 저희의 서비스는 맛집을 관리하고 사용자들이 맛집에 방문한 이후에 리뷰를 작성해서 다른 사용자들이 맛집을 방문하기전 리뷰와 평균 별점을 확인할 수 있도록 하는 서비스에요! 저희의 서비스에서는 맛집을 등록하고 수정하고 삭제할 수 있으며, 맛집마다 리뷰를 작성하거나 삭제할 수 있습니다. 맛집은 이름, 주소, 메뉴를 가지고 있으며 메뉴는 이름과 가격으로 구성됩니다. 리뷰는 본문과 별점을 가지고 있습니다. 맛집은 여러개의 메뉴와 리뷰를 가질 수 있어요! 리뷰는 메뉴별로는 작성이 불가합니다!


이런식으로 기획자는 요구를 한다. 그러면 개발자가 할 일은 저 글에서 어떤 키워드를 찾아 개발해야 할지 정리하는 것이다.

요구사항 도출하기

사용자Flow(Usercase)

  • 맛집을 등록할 수 있다.
  • 맛집을 수정할 수 있다.
  • 맛집을 삭제할 수 있다.
  • 맛집에 리뷰를 작성할 수 있다.
  • 맛집에 작성한 리뷰를 삭제할 수 있다.
  • 맛집에 작성된 리뷰와 평균별점을 확인할 수 있다.

데이터

  • 맛집
    • 이름(String)

    • 주소(String)

    • N개의 메뉴

      • 이름(String)
      • 가격(Number)
    • N개의 리뷰

      • 본문(String)
        • 별점(Number)



ERD 도출하기


출처: 쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS



API 스펙 확인하기

API Spec

  • 맛집 리스트 가져오기 API
GET /restaurants

// response
[
  {
    "id": Long,
    "name": string,
    "address": string,
    "createdAt": string,
    "updatedAt": string
  },
  ...
}

맛집의 리스트를 가져오는 API.
기본적인 정보 이름과 주소정보를 응답값으로 가져온다.


  • 맛집 정보 가져오기 API
GET /restaurant/{restaurantId}

// response
{
  "id": Long,
  "name": string,
  "address": string,
  "createdAt": string,
  "updatedAt": string,
  "menus": [
    {"id": Long, "name": string, "price": int, "createdAt": string, "updatedAt": string},
    {"id": Long, "name": string, "price": int, "createdAt": string, "updatedAt": string},
    ...
  ]
}

맛집에 대한 정보를 더 자세히 보기위한 API

응답 값에는 네임과 주소, 그리고 메뉴 정보가 있다.
하나의 맛집만 가져오는 API이기 때문에, 두번째 인자로 맛집의 ID를 받아온다.


  • 맛집 생성 API
POST /restaurant
{
  "name": string,
  "address": string,
  "menus": [
    {"name": string, "price": int},
    ...
  ]
}

맛집이 생성될 때, 메뉴도 필요하기 때문에 메뉴 정보도 함꼐 받는다.


  • 맛집 수정 API
PUT /restaurant/{restaurantId}
{
  "name": string,
  "address": string,
  "menus": [
    {"name": string, "price": int},
    ...
  ]
}

이것은 기존에 만들었던 맛집을 수정하는 것이기 때문에
패스 베리어블 방식으로 맛집의 아이디를 받고, 리퀘스트 바디로는 맛집을 생성할 때 사용했던 인자들을 그대로 사용한다.


  • 맛집 삭제 API
DELETE /restaurant/{restaurantId}

맛집을 삭제할 때에는 맛집의 아이디를 페스 베리어블로 받는다.
+삭제같은 경우에는 보편적으로 응답값을 필요로 하지 않기 때문에, 응답값이나 요청값은 없다.


  • 리뷰 작성 API
POST /review
{
  "restaurantId": int,
  "content": string,
  "score": float
}

리뷰는 맛집을 작성한 이후에 리뷰를 작성할 수 있기 때문에, 맛집의 아이디도 받는다.

그리고 리뷰의 내용과 스코어인 별점을 스코어를 함께 넘긴다.


  • 리뷰 삭제 API
DELETE /review/{reviewId}

리뷰 삭제 API는 맛집 삭제 API와 마찬가지로,
리뷰의 아이디를 페스베리어블로 받고 응답값이나 요청값이 없다.


  • 맛집에 등록된 리뷰 가져오기 API
GET /restaurant/{restaurantId}/reviews

// response
{
  "avgScore": float, // 평균 별점
  "reviews": [
    {"id": int, "content": string, "score": float, "createdAt": string},
    {"id": int, "content": string, "score": float, "createdAt": string},
    {"id": int, "content": string, "score": float, "createdAt": string}
  ],
  "page": {
    "offset": int,
    "limit": int
  }
}

이 API는 특정 맛집의 리뷰를 가져오는 기능을 제공합니다. 요청은 GET 메서드를 사용하며, URL 경로에 맛집의 고유 식별자인 restaurantId를 포함하여 호출한다.

여기서 {restaurantId}는 리뷰를 조회할 대상인 맛집의 고유 ID를 의미한다. 이 ID를 통해 해당 맛집에 등록된 리뷰 데이터를 서버에서 가져오게 된다.

응답 형식은 JSON 방식이며, 다음과 같은 정보를 포함한다

avgScore에서는 맛집에 등록된 리뷰들의 평균 별점을 반환한다. 이 값은 모든 리뷰의 별점을 합산한 후, 리뷰 수로 나눈 값으로 계산된다.

page 부분은 페이징이라고 하는 처리와 관련된 정보가 들어가 있다.
이 부분은 궁금해서 따로 찾아보았다.



페이징이란?

📝page 부분과 페이징이란?

ChatGPT를 통해 해당 내용에 대한 궁금증을 해결할 수 있었고, 해당 내용이 거짓일 수도 있기 때문에 구글링을 통해 2차적으로 해당 내용을 찾아보았다.


페이징을 통해 사용자는 특정 맛집의 리뷰를 조금씩 나누어 볼 수 있으며, 서버는 필요한 만큼의 데이터만 효율적으로 전송할 수 있게 된다.

profile
정도를 걷는 개발자

0개의 댓글