A driving practice tracking service for novice drivers - Junction X Seoul 2021 Hackathon Project
Chobo (초보 in Korean, meaning "beginner") is a service designed to help novice drivers safely improve their driving skills. It tracks driving practice sessions, provides recommended practice courses, and helps manage vehicle maintenance.
Watch the demo video to see Chobo in action: YouTube Demo
- User Management: Novice driver profile management
- Driving Record Tracking: Detailed records and statistics per practice session
- Vehicle Management: Multiple vehicle registration and maintenance interval tracking
- Practice Course Recommendations: Beginner-friendly courses via TMap API integration
- Real-time Tracking: Location and driving data monitoring during practice
- Runtime: Node.js (v14+)
- Language: TypeScript 4.2
- Framework: Express.js 4.17
- Database: MySQL 5.7+
- Query Builder: Knex.js
- Build Tool: Babel 7
- Process Manager: Nodemon
- Linting: ESLint with Airbnb config
- Testing: Jest
- Cloud Provider: AWS
- CI/CD: AWS CodePipeline (CodeCommit → CodeBuild → Elastic Beanstalk)
- Monitoring: AWS CloudWatch
- Notifications: AWS Lambda + Slack integration
Chobo follows a 3-Layer Architecture pattern:
┌─────────────────────────────────────────┐
│ Controller Layer │
│ (HTTP Request/Response Handling) │
├─────────────────────────────────────────┤
│ Service Layer │
│ (Business Logic & Rules) │
├─────────────────────────────────────────┤
│ Repository Layer │
│ (Data Access & Queries) │
└─────────────────────────────────────────┘
│
▼
┌─────────┐
│ MySQL │
└─────────┘
- Dependency Injection: For improved testability and loose coupling
- Domain-Driven Design: Clear domain models and business logic separation
- Centralized Error Handling: Consistent error management with custom error types
- Type Safety: Full TypeScript implementation for better developer experience
- Docker Desktop
- Docker Compose
- Git
- Node.js (v18.0.0 or higher)
- npm or yarn
- MySQL 5.7 or higher
- Git
- Clone the repository:
git clone https://github.com/yourusername/Junction-X-Seoul.git
cd Junction-X-Seoul
- Install dependencies:
# Using npm
npm install
# Using yarn
yarn install
- Set up the database:
# Create database
mysql -u root -p -e "CREATE DATABASE chobo_db;"
# Run migrations (if available)
npm run migrate
Create a .env
file in the root directory:
# Server Configuration
PORT=3000
NODE_ENV=development
# Database Configuration
DB_HOST=localhost
DB_PORT=3306
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DB_NAME=chobo_db
# TMap API Configuration
TMAP_API_KEY=your_tmap_api_key
TMAP_API_URL=https://apis.openapi.sk.com/tmap
# JWT Configuration (if applicable)
JWT_SECRET=your_jwt_secret
JWT_EXPIRY=24h
# AWS Configuration (for deployment)
AWS_REGION=ap-northeast-2
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
# Start development environment
make dev
# Or start in background
make up
# View logs
make logs
# Stop services
make down
# Development mode with hot-reload
docker-compose -f docker-compose.dev.yml up
# Production mode
docker-compose up -d
# View logs
docker-compose logs -f
# Access database UI (Adminer)
# Open http://localhost:8080
# Server: mysql
# Username: chobo_user
# Password: chobo_password
# Database: chobo_db
# Stop all services
docker-compose down
# Clean everything (including database)
docker-compose down -v
# Install dependencies
npm install
# Create .env file from example
cp .env.example .env
# Edit .env with your database credentials
# Run in watch mode with auto-reload
npm run dev
# Build the application
npm run build
# Start the production server
npm start
Complete API documentation is available at:
- Postman Documentation: https://documenter.getpostman.com/view/12371867/TzXtK16Q
GET /api/users/:userId
- Get user informationPOST /api/users
- Create new userPUT /api/users/:userId
- Update user information
GET /api/records/user/:userId
- Get all driving records for a userPOST /api/records
- Create new driving recordGET /api/records/:recordId
- Get specific driving record
GET /api/cars/user/:userId
- Get all cars for a userPOST /api/cars
- Add new carPUT /api/cars/:carId
- Update car information
POST /api/tmap/route
- Get route recommendationsGET /api/tmap/practical-courses
- Get practical driving courses for beginners
Junction-X-Seoul/
├── src/
│ ├── app.ts # Application entry point
│ ├── DrivingRecord/ # Driving record module
│ │ ├── DrivingRecordController.ts
│ │ ├── DrivingRecordRepository.ts
│ │ ├── DrivingRecordMapper.ts
│ │ ├── domain/
│ │ │ └── DrivingRecord.ts
│ │ └── service/
│ │ ├── GetPracticalCourse.ts
│ │ ├── GetRecordsByUserId.ts
│ │ └── InsertDrivingRecord.ts
│ ├── user/ # User module
│ │ ├── UserController.ts
│ │ ├── UserRepository.ts
│ │ ├── domain/
│ │ │ └── User.ts
│ │ ├── service/
│ │ │ └── GetUserByUserId.ts
│ │ └── error/
│ │ └── UserNotExistError.ts
│ ├── car/ # Car module
│ │ ├── CarRepository.ts
│ │ ├── CarMapper.ts
│ │ ├── domain/
│ │ │ ├── Car.ts
│ │ │ └── ChangeInterval.ts
│ │ └── service/
│ │ └── GetCarsByUserId.ts
│ ├── TMap/ # TMap integration module
│ │ ├── Tmap.ts
│ │ └── TmapController.ts
│ └── infra/ # Infrastructure layer
│ ├── ApplicationConfig.ts
│ ├── knexFile.ts
│ ├── QueryExecutor.ts
│ ├── ResponseResult.ts
│ ├── StatusCode.ts
│ ├── header.ts
│ └── errors/
│ ├── CustomError.ts
│ ├── InternalServerError.ts
│ └── PayloadValidationError.ts
├── package.json
├── tsconfig.json
├── babel.config.js
├── build.js
└── README.md
The application uses AWS services for automated deployment:
- Code Push: Push changes to GitHub repository
- AWS CodeCommit: Detects changes and triggers build
- AWS CodeBuild:
- Pulls source from GitHub
- Runs build scripts
- Creates deployment artifacts
- AWS Elastic Beanstalk:
- Receives artifacts
- Deploys to Auto Scaling Group
- Monitoring & Alerts:
- CloudWatch monitors deployment status
- Lambda function sends Slack notifications
For manual deployment to AWS:
# Build the application
npm run build
# Deploy using AWS CLI or Elastic Beanstalk CLI
eb deploy
- Event: Junction X Seoul 2021
- Team: Korea France Collab
- Client Application: iOS App Repository
Made with ❤️ during Junction X Seoul 2021