Giter VIP home page Giter VIP logo

make-delivery's Introduction

make-delivery 서버 구조도

real

프로젝트 목표

  • 배달의 민족 같은 배달 앱 서비스를 구현해 내는 것이 목표입니다.
  • 단순한 기능 구현뿐 아니라 대용량 트래픽 처리까지 고려한 기능을 구현하는 것이 목표입니다.
  • 객체지향 원리와 여러 이론적 토대위에서 올바른 코드를 작성하는 것이 목표입니다.
  • 문서화, 단위테스트는 높은 우선순위를 두어 작성했고 CI/CD를 통한 자동화 또한 구현하여 쉽게 협업이 가능한 프로젝트로 만들었습니다.

기술적 issue 해결 과정

프로젝트 중점사항

  • 버전관리
  • 문서화
  • Service Layer를 고립시켜 의존적이지 않은 단위테스트 작성
  • 서버의 확장성
  • 로그인을 했는지 확인하는 부가기능이 반복되어 AOP로 분리
  • 로그인 서비스 추상화
  • Redis Cache를 이용해 음식점 조회 기능 구현
  • 스프링의 @Transactional 이용하여 주문과 결제 로직 구현
  • Redis Transaction을 이용하여 장바구니 데이터의 atomic을 보장하도록 관리
  • Rollback Hook을 사용하여 주문,결제 오류 시 장바구니 복원
  • Redis Pipeline을 이용하여 한번에 많은 데이터 추가 시 네트워크 병목 개선
  • Mysql에서 인덱스 설정과 실행계획 분석 후 쿼리 튜닝
  • 같은 주문에 2명이상의 라이더가 동시에 배달하는 문제를 Redis Transaction을 이용하여 해결
  • Redis Scan을 이용해 라이더가 주문 목록을 조회하는 기능 구현
  • 새로운 스레드풀을 만들고 @Async를 이용하여 비동기 푸쉬 알람 서비스 구현
  • Jenkins를 사용하여 CI/CD 환경 구축
  • Docker를 이용하여 CD 구현
  • Vault 서버를 띄워 암호, 설정값 관리
  • Mysql Replication – AOP를 이용하여 Master/Slave로 데이터베이스 이중화
  • Nginx의 Reversed-Proxy를 이용하여 로드밸런싱
  • Nginx의 Micro caching을 이용해 요청 처리
  • Ngrinder를 이용하여 성능 테스트
  • VisualVM을 이용해 WAS서버 CPU사용량과 스레드, 힙 모니터링

라이더 배차 과정 구조도

rider

DB ERD

스크린샷 2020-10-12 22 05 51

Use Case

https://github.com/f-lab-edu/make-delivery/wiki/Use-Case

Front

https://github.com/f-lab-edu/make-delivery/wiki/%ED%99%94%EB%A9%B4-%EC%84%A4%EA%B3%84

make-delivery's People

Contributors

tjdrnr0557 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

make-delivery's Issues

주문 조회 로직

사용자 id로 조회 하므로 user가 사장님이든 고객이든 모두 조회 가능. session에서 user id를 받아올 것임.

결제 생성 조회 로직 구현

주문,결제를 하기 위해 장바구니를 조회하고 주문결제를 한트랜잭션에서 진행할 시 , 그 사이 다른 스레드들이 장바구니에 추가하거나 삭제하는 경우가 생길 수 있습니다. 이러한 현상은 장바구니의 불일치 문제를 일으키기 때문에 장바구니를 atomic하게 관리해야합니다. 따라서 주문,결제 트랜잭션안에서 장바구니를 조회하자마자 장바구니를 삭제하고 만약 주문 결제 트랜잭션이 커밋되지 않고 오류가 나 실패한다면 롤백이 되면서 장바구니에 원래 카트리스트를 바로 다시 복구시키는 방식으로 atomic을 보장하였습니다.

OrderService 리팩토링

  • 단일 책임 원칙
  • 개방 폐쇄 원칙
    이 두가지가 완벽하게 지켜지지 않는 것 같아 코드 리팩토링을 진행합니다.

MyBatis 연동

  • SqlSessionFactoryBuilder

는 개발자들을 위한 ,단순히 가독성을 좋은 소스코드를 작성하기위한

