이 포스팅은 인프런 강의 중 쥬쥬님의 '쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS' 에 올라온
코드 및 사진 이미지 모두 해당 강의를 참고하였습니다.
(인프런)쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS링크
😆기획자
안녕하세요! 저희는 지금부터 맛집 리뷰 서비스를 만들어볼 예정입니다. 저희의 서비스는 맛집을 관리하고 사용자들이 맛집에 방문한 이후에 리뷰를 작성해서 다른 사용자들이 맛집을 방문하기전 리뷰와 평균 별점을 확인할 수 있도록 하는 서비스에요! 저희의 서비스에서는 맛집을 등록하고 수정하고 삭제할 수 있으며, 맛집마다 리뷰를 작성하거나 삭제할 수 있습니다. 맛집은 이름, 주소, 메뉴를 가지고 있으며 메뉴는 이름과 가격으로 구성됩니다. 리뷰는 본문과 별점을 가지고 있습니다. 맛집은 여러개의 메뉴와 리뷰를 가질 수 있어요! 리뷰는 메뉴별로는 작성이 불가합니다!
사용자Flow(Usercase)
데이터
이름(String)
주소(String)
N개의 메뉴
N개의 리뷰
출처: 쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS
API Spec
GET /restaurants
// response
[
{
"id": Long,
"name": string,
"address": string,
"createdAt": string,
"updatedAt": string
},
...
}
맛집의 리스트를 가져오는 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를 받아온다.
POST /restaurant
{
"name": string,
"address": string,
"menus": [
{"name": string, "price": int},
...
]
}
맛집이 생성될 때, 메뉴도 필요하기 때문에 메뉴 정보도 함꼐 받는다.
PUT /restaurant/{restaurantId}
{
"name": string,
"address": string,
"menus": [
{"name": string, "price": int},
...
]
}
이것은 기존에 만들었던 맛집을 수정하는 것이기 때문에
패스 베리어블 방식으로 맛집의 아이디를 받고, 리퀘스트 바디로는 맛집을 생성할 때 사용했던 인자들을 그대로 사용한다.
DELETE /restaurant/{restaurantId}
맛집을 삭제할 때에는 맛집의 아이디를 페스 베리어블로 받는다.
+삭제같은 경우에는 보편적으로 응답값을 필요로 하지 않기 때문에, 응답값이나 요청값은 없다.
POST /review
{
"restaurantId": int,
"content": string,
"score": float
}
리뷰는 맛집을 작성한 이후에 리뷰를 작성할 수 있기 때문에, 맛집의 아이디도 받는다.
그리고 리뷰의 내용과 스코어인 별점을 스코어를 함께 넘긴다.
DELETE /review/{reviewId}
리뷰 삭제 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차적으로 해당 내용을 찾아보았다.
페이징을 통해 사용자는 특정 맛집의 리뷰를 조금씩 나누어 볼 수 있으며, 서버는 필요한 만큼의 데이터만 효율적으로 전송할 수 있게 된다.