[WIL] 항해 Chapter 03 (2022.07.15~2022.07.21)
Chapter 3 | 주특기 기본/심화
요구사항에 맞춰 배달서비스 API를 구성해보기
요구사항
1) 음식점 등록 및 조회
, 2) 음식 등록 및 메뉴판 조회
, 3) 주문요청하기 및 주문 조회
를 모두 완수해야 합니다.
- 스프링 서버를 통해 아래 요구사항에 맞춰 배달앱 API 를 구현합니다.
- 크게 3개의 요구사항으로 나뉘어져 있고, 제공되는 테스트 코드가 모두 성공적으로 작동하게 되면 과제 완료입니다!
1) 음식점 등록 및 조회
- 음식점 정보 입력받아 등록
- 음식점 이름 (name)
- 최소주문 가격 (minOrderPrice)
- 허용값: 1,000원 ~ 100,000원 입력
- 100 원 단위로만 입력 가능 (예. 2,220원 입력 시 에러발생. 2,300원은 입력 가능)
- 허용값이 아니거나 100원 단위 입력이 아닌 경우 에러 발생시킴
- 기본 배달비 (deliveryFee)
- 허용값: 0원 ~ 10,000원 (예. 11,000원 입력 시 에러발생.)
- 500 원 단위로만 입력 가능 (예. 2,200원 입력 시 에러발생. 2,500원 입력 가능)
- 음식점 조회
- 등록된 모든 음식점 정보 조회 가능
- 등록 시 입력한 음식점 정보 (name, minOrderPrice, deliveryFee)
- DB 테이블 ID (id)
2) 음식 등록 및 메뉴판 조회
- 음식점 ID 및 음식 정보 입력받아 등록
- 음식점 ID (restaurantId)
- 음식명 (name)
- 같은 음식점 내에서는 음식 이름이 중복될 수 없음 (예. '자담치킨 강남점'에 '후라이드치킨' 이 이미 등록되어 있다면 중복하여 등록할 수 없지만, 다른 음식점인 '맘스터치 강남점'에는 '후라이드치킨' 을 등록 가능)
- 가격 (price)
- 허용값: 100원 ~ 1,000,000원
- 100 원 단위로만 입력 가능 (예. 2,220원 입력 시 에러발생. 2,300원 입력 가능)
- 허용값이 아니거나 100원 단위 입력이 아닌 경우 에러 발생시킴
- 메뉴판 조회
- 하나의 음식점에 등록된 모든 음식 정보 조회
- 등록 시 입력한 음식 정보 (name, price)
- DB 테이블 ID (id)
3) 주문 요청하기 및 주문 조회
- 주문 요청 시 배달 음식점 및 음식 정보 입력받음
- 음식점 ID (restaurantId)
- 음식 주문 정보 (foods)
- 음식 ID (id)
- 음식을 주문할 수량 (quantity)
- 허용값: 1 ~ 100
- 허용값이 아니면 에러 발생시킴
- 주문 요청에 대한 응답으로 다음 정보를 포함시킴
- 주문 음식점 이름 (restaurantName)
- 주문 음식 정보 (foods)
- 주문 음식명 (name)
- 주문 수량 (quantity)
- 주문 음식의 가격 (price)
- 배달비 (deliveryFee)
- 최종 결제 금액 (totalPrice)
- 계산방법
- "주문 음식 가격들의 총 합" 이 주문 음식점의 "최소주문 가격" 을 넘지 않을 시 에러 발생시킴
- 주문 조회
데이터베이스 설계
테이블
ERD
프로젝트 후기
CORS(Cross-Origin Resource Sharing)
CORS란
- 최신 웹 브라우저의 보안 기능
- 웹 브라우저에서 외부 도메인 서버와 통신하기 위한 방식을 표준화한 HTTP 헤더 기반 메커니즘
- 브라우저에서 다른 출처의 리소스를 공유하는 방법
출처(Origin)란
- URL 구조의 Protocol, Host, Port를 합한 것
CORS 동작원리
Simple request(단순 요청 방법)
- 서버에게 바로 요청을 보내는 방법
- 단순 요청은 서버에 API를 요청하고, 서버는 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보내며 브라우저는 Access-Control-Allow-Origin 헤더를 확인해서 CORS 동작을 수행할지 판단
Simple request 조건
- 요청 메서드는 GET, HEAD, POST 중 하나여야 함
- 유저 에이전트가 자동으로 생성한 헤더 외에, 수동으로 설정할 수 있는 헤더는 Fetch 명세에서 CORS-safelisted request-header로 정의한 헤더만 사용 가능
- Accept
- Accept-Language
- Content-Language
- Content-Type
- DPR
- Downlink
- Save-Data
- Viewport-Width
- Width
- Content-Type 헤더에는 다음 값들만 허용
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
Preflight request
- 요청을 한 번에 보내지 않고 예비 요청과 본 요청으로 나누어 서버로 전송
- 예비 요청을 보내 안전한지 판단한 후 본 요청 전송
- 실제 리소스를 요청하기 전에 OPTIONS라는 메서드로 서버에 예비 요청을 전송하고, 서버는 이 예비 요청에 대한 응답으로 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보내며 브라우저는 단순 욫엉과 동일하게 Access-Control-Allow-Origin 헤더를 확인해서 CORS 동작을 수행할지 판단