스마트 오더 (간편 주문) 시스템
카페를 자주가는 고객으로서 가장 많이 사용하는 서비스는 ‘스타벅스 사이렌 오더’와 같은 스마트 오더 서비스입니다. 이 외에도 일상에서 다양한 스마트 오더 서비스를 통해 쉽고 빠르게 주문을 할 수 있습니다. 이러한 경험을 바탕으로 고객의 입장은 물론 점주 입장에서도 이용하는 데에 편리한 서비스를 고안해 보고자 프로젝트 기획을 하게 되었습니다.
- 대량의 데이터를 자주 조회할 때 캐시를 통해 응답 속도를 향상시킬 수 있는 방법과, 시스템 대용량의 일괄 처리를 할 때 Spring Batch를 통해 운영이 간편하고 수동으로 처리하지 않는 방법을 학습해 보려 합니다.
- 결제 프로세스가 있는 서비스에서 어떻게 테이블 구성하면 좋을지 생각하고, 실제 결제를 구현해 보려 합니다.
- Spring boot 2.7.6 (JDK1.8)
- Spring Security
- JSON Web Token
- Spring Batch
- MariaDB
- Redis
- JPA
- MyBatis
- Gradle
- Junit5
- Mockito
- 회원가입
- 로그인
- 이메일 인증
- 카테고리 관리
- 카테고리 등록, 조회, 수정, 삭제
- 메뉴 관리
- 메뉴 등록, 조회, 수정, 삭제
- 회원 관리
- 회원 조회
- 회원 권한 변경
- 매장 관리
- 매장 등록, 조회, 수정, 삭제
- 점주 - 매장 영업 관리
- 매장 영업 요일, 시간, 임시 중지 변경
- 점주 - 매장 메뉴 관리
- 매장 메뉴 품절, 숨김 여부 지정
- 매장 조회
- 고객 - 위치
- 현재 위치 등록 및 변경
- 현재 위치 2km 반경 내 가까운 매장 10곳을 조회
- 고객 -장바구니
- 메뉴 담기 및 추가, 수량 변경, 삭제
- 장바구니 메뉴 주문하기
- 점주, 고객 - 주문
- 주문 내역 기간 별 조회
- 주문 취소(결제 후면 결제 취소 진행)
- 점주 - 주문
- 현재 주문 상태 변경
- 결제
- 주문 결제
- 간편 페이
- 간편 페이 충전, 잔액 조회
- 포인트
- 포인트 조회
- 거래
- 간편 페이, 포인트 거래 내역 조회
- Redis를 사용하여 거리 계산과 정렬을 수행하는 부분을 캐싱 처리하여, '2km 반경 내 매장 검색' 기능의 응답 속도를 높이도록 구현
- Spring Batch를 이용하여 대량의 매장 상품 데이터의 품절 여부를 일괄 처리하고 자동화된 스케줄링을 구현
- 처음으로 git rule(commit, PR 등)을 다뤄보다보니 미숙한 부분이 많았고, 모두 적용하지 못한 점이 아쉽습니다.
- if 문이 중첩되는 코드를 리팩토링하지 못한 점이 아쉽습니다.
- 장바구니 메뉴를 삭제할 때, 현재의 구현에서는 cartMenuList의 크기만큼 delete query가 전송됩니다. 이를 deleteAll과 같이 하나의 쿼리로 변경하는 것이 좋을 것 같습니다.
- save 메서드도 리스트 개수만큼 save query가 반복적으로 발생하는데, saveAll 메서드를 사용하면 더 효율적일 것 같습니다.
- pay 메서드의 가독성을 높이기 위해 요청 상태, 잔액 체크, 결제 내역 저장 부분을 분리하는 것이 좋을 것 같습니다. 또는 결제 방법 별로 메서드를 분리하는 것도 좋은 방법일 것 같습니다.
- 포인트와 간편페이(convpay)는 전체적인 흐름이 같지만 수단에 따라 조금씩 차이가 있습니다. 이 경우 추상화하여 공통된 부분은 상속된 클래스에 두고 다른 부분만 하위 클래스에 둔다면 결제 방법 자체를 클래스화하여 구조화할 수 있을 것 같습니다.
