Skip to content

가게 테크 스펙

지찬우 edited this page Aug 11, 2024 · 2 revisions

가게 도메인 테크 스펙 - V1

작성자: 지찬우

조직: 우아한테크캠프 7기 4팀

마지막 수정일: 2024.08.09

요약 (Summary)

테크 스펙을 세 줄 내외로 정리 누가/무엇을/언제/어디서/왜를 간략하면서 명확하게 작성

가게 정보를 등록(생성)•수정•삭제할 수 있는 API를 개발합니다.

배경 (Background)

프로젝트의 Context를 작성 왜 이 기능을 만드는지, 동기는 무엇인지, 어떤 사용자 문제를 해결하려 하는지, 이전에 이런 시도가 있었는지, 있었다면 해결이 되었는지 등을 포함

사용자는(가게 사장님) 자신이 운영하는 가게를 입점(등록)합니다. 이렇게 등록된 가게는 사용자(손님)에게 제공됩니다. 사용자(가게 사장님)는 자신이 운영하는 가게의 정보를 수정할 수 있으며, 삭제도 가능합니다.

목표 (Goals)

예상 결과들을 Bullet Point 형태로 나열 이 목표들과 측정 가능한 임팩트들을 이용해 추후 이 프로젝트의 성공 여부를 평가

  • 새로운 가게 정보를 등록할 수 있습니다.
  • 등록한 가게 정보를 수정할 수 있습니다.
  • 등록한 가게를 삭제할 수 있습니다.

목표가 아닌 것 (Non-goals)

프로젝트에 연관되어 있으나 의도적으로 하지 않거나 해결하지 않으려 하는 것 Bullet Point 형태로 읽기 쉽게 적어 독자가 직관적으로 이해할 수 있도록 작성

  • 가게를 조회하는 API 개발
  • 정확한 실시간 배달팁과 배달 예상 시간 정보
  • 가게 통계 정보(주문 수량

계획 (Plan)

테크 스펙에서 가장 긴 파트 준비한 모든 리서치, 준비 내용들을 여기에 작성 어떻게 기술적, 엔지니어링적으로 접근할지 상세히 묘사 어떻게 할지 확실히 결정하지 못한 상태라면 어떤 것들을 고려하고 있는지 목록화해서 작성 리뷰어들이 올바른 결정을 내리도록 도움 그림이나 다이어그램을 포함하기 좋은 지점

가게 도메인에 필요한 DB 테이블 DDL

  • business

    CREATE TABLE IF NOT EXISTS `business`
    (
        `id`                  BIGINT AUTO_INCREMENT PRIMARY KEY,
        `representative_name` VARCHAR(255) NOT NULL,
        `business_name`       VARCHAR(255) NOT NULL,
        `business_address`    VARCHAR(255) NOT NULL,
        `registration_number` VARCHAR(255) NOT NULL,
        `uuid`                BINARY(16)   NOT NULL,
        `created_at`          TIMESTAMP,
        `updated_at`          TIMESTAMP
    );
  • restaurant

    CREATE TABLE IF NOT EXISTS `restaurant`
    (
        `id`                   BIGINT AUTO_INCREMENT PRIMARY KEY,
        `name`                 VARCHAR(255)    NOT NULL,
        `phone`                VARCHAR(255)    NOT NULL,
        `address`              VARCHAR(255)    NOT NULL,
        `location`             POINT SRID 4326 NOT NULL,
        `introduction`         TEXT            NOT NULL,
        `image`                VARCHAR(1000),
        `operating_time`       VARCHAR(255)    NOT NULL,
        `closed_days`          VARCHAR(255)    NOT NULL,
        `minimum_order_amount` INT             NOT NULL,
        `business_id`          BIGINT,
        `uuid`                 BINARY(16)      NOT NULL,
        `created_at`           TIMESTAMP,
        `updated_at`           TIMESTAMP
    );
  • delivery_fee

    CREATE TABLE IF NOT EXISTS `delivery_fee`
    (
        `id`                     BIGINT AUTO_INCREMENT PRIMARY KEY,
        `order_amount_threshold` INT        NOT NULL,
        `fee`                    INT        NOT NULL,
        `restaurant_id`          BIGINT     NOT NULL,
        `created_at`             TIMESTAMP,
        `updated_at`             TIMESTAMP
    );

모든 테이블의 PK는 MySQL의 auto increment를 활용하며, 외부에 노출되는 식별값은 UUID v4를 사용합니다.

코드 작성

mono 모듈의 woowa.team4.bff.restaurant 패키지 하위에 코드를 작성합니다. business layer에서는 persistent layer에 대한 의존을 최소화하며 추상화된 객체에 의존합니다.

공간 데이터 타입

MySQL의 POINT(SRID 4326) 타입을 사용해 가게의 위치 정보를 저장합니다. Spring Data JPA 의존성에 포함되는 JPA 구현체 Hibernate에서 POINT 타입을 지원할 수 있도록 아래의 의존성을 추가했습니다. org.hibernate.orm:hibernate-spatial

UUID 필드

외부에 노출되는 id 값으로 UUID를 사용합니다. UUID를 문자열로 저장하면 많은 공간을 차지하기 때문에 BINARY(16) 타입으로 설정했습니다.

이외 고려사항들 (Other Considerations)

고려했었으나 하지 않기로 결정된 사항들 전에 논의되었던 주제가 다시 나오지 않도록 할 수 있고, 이미 논의되었던 내용이더라도 리뷰어들이 다시 살펴보기 가능

현재 팀에게 주어진 프로젝트 기간과 비용을, 프로젝트 진행의 목적을 고려하여 시간과 위치, 지역, 배달방식에 따라 배달팁을 결정하는 부분은 구현하지 않기로 했습니다. 대신 사장님이 설정한 가격대별 배달팁만 적용하여 구현할 예정입니다.

마일스톤 (Milestones)

테크 스펙의 내용을 바탕으로 추정한 마일스톤을 공유 실험 계획, 배포 날짜를 포함해 최대한 자세히 작성

~ 8/10: 스키마 설계, 가게 등록 API 구현

8/11: 가게 수정•삭제 API 구현

8/12: 코드 프리즈(개별적으로 구현한 가게, 메뉴, 리뷰, 검색 도메인 통합하기)

질문들 (Open Questions)

묻고 싶은 설계, 구현 질문들, 피드백을 받고 싶은 질문들을 작성