아키텍처

헥사고날 구조와 백엔드 컨텍스트

구성도

[고객 앱 www]   [창구 화면 teller]   [대기 화면 display]
      \               |                  /
       \              |                 /     (Next.js 세 앱, REST 호출)
        +------ FastAPI 백엔드 jb ------+
                /api/v1/{branch, chat, queue, reservation, corporate}
                       |
        컨텍스트별 domain <- app <- adapter (+ dependencies 조립)
                       |
        core: LLM(Gemini → Groq → Mock) · 계좌/고객 Mock · shared_kernel

(근거: jb/main.py, jb/core/di.py, 각 앱의 package.json·src/lib/api.ts)

헥사고날 레이어

백엔드는 헥사고날(Ports & Adapters) 구조이고, 의존은 항상 바깥에서 안쪽으로만 향합니다. (근거: jb/ARCHITECTURE.md)

레이어 위치 책임 import 가능 대상
domain apps/<컨텍스트>/domain/ 엔티티, 값 객체, 이벤트, 도메인 서비스 shared_kernel 만
app apps/<컨텍스트>/app/ 유스케이스, 입출력 포트, DTO domain, core.ports, shared_kernel
adapter apps/<컨텍스트>/adapter/ FastAPI 라우터, 스키마, Mock·외부 연동 구현 app, domain
dependencies apps/<컨텍스트>/dependencies/ 의존성 조립(조립 루트) 모두
core core/ 공용 포트와 LLM·계좌·고객 어댑터 shared_kernel
shared_kernel shared_kernel/ 공용 값 객체(금액, 사용자 ID, 창구 종류) 없음

백엔드 컨텍스트 5개

컨텍스트 하는 일 대표 엔드포인트 근거
branch 가까운 지점 조회(거리순) POST /branch/nearby jb/apps/branch
chat AI 대화, 직원용 요약 카드 전달·조회 POST /chat/message, POST /chat/handoff, GET /chat/handoffs chat_router.py
queue 창구 대기열, 도착 인증, 호출, 만료 GET /queue/entries, POST …/arrive, POST …/call queue_router.py
reservation 번호표 발급·조회·취소 POST·GET /reservation/tickets reservation_router.py
corporate 법인 사무 필요 서류·비용·발급 기관 안내 POST /corporate/guidance corporate_router.py

모든 라우터는 /api/v1 아래에 등록됩니다. (근거: jb/main.py)

Mock 으로 데모하고 실구현으로 교체

jb/ARCHITECTURE.md 는 「데모 단계는 Mock 어댑터로 동작하며, 운영 전환 시 Mock 만 실구현으로 교체한다」고 설명합니다. 코드에서 확인되는 사례는 다음과 같습니다.

  • LLM: Gemini → Groq → Mock 순서로 시도하고, 키가 없으면 다음 순위로 넘어갑니다. (근거: jb/core/di.py)
  • 지점 검색: Naver → Mock 순서로 시도하고, 키가 없거나 호출이 실패하면 Mock 데이터를 씁니다. (근거: branch_provider.py)
  • 계좌와 고객 정보: Mock 구현(MockAccountQuery, MockCustomerDirectory). (근거: jb/core/di.py)
  • 예약·대기열 저장: 메모리 저장소(InMemory…Repository). 데이터베이스는 연결하지 않았습니다. (근거: 커밋 4d9903c, 01693b9)

레이어 규칙을 도구로 강제

setup.cfg 의 import-linter 계약이 adapter > app > domain 방향과 shared_kernel 의 독립성을 검사합니다. 실행은 .venv/bin/lint-imports 입니다. (근거: setup.cfg, jb/ARCHITECTURE.md)

테스트는 jb/tests 에 도메인과 유스케이스 단위로 있습니다. 대기열 상태 전이, 창구 종류, 예약 취소, 법인 안내, 고객 디렉터리를 다룹니다. (근거: jb/tests/ 파일 목록)

알아 둘 점

jb/ARCHITECTURE.md 는 첫 커밋 시점의 문서입니다. 6개 컨텍스트(savings, reservation, phishing, briefing, branch, report)를 설명하지만, 이후 커밋 9215dfb 에서 savings·phishing·briefing·report 가 삭제되고 queue·corporate 가 추가되었습니다. 이 페이지는 최종 코드를 기준으로 썼습니다.