객체이다.

이 객체는 서버를 최초 1회 실행시에 SqlSessionFactory를 생성하는데 한번 쓰이고

사라지는 객체이다.

  • SqlSession

SqlSession이란 RDB에 인증을 거친 논리적인 연결 상태를 말하는 것이다

한번의 db 요청하려면 SqlSession를 사용해야한다.

Session이란 인스턴스안에 있는 논리적인 실체로 현재 유저의 로그인 상태를 말한다.

하나의 SqlSession을 만들기 위해서는 jdbc프로그래밍에서 필요한것처럼 기본적으로

  1. Url

  2. Id

  3. password

3개의 정보가 필요하고 그 이외에도 Mybatis에서는 캐싱정책의 사용유무, 지연 로딩 등등 많은 설정 정보들이 존재한다.

이러한 정보들을 SqlSession을 생성할때마다 전부 다시 정의하는 것은 매우 힘들다.

그렇기 때문에 이러한 설정값들을 한곳에 모아놓고 그 모아놓은 곳에서 객체를 가져오는 것이 효율적인데

이것이 SqlSessionFactory 이다.

SqlSessionFactory를 만들기위해서는 엄청 많은 정보들을 넣어줘야하는데 (id url AliasesPackage.....) 이 값들을 인스턴스를

사용해서 new SqlSessionFactory() 이렇게 만드는 거는 올바르지 않을 수 있다.

왜냐면 생성자 인자가 많은 경우에는 Constructor 방식은 가독성이 매우 떨어진다

그렇기에 이런경우에는 디자인패턴중에서 BuilderPattern을 사용하는데

이것이 SqlSessionFactoryBuilder이다.

출처: https://kimsoungryoul.tistory.com/43

라이더 매칭 서비스 구현

라이더 정보는 자주 바뀌는 정보이고 이것을 매번 RDB에 접근하면 시간이 오래 걸리기 때문에 레디스에 저장하였습니다.

레디스에서 관리하는 정보
레디스 키 example

  • 경기도 고양시 일산동:STANDBY_RIDERS
    라이더가 출근신청을 하면 라이더의지역별로 출근한 라이더들의 아이디를 해쉬키로 토큰값을 해쉬밸류로 저장합니다. 라이더가 배달을 시작하면 토큰값을 삭제하고 배달을 완료할 시 토큰값을 다시 추가합니다.

  • 경기도 고양시 일산동:STANDBY_ORDERS
    사장님이 주문을 승인하면 그 주문목록은 같은지역 별로 배차 대기 주문목록에 들어갑니다. 라이더들은 이 대기 주문목록을 보거나 푸쉬알람을 받아서 배차를 신청합니다.


Use Case

  • 사장님

가게에서 사장님이 주문을 승인하면 그 주문은 그 지역(동)의 배차를 기다리는 레디스에 지역별 주문목록(Standby_Order)에 들어갑니다.

  • 라이더

사장님이 주문을 승인하면 같은지역에 출근해있고 배달중이 아닌 라이더들은 푸쉬알람을 받습니다.

같은지역(동)에 있는 라이더들은 같은지역(동)의 배차를 기다리는 주문목록 중 한개를 선택하여 배차를 신청할 수 있습니다. (배달중에도 신청가능)

  • 푸쉬알람

사장님이 주문을 승인하면 오늘 출근신청을 했고 지금 배달중이 아닌 같은지역의 라이더들에게 푸쉬 알람을 보냅니다.

라이더가 배차신청을 해 1건이라도 배달을 하면 라이더 토큰을 지우므로 더이상 푸쉬알람을 받지 않고 배달 완료시 푸쉬알람을 다시 받습니다.

  • FCM토큰

라이더가 오늘 출근 신청을하면 FCM토큰을 보내어 레디스에 지역별로 라이더 토큰을 저장합니다.

라이더가 배차신청을 하면 레디스에 지역별로 저장된 라이더 토큰은 지워집니다. (배달중이 아닌 라이더들에게만 푸쉬알람을 보냅니다.)

라이더가 배달을 완료하면 다시 레디스에 라이더의 지역에 라이더 토큰을 저장합니다.

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.