이번에 새로 진행할 프로젝트는 '음식 주문 관리 플랫폼' 개발이다.

우리팀은 백엔드 개발팀으로서 프로젝트에 참여했다.(라고 상상하며 시작하자)

먼저 기획자가 알려준 개발 요구사항 명세서를 확인해보자. 

더보기
  • 개발 요구사항 명세서 - 배달 및 포장 음식 주문 관리 플랫폼
  • 프로젝트 개요
    • 주제: 배달 및 포장 음식 주문 관리 플랫폼 개발
    • 목표: 광화문 근처에서 운영될 음식점들의 배달 및 포장 주문 관리, 결제, 그리고 주문 내역 관리 기능을 제공하는 플랫폼 개발
  • 운영 지역
    • 지역: 초기에는 광화문 근처로 한정하여 운영하며, 향후 확장을 고려한 지역 분류 시스템 설계 필요
    • 향후 확장성: 지역별 필터링, 지역정보 수정 및 추가 등이 가능 하도록 고려
  • 음식점 분류
    • 카테고리: 다음과 같은 음식점 카테고리로 분류
      • 한식
      • 중식
      • 분식
      • 치킨
      • 피자
    • 향후 확장성: 음식점 카테고리를 추가하거나 수정할 수 있도록 유연한 데이터 구조 설계 필요
  • 결제 시스템
    • 결제 방식: 카드 결제만 가능
    • PG사 연동: PG사와의 결제 연동은 외주 개발로 진행하며, 결제 관련 내역만 플랫폼의 데이터베이스에 저장
    • 결제 테이블: 결제 내역을 저장하기 위한 전용 테이블 설계
  • 주문 관리
    • 주문 취소: 주문 생성 후 5분 이내에만 취소 가능하도록 제한
    • 주문 유형: 온라인 주문과 대면 주문(가게에서 직접 주문) 모두 지원
    • 대면 주문 처리: 가게 사장님이 직접 대면 주문을 접수
  • 데이터 보존 및 삭제 처리
    • 데이터 보존: 모든 데이터는 완전 삭제되지 않고 숨김 처리로 관리
    • 상품 숨김: 개별 상품도 숨김 처리 가능하도록 구현(숨김과 삭제는 다른 필드에서 동작해야함)
    • 데이터 감사 로그: 모든 정보에 생성일, 생성 아이디, 수정일, 수정 아이디, 삭제일, 삭제 아이디를 포함
  • 접근 권한 관리
    • 고객: 자신의 주문 내역만 조회 가능
    • 가게 주인: 자신의 가게 주문 내역, 가게 정보, 주문 처리 및 메뉴 수정 가능
    • 관리자: 모든 가게 및 주문에 대한 전체 권한 보유
  • 배송지 정보
    • 필수 입력 사항: 주소지, 요청 사항
    • ‘주문’ 과 ‘배달’ 에 모두 관련된 정보 입니다!
  • AI API 연동
    • 상품 설명 자동 생성: AI API를 연동하여 가게 사장님이 상품 설명을 쉽게 작성할 수 있도록 지원
    • AI 요청 기록: AI API 요청 질문과 대답은 모두 데이터베이스에 저장
  • 주문 확인 방식(프론트 앤드 개발자 담당)
    • 프론트엔드 폴링: 프론트엔드에서 주기적으로 주문 확인을 위해 주문 API를 호출하는 폴링 방식 사용
  • 개발 및 인프라 확장
    • 개발 속도: 빠른 개발을 통해 프로토타입을 신속히 확인
    • 인프라 확장: 시스템 설계는 간결하게 유지하되, 향후 인프라 확장을 고려
  • 기술 스택
    • 프론트엔드: React.js 또는 Vue.js (권장) 및 REST API 통신
      • ⇒ 프론트 앤드 개발자가 개발 할 것!
    • 백엔드: Spring Boot 3.x
    • 데이터베이스: PostgreSQL
    • 빌드 툴: Gradle
    • 버전 관리: Git을 이용한 버전 관리 (GitHub, GitLab, Bitbucket 등)
    • API 문서: 제시된 작성 툴이나 양식에 맞추어 작성
      • 프론트 엔드 개발자가 API문서만 보고도 개발 할 수 있게 작성할 것!
  • 프로젝트 구조
    • Monolithic Application
      • 해당 프로젝트는 기본적으로 모놀리틱으로 개발하며, 다음 프로젝트부터 MSA로 개발 예정
    • Layered Architecture: Controller, Service, Repository 계층으로 구성된 클린 아키텍처 권장
    • Entity 및 DTO: 각 기능별로 Entity와 DTO(Data Transfer Object)를 분리하여 관리
    • API 설계: RESTful API 원칙에 따라 설계
    • Exception Handling: 글로벌 예외 처리 (ExceptionHandler 사용)
  • 데이터베이스 설계
    • 테이블 명명 규칙: 모든 테이블에 p_ 접두사 사용
    • UUID 사용: 모든 주요 엔티티의 식별자는 UUID를 사용 (유저는 예외)
    • Audit 필드: 모든 테이블에 created_at, created_by, updated_at, updated_by, deleted_at, deleted_by 필드를 추가하여 데이터 감사 로그 기록
    • ERD 설계: 엔티티 간의 관계를 명확히 하는 ERD(Entity-Relationship Diagram) 작성
  • 보안
    • JWT 인증: Spring Security와 JWT(Json Web Token)를 이용한 인증 및 권한 관리
    • 권한 확인 : CUSTOMER 이상의 권한은 요청마다 저장되어 있는 권한 값과 동일한지 체크필요
    • 비밀번호 암호화: BCrypt 해시 알고리즘을 사용한 비밀번호 암호화
    • 데이터 유효성 검사: 서버 측 데이터 유효성 검사를 위해 Spring Validator 사용
  • 테스트
    • 테스트: Spring Boot Test를 사용한 테스트
    • Spring Boot Test 을 반드시 사용할 필요는 없으나, 적절한 테스트 방법을 선정하여 진행
  • AI API 연동
    • AI API 호출: AI 서비스(API)와의 연동을 위한 REST API 호출 로직 구현
    • AI 응답 데이터 저장: AI API 호출 시 요청 및 응답 데이터를 DB에 저장
  • 요구사항을 확인해보고 필수기능을 먼저 만들기위해 대략적인 API 명세서, 테이블 명세서, ERD 명세서, 인프라 설계서를 만들어봐야 할 것 같다. 요구사항이 어느정도 나와있어서 ERD 설계를 먼저 해보기로 했다. 

ERD 설계서

'

그리고 위의 ERD 설계서를 보고 API 명세서를 작성해보았다.

API 명세는 최대한 RESTful API 원칙에 따라 작성해 프론트 엔드 개발자가 API 문서만 보고도 개발 할 수 있게 작성을 해보았다. 일부 Search 기능에는 페이지네이션기능을 추가해주었다. 각 엔티티 별로 필요한만한 API들을 만들었다.

 

API 명세서

더보기

 

 

 

그리고 다음은 ERD 명세서와 API 명세서를 바탕으로 테이블 명세서를 작성해 주었다.

테이블 명세서는 요구사항에 맞게 각 테이블명의 시작은 p_table로 시작한다. 그리고 유저 ID는 최소 4자 ~ 10자. 다른 테이블의 id는 UUID로 정의했다. 모든 테이블은 데이터 감사 로그를 기록해야하므로 created_at, created_by, updated_at, updated_by, deleted_at, deleted_by 필드를 추가했다.

 

테이블 명세서

마지막으로 인프라 설계서를 작성해주었다. 최대한 간단하게 표현하기 위해 프론트, Docker 등을 제외하고 백엔드 관점에서의 시스템 아키텍처만 작성해주었다.

 

인프라 설계서

+ Recent posts