시작하기 전에 다음이 설치되어 있는지 확인하세요:
추가로 nvm 를 설치해주면 편리함. (search by google)
-
저장소 클론
git clone git@github.com:lemoncloud-io/capstone25-t7-aim.git cd capstone25-t7-aim -
의존성 설치
node --version # v22.15.1 npm ci -
Docker 시작
MongoDB와 LocalStack 등의 필요한 서비스를 Docker로 실행:
docker-compose up -d
서비스 중지:
docker-compose down
-
환경 변수 설정
각 애플리케이션에
.env파일을 생성해야 합니다:Backend 환경 변수:
cp apps/backend/.env.example apps/backend/.env
Frontend 환경 변수:
cp apps/frontend/.env.example apps/frontend/.env
필요에 따라 생성된
.env파일의 값을 수정하세요. -
개발 서버 시작
npm start
- 프론트엔드: http://localhost:5173
- 백엔드 API: http://localhost:4000
또는 개별 시작:
# 프론트엔드만 npm run frontend # 백엔드만 npm run backend
-
프로덕션 빌드 및 실행
프로덕션 환경에서 실행하려면 먼저 빌드를 수행해야 합니다:
# 전체 빌드 npm run build또는 개별 빌드:
# 백엔드 빌드 npm run build:backend # 프론트엔드 빌드 npm run build:frontend
프로덕션 모드 시작:
# 프로덕션 빌드 후 시작 (빌드 + 시작) npm run start:prod # 또는 개별 시작 npm run start:prod:backend # 백엔드 프로덕션 npm run start:prod:frontend # 프론트엔드 프리뷰
capstone25-t7-aim/
├── apps/
│ ├── frontend/ # React + Vite 애플리케이션
│ │ ├── public/
│ │ │ └── aim_logo.svg # 브랜드 자산
│ │ ├── src/
│ │ │ ├── apis/ # API 호출 모듈 (통합)
│ │ │ ├── components/ # 재사용 가능한 UI 컴포넌트
│ │ │ ├── pages/ # 페이지 컴포넌트
│ │ │ ├── utils/ # 프론트 전용 유틸
│ │ │ ├── App.tsx
│ │ │ ├── main.tsx
│ │ │ ├── index.css
│ │ │ └── vite-env.d.ts
│ │ ├── package.json
│ │ ├── vite.config.ts
│ │ ├── tsconfig.json
│ │ ├── tsconfig.build.json
│ │ ├── tailwind.config.js
│ │ ├── postcss.config.js
│ │ └── jest.config.ts
│ │
│ └── backend/ # Express API 서버
│ ├── src/
│ │ ├── apis/ # API 라우트 (정리/통합)
│ │ ├── models/ # Mongoose 모델
│ │ ├── services/ # 비즈니스 로직/작업자
│ │ ├── repositories/ # 데이터 접근 계층
│ │ ├── lib/ # 공용 라이브러리 (예: S3 client 등)
│ │ ├── utils/ # 백엔드 유틸
│ │ ├── app.ts # Express 앱 설정
│ │ └── server.ts # 서버 진입점
│ ├── package.json
│ ├── tsconfig.json
│ ├── jest.config.ts
│ ├── nodemon.json
│ └── .env.example
│
├── packages/
│ └── shared/ # 공유 타입과 유틸리티
│ ├── src/
│ │ ├── index.ts # 메인 익스포트
│ │ ├── types.ts # 공유 TypeScript 타입
│ │ └── utils.ts # 공유 유틸리티 함수
│ ├── package.json
│ ├── tsconfig.json
│ └── jest.config.json
│
├── apps/
│ └── aim-hello-api/ # AIM 분석 API (Gemini 연계)
│ ├── data/ # 프롬프트 자산 (json/yml)
│ │ ├── system-prompt.json
│ │ ├── system-prompt.yml
│ │ ├── user-prompt.yml
│ │ └── user-prompt-00.yml
│ ├── src/
│ │ ├── api/
│ │ ├── service/
│ │ │ ├── gemini-service.ts
│ │ │ └── types.ts
│ │ ├── utils.ts
│ │ ├── engine.ts
│ │ ├── express.ts
│ │ └── index.ts
│ ├── handler.js
│ ├── jest.config.json
│ ├── package.json
│ ├── tsconfig.json
│ └── env/
│
├── sample/ # 샘플 파일들
├── tmp/ # 임시 파일들
├── volume/ # Docker 볼륨
│ ├── cache/
│ ├── lib/
│ └── logs/
│
├── docker-compose.yml # Docker Compose 설정
├── package.json # 루트 워크스페이스 설정
├── LICENSE
├── README.md
└── GEMINI.md # Gemini 관련 문서
-
apps/frontend— Vite 기반 React 앱src/apis프론트 API 호출 모듈 통합src/components,src/pages,src/utilspublic/aim_logo.svg브랜드 자산
-
apps/backend— Express REST APIsrc/apis라우트,src/services비즈니스 로직,src/models데이터 모델src/repositories,src/lib,src/utils로 관심사 분리
-
apps/aim-hello-api— AIM 분석 API (Gemini)data/프롬프트 자산: system/user prompt (json/yml)src/service/gemini-service.tsGemini 연계 서비스- ENV로 프롬프트 디렉터리/프로필 선택 가능(아래 참고)
-
packages/shared— 공통 타입/유틸 -
volume/— Docker 영구 저장소 (LocalStack/MongoDB 등)
프론트엔드와 백엔드 모두 시작:
npm start개별 시작:
# 프론트엔드만
npm run frontend
# 백엔드만
npm run backend앱에서 공유 타입과 유틸리티 임포트:
import { ApiResponse } from '@shared/types';
import { createAsyncDelay } from '@shared/utils';모든 워크스페이스 빌드:
npm run build개별 빌드:
# 백엔드 빌드
npm run build:backend
# 프론트엔드 빌드
npm run build:frontend- 프론트엔드:
apps/frontend/dist/- 배포 준비된 정적 파일 - 백엔드:
apps/backend/dist/- 컴파일된 JavaScript 파일
프로덕션 서버 시작:
npm run start:prod또는 개별 실행:
# 백엔드 프로덕션
npm run start:prod:backend
# 프론트엔드 프리뷰
npm run start:prod:frontendaim-hello-api 기준 모노레포 구성 설정
- 모듈(필수) 설치:
npm i --save lemon-core -w aim-hello-api - 모듈(개발) 설치:
npm i --save-dev lemon-devkit -w aim-hello-api ttypescript@1.5.15 nodemon@2.0.20 typescript@4.7.4 ts-transformer-keys@0.4.3 ts-node@8.1.0 @types/node@17.0.42 @types/supertest@2.0.10 jest@27.5.1 ts-jest@27.1.5 ts-node@8.1.0 superagent@5.3.1 supertest@4.0.2 tsconfig-paths@4.1.2 - 모듈 빌드:
npm run build -w aim-hello-api - 모듈 실행(로컬):
npm run start -w aim-hello-api
- API 로컬 실행후
http :8000호출시 아래와 같은 결과 얻음 (httpie 도구 설치 필요)
❯ http :8000/
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 123
Content-Type: text/html; charset=utf-8
aim-hello-api/0.25.1010
lemon-core/^4.0.7
modified/2025-10-10 15:30:36
env/ENV= NAME=none STAGE=local
env/REPORT_ERROR_ARN=- 기본 디렉터리:
apps/aim-hello-api/data - 주요 파일:
system-prompt.json|yml,user-prompt.yml,user-prompt-00.yml - 권장 환경 변수:
PROMPT_DIR=apps/aim-hello-api/dataUSER_PROMPT_PROFILE=user-prompt.yml(예:user-prompt-00.yml로 변경 가능)GEMINI_API_KEY=<your-key>
서비스는 json/yml를 자동 인식하도록 구성(로더 적용 PR 기준)되며, 포맷/프로필을 ENV로 전환할 수 있습니다.
npm run test:backend
npm run test:frontend모든 워크스페이스 린팅:
npm run lint자동 수정:
npm run lint:fix코드 포맷팅:
npm run format포맷 검사:
npm run format:check- ESLint:
.eslintrc.json- TypeScript, Prettier 통합 - Prettier:
.prettierrc- 일관된 코드 스타일
- React 18 - UI 라이브러리
- TypeScript - 타입 안정성
- Vite - 빠른 빌드 도구 및 개발 서버
- TailwindCSS - 유틸리티 우선 CSS 프레임워크
- Jest - 테스팅 프레임워크
- Express.js - 웹 프레임워크
- TypeScript - 타입 안정성
- Node.js - 런타임 환경
- Jest - 테스팅 프레임워크
- Nodemon - 개발 자동 재시작
- TypeScript - 공유 타입 및 인터페이스
- 공통 유틸리티 - 재사용 가능한 함수
- npm workspaces - 모노레포 관리
- ESLint - 코드 린팅
- Prettier - 코드 포매팅
- ts-node - TypeScript 실행
- concurrently - 여러 명령어 동시 실행