![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|---|---|
| 최은영 @joyy303 |
신경렬 @Batur-s |
박다슬 @Park-DaSeul |
이상욱 @NewL1f3 |
손준영 @proteiin |
이하영 @winnie4869 |
| 기획, 백엔드 | 기획, 백엔드 | 기획, 백엔드 | 기획, 백엔드 | 기획, 백엔드 | 기획, 백엔드 |
- Dear Carmate는 중고차 딜러들의 효율적인 고객 및 차량 관리를 돕는 CRM 서비스입니다.
- 프로젝트 기간 : 2025.09.30 ~ 2025.10.28
- 고객 관리: 신규 고객 등록, 정보 수정, 삭제 및 계약 이력 조회를 할 수 있습니다.
- 차량 관리: 판매 차량 등록, 정보 수정, 삭제 및 상태(보유, 계약 진행, 계약 완료) 변경이 가능합니다.
- 계약 관리: 고객과 차량을 연결하여 계약을 생성하고, 계약 진행 상태(차량 확인, 가격 협의, 계약서 작성 중, 계약 성공, 계약 실패)를 추적합니다.
- 문서 관리: 계약 관련 문서를 업로드 및 다운로드할 수 있으며, 계약서를 업로드하면 고객에게 이메일로 자동 발송됩니다.
- 대시보드: 월별 계약 수, 차량 판매 현황 등 주요 지표를 시각적으로 확인할 수 있습니다.
- 사용자 관리: 관리자(admin)와 일반 사용자(user) 권한을 분리하여 회사별로 사용자를 관리합니다.
- 대용량 업로드: 고객 및 차량 데이터를 CSV 파일로 한 번에 업로드할 수 있어 대량 데이터 등록이 용이합니다.
- Backend: Node.js, Express, TypeScript
- Database: PostgreSQL, Prisma (ORM)
- Authentication: JWT (Access Token, Refresh Token)
- File Handling: Cloudinary, Busboy
- Validation: Zod
- Scheduling: node-cron
- Email: SendGrid
- Environment Variables: dotenv
구현 내용 정리
-
회사 등록 (Create Company)
- 관리자 권한에서만 사용 가능하며, 회사명/회사코드를 입력받아 신규 회사 데이터를 생성합니다.
-
회사 목록 조회 및 검색 Get Companies
- 관리자 권한만 접근 가능
- 검색 조건(회사명/코드) 및 페이지네이션 지원
- 전체 회사목록, 총 개수, 페이지 정보 반환
-
회사별 소속 유저 목록 조회 Get Company Users
- 관리자 권한에서 회사별 직원(유저) 목록 반환
- 이름, 이메일, 사번, 전화번호 등 기본 정보 포함
- 검색/페이지네이션 동시 지원
-
회사 정보 수정 Update Company
- 관리자가 회사명/회사코드 등 정보 수정
- 잘못된 ID나 없는 회사 처리 시 404 오류 메시지 반환
-
회사 삭제 Delete Company
- 관리자가 특정 회사 데이터를 삭제
- 성공 시 메시지, 실패 시 사유/오류 메시지 반환
모든 API는 JWT 인증(Authorization 헤더) 및 관리자권한이 필요 일관된 에러 핸들링을 적용하여 프론트엔드와 연동이 용이하도록 구성
구현 내용 정리
- 계약 관리 CRUD API
- 차량, 고객 정보를 불러와 계약 등록 기능
- 유저의 회사에 등록된 계약의 수정, 삭제 기능(계약 생성자만 가능)
- 계약 거래 상태(차량 확인, 가격 협의, 계약 성공, 계약 실패)에 따른 드래그 앤 드랍 기능을 위한 모든 계약 불러오기
- 고객, 담당자명으로 검색 기능
- 계약 생성과 계약 성공에 따른 차의 상태, 고객의 계약 수 변동 기능
- DB 스키마 설계
- 팀원들과 공동 작업
- 계약 생성을 위한 다른 유저 고객 등 다양한 테이블과의 구조 설계
- 에러의 최소화를 위한 디버깅
- 계약의 상태가 성공, 실패에서 이전 단계로 이동 불가 기능
구현 내용 정리
-
계약서 업로드 API
- 계약서 목록, 상세 조회 기능 구현
- 계약서 업로드, 다운로드 기능 구현
- 계약서 업로드 시 고객 email로 계약서 자동 발송 기능 구현
-
이미지 업로드 API
- 사용자 프로필 이미지 기능 구현
-
미들웨어 작성
- error-handler.ts → 전역 에러 핸들러 작성 및 각 라우터 적용
- async-handler.ts → 비동기 함수의 에러 처리를 위한 래퍼 함수 구현
- cloudinary-upload-middleware.ts → Cloudinary를 통한 이미지 및 문서 업로드/다운로드 기능 구현
- validate-middleware.ts → Zod를 활용한 요청 데이터 유효성 검사 구현
-
lib 함수 작성
- cron-jobs.ts → 업로드된 문서 및 이미지 중 더미 파일을 정기적으로 삭제하는 스케줄러 구현
- email-service.ts → SendGrid 기반의 이메일 발송 서비스 유틸 함수 구현
-
DB 스키마 설계
- 팀원들과 공동 작업
- 계약서 테이블 설계
-
프로젝트 안정화 및 성능 테스트
- k6를 이용한 부하 테스트 진행
- Render 무료 플랜 환경에서 VU 15명 기준, p(95) = 452.74ms, 에러율 0% 결과 확인
-
프로젝트 배포
- 배포용 브랜치 관리 및 배포 자동화 프로세스 구축
- Render(백엔드 및 데이터베이스), Vercel(프론트엔드)로 배포 진행
구현 내용 정리
-차량 생성
-차량 수정 상세 조회
-차량 삭제
-차량 업로드 에러 처리
-대용량 차량 업로드
-대용량 차량 업로드 에러 처리
-간단한 SQL, URL, CSV Injection 공격 방어 능력 테스트
구현 내용 정리
-
고객 관리 API
- 고객 목록 조회(이메일, 이름으로 검색 가능), 고객 단일 조회 구현
- 고객 정보 수정, 고객 삭제, 고객 추가 구현 (고객과 직원이 같은 회사일 때만 가능)
- 파라미터들에 대한 유효성 검사
-
DB 스키마 설계
- 프로젝트 시작 전, 철저한 API 설계를 통한 작업 소요 감소
- 데이터 정규화 및 API 구현, 웹사이트의 목적에 맞는 스키마 설계
-
대시보드 API
- 한달 사이 매출, 매출 증가율, 완료된 계약과 진행중인 계약 수, 차종별 계약 수와 이익을 구현했습니다
- 값들마다 서비스 계층에서 각각 처리하여, 책임을 분리했습니다.
- 웹사이트 설계에 적절하도록 값들을 검토하였습니다.
-
함수를 이용한 추상화
- 프론트엔드에서 온 데이터를 백엔드 데이터에 맞게 변환하는 함수를 적용하여 추상화
- 프론트에서 요구하는 포맷으로 변환하는 포매팅 함수
- 유저와 유저의 회사에 대한 유효성 검사, 인가를 함수로 구현
- 더 읽기 쉽고 유지 보수가 원활한 코드
구현 내용 정리
- Express 기반 RESTful API 서버를 구축하며, Service·Controller·Repository 3계층 구조로 리팩토링하여 유지보수성과 가독성을 향상시키고,
auth-middleware.ts를 통해 JWT 기반 사용자 인증 및 권한 검증 로직을 구현함.
- 회원가입, 로그인, 내 정보 조회·수정·탈퇴 기능을 개발하고,
bcrypt를 통한 비밀번호 암호화 및 검증 로직과 Prisma ORM 기반의 안전한 DB 접근 및 예외 처리를 구현하였으며, 각 API 요청별 HTTP 상태 코드와 오류 메시지를 세분화·표준화함.
- 관리자만 접근 가능한
/users/:id DELETE유저 삭제 API를 개발하고, 삭제 시 기업(Company) 테이블의 인원 수(userCount)를 자동 감소시키는 트랜잭션 로직과userInfo.isAdmin을 통한 관리자 권한 검증 기능을 구현함.
- Prisma ORM을 활용하여
User,Company,Car테이블 간 관계를 설정하고, 회사 인증 시companyName과companyCode매칭 검증 로직을 구현하였으며,$transaction을 통해 데이터 무결성을 보장함.
- Postman을 활용해 API 통신 테스트 및 프론트엔드 팀과의 연동을 확인하고, 공통 JSON 응답 형식을 정의하여 협업 효율성을 높였으며, 회원가입 시 회사 등록 → 유저 등록 → 회사 인원 수 증가로 이어지는 전체 플로우를 완성함.
- 저장소를 클론합니다.
git clone https://github.com/your-repository/nb4-Dear_Carmate-team5.git
- 프로젝트 디렉토리로 이동합니다.
cd nb4-Dear_Carmate-team5 - 의존성을 설치합니다.
npm install
.env.sample 파일을 복사하여 .env 파일을 생성하고, 아래 환경 변수를 설정합니다.
DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE"
# JWT
ACCESS_TOKEN_SECRET="your_access_token_secret"
REFRESH_TOKEN_SECRET="your_refresh_token_secret"
# Cloudinary
CLOUDINARY_CLOUD_NAME="your_cloudinary_cloud_name"
CLOUDINARY_API_KEY="your_cloudinary_api_key"
CLOUDINARY_API_SECRET="your_cloudinary_api_secret"
# SendGrid
SENDGRID_API_KEY="your_sendgrid_api_key"
SENDGRID_SENDER_EMAIL="your_sender_email"
# CORS
CORS_ORIGIN="http://localhost:3000"
# PORT
PORT=3001
Prisma를 사용하여 데이터베이스를 마이그레이션합니다.
npx prisma migrate dev개발 서버를 시작합니다.
npm run devnb4-Dear_Carmate-team5/
├── prisma/
│ ├── schema.prisma
│ └── migrations/
├── src/
│ ├── app.ts
│ ├── lib/
│ ├── middlewares/
│ ├── modules/
│ │ ├── auth/
│ │ ├── cars/
│ │ ├── company/
│ │ ├── contract-documents/
│ │ ├── contracts/
│ │ ├── customers/
│ │ ├── dashboard/
│ │ ├── images/
│ │ └── user/
│ ├── types/
│ └── utils/
├── .env.sample
├── .gitignore
├── package.json
└── tsconfig.json
POST /auth/login: 로그인POST /auth/refresh: Access Token 재발급
POST /users: 신규 직원(사용자) 등록 (관리자용)GET /users/me: 내 정보 조회PATCH /users/me: 내 정보 수정DELETE /users/me: 회원 탈퇴DELETE /users/:userId: 특정 사용자 삭제 (관리자용)
POST /companies: 회사 및 관리자 계정 생성 (회원가입)GET /companies: 회사 목록 조회GET /companies/users: 소속 직원 목록 조회PATCH /companies/:companyId: 회사 정보 수정DELETE /companies/:companyId: 회사 삭제
POST /customers: 신규 고객 추가GET /customers: 고객 목록 조회GET /customers/:customerId: 특정 고객 상세 조회PATCH /customers/:customerId: 고객 정보 수정DELETE /customers/:customerId: 고객 정보 삭제POST /customers/upload: CSV 파일로 고객 대량 등록
POST /cars: 신규 차량 추가GET /cars: 차량 목록 조회GET /cars/models: 차량 모델 목록 조회GET /cars/:carId: 특정 차량 상세 조회PATCH /cars/:carId: 차량 정보 수정DELETE /cars/:carId: 차량 정보 삭제POST /cars/upload: CSV 파일로 차량 대량 등록
POST /contracts: 신규 계약 생성GET /contracts: 계약 목록 조회PATCH /contracts/:id: 계약 정보 수정DELETE /contracts/:id: 계약 삭제GET /contracts/cars: 계약 생성을 위한 차량 정보 조회GET /contracts/customers: 계약 생각을 위한 고객 정보 조회GET /contracts/users: 계약 생성을 위한 직원 정보 조회
POST /contractDocuments/upload: 계약 문서 업로드GET /contractDocuments: 계약 문서 목록 조회GET /contractDocuments/draft: 문서 추가를 위한 계약 목록 조회GET /contractDocuments/:id/download: 계약 문서 다운로드
POST /images/upload: 사용자 프로필 이미지 업로드
GET /dashboard: 대시보드 데이터 조회
- Company: 회사 정보
- User: 사용자(직원) 정보
- Customer: 고객 정보
- Manufacturer: 자동차 제조사
- Model: 자동차 모델
- Car: 차량 정보
- Contract: 계약 정보
- Meeting: 미팅 정보
- ContractDocument: 계약 문서 정보
- Image: 사용자 프로필 이미지 정보
npm run dev: 개발 서버 실행 (ts-node)npm run build: TypeScript 컴파일npm run start: 컴파일된 JavaScript 파일로 서버 실행npm run format: Prettier를 사용하여 코드 포맷팅npx prisma migrate dev: 데이터베이스 마이그레이션npx prisma studio: Prisma Studio 실행npx prisma db seed: Seed 데이터 추가
















