Giter Club home page Giter Club logo

blue-delivery's Introduction

Blue Delivery

배달의민족 클론 코딩 프로젝트입니다.


기능정의

가게
위키참조

고객

  • 회원가입/로그인, 정보 수정, 탈퇴
  • 가게/음식 검색하기
  • 주문할 음식목록 만들기 (장바구니)
  • 주문하기
  • 결제하기
  • 리뷰작성

라이더

  • 배달 요청 수신하기
  • 배달 완료 처리하기

사용 기술

  • Java11
  • Spring boot
  • Gradle
  • MyBatis
  • MySQL
  • Docker

브랜치 전략

Github Flow

Github Flow는 main 브랜치를 가 곧 product가 되는 전략입니다.

img

(master = main)

새로운 작업 전에 작업 내용을 담은 브랜치를 생성하고 작업합니다.

  • feature-로그인구현
  • readme-edit 등

작업이 끝나면 원격 브랜치로 push 하고, Pull Request를 통해 피드백을 받습니다.

리뷰가 끝난 커밋은 main 브랜치로 병합됩니다.

(로컬) 빌드 자동화

git hook 을 이용해 로컬환경에서 빌드 자동화를 구성했습니다.

적용방법

커맨드라인에서 git config core.hookspath .githooks 설정

  • git --version 으로 버전 확인 후 2.9 아래면 업데이트 필요
  • 이후 commit 이나 push 명령시 자동으로 트리거가 실행됌

commit

push

  • 원격 저장소의 브랜치가 main 인지 확인 (main이면 push 불가능)
  • main 브랜치를 pull해서 최신 상태 유지

DB 형상관리

flyway 사용하여 런타임에 마이그레이션함.

  • @ActiveProfiles("test")를 추가하면 테스트시에 h2 인메모리 db를 사용하여 테스트함
  • application-dev.yml에 ${db_username} 등 placeholder는 시스템 환경변수에 자기의 db 이름, username 등에 맞춰 설정하면 됌

docker compose 적용

docker-compose

  • docker compose up 명령어 실행으로 필요한 이미지 다운로드 및 컨테이너 실행

blue-delivery's People

Contributors

lyh7712 avatar soongjamm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

blue-delivery's Issues

가게: 영업 시간 관리

  1. 평일/주말 동일
  2. 평일/주말 별도 (토요일, 일요일 구분)
    시작시간 ~ 종료시간을 수정할 수 있음

API 서버 확장성 문제

  • 현재 서버 구성에서는 단일 서버로 구성되어 있어서 트래픽이 늘어났을 때의 대응을 하기 어려움

트래픽을 더 많이 받을 수 있는 구조로 만들기 위해서는 어떤 방법이 있고, 어떤 방법을 적용하는게 가장 좋을지?

api 응답 형식 이슈

  • 현재 api의 응답 형식은 object or list의 json을 그대로 전달하고 있음
  • 부가적인 상태에 대한 정보를 추가적으로 내려주기 어려운 구조 (ex. paging information 등..)
  • api의 성공과 실패의 경우 http status code를 보더라도 구조가 다르기 때문에 client에서 실수할 여지가 많을 것 같음

위와 같은 문제를 어떻게 해결 해볼 수 있을까요?

가게: 가게 상태 변경

가게 상태 변경

  • 상태정보 (영업/노출정지) 변경
  • 노출 정지는 아예 가게목록에 노출시키지 않는 상태
  • 오늘이 휴무일에 해당 또는 영업일시중지 하면 가게 상태준비중 으로 설정

배달가능지역 등록 기능

가게의 배달가능지역을 업데이트하는 API

  • [ 도/시군구/읍면동] 엔티티인 CityToDong 과 가게 사이에 배달가능지역을 저장하는 중간테이블을 사용할 예정

회원 탈퇴 구현

  • Filter에서 입력 비밀번호 암호화 처리
  • 비밀번호 일치여부 확인
  • 일치하면 Repository 에서 User 삭제

가게: 가게 등록

  • 가게정보

  • 배달정보

  • 사업자 정보 (대표자명, 상호명, 사업자주소, 사업자번호, 종사업장번호)

application.yml 설정, + h2

  • db관련 설정에 placeholder 사용 (시스템 환경변수에 변수등록하면 됌)
  • api 테스트시 h2 인메모리 db 사용하도록 설정

주소를 다루는 방법이 필요함

  • 가게를 조회하려면 고객과 가게들의 배달가능지역을 비교해야함
  • 그런데 주소를 String 타입으로 비교하기는 무리일듯
    • 다른 도시에 이름이 같은 동, 구가 있을수도 있음

가게: 추가 배달팁 설정

  • 지역별(배달가능지역 내에서)
  • 시간대별 (+요일)
  • 법정공휴일 (일요일은 해당안됌)
  • 최대 10000원

회원가입 구현

  • 입력값 유효성 검증
  • 중복 email 확인
  • DB에 입력값 저장
  • 비밀번호 암호화 -> 적용은 아직

다른 API에서도 로그인이 유효한지 확인하는 기능 구현

로그인 상태 유효성을 확인할 수 있는 방법은 Servlet Filter, Interceptor, AOP 가 있다.
로그인 상태 확인이 필요한 기능은

  • 주문하기
  • 회원정보수정, 탈퇴 등 회원관리
  • 찜(즐겨찾기)
    정도로 한정적이므로 Servlet Filter는 적절하지 않아보임

Interceptor는 등록할 때 http method와 url을 같이 지정할 수 없어서
AOP로 구현

카테고리 관리 리팩토링

현재 구조

  • 현재 카테고리를 ENUM 으로 정의하고, 업데이트 요청이 오면 DB에 업데이트 하고 있음
    • 카테고리를 조회하면 DB 정보를 가져오고 그걸 다시 ENUM으로 변경하는 구조'

문제

  • ENUM을 사용했을 때 단점, DB를 사용할 때 단점을 모두 가지고 있음
    • ENUM -> 카테고리가 변경될때마다 컴파일, 재배포 과정이 필요함
    • DB -> 카테고리 정보가 필요할때마다 DB 에 쿼리를 보내야 함. (부하)

해결 방안

  • ENUM vs DB에 저장 중 하나를 선택해야 하는데
  • 카테고리의 변경이 자주 일어날 수 있다는 가정하에 DB에 저장하기로
    • 매번 쿼리를 날리는건 비효율적이니 캐시를 사용

캐시

  • 변수 등으로 저장, 스프링 캐시, 레디스 등등 여러 방법 비교해보고 결정

가게: 음식 카테고리 관리

  • 카테고리 조회 api
  • 가게 카테고리 추가 api
  • 가게 카테고리 삭제 api
  • 카테고리별 가게 목록 조회 api

가게당 여러개의 카테고리를 가질 수 있음(최대 4개)
카테고리별 가게 목록을 보여주어야 함

가게: 휴무일 관리

휴일 종류

정기휴무 (최대 15개 설정가능)

  • 매월 n번째 주 O요일
  • 매주 O요일

임시휴무일 (여러개 설정가능)

  • yyyy년 MM월 dd일 ~ yyyy년 MM월 dd일로 기간 지정가능

법정공휴일

  • 일요일은 법정공휴일 휴무에서 제외함

필요한 기능

  • 특정 날짜가 휴일인지 확인

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.