Skip to content

A real-time train cabin status platform where riders can vote on temperature, share comments, track live locations, and explore fun community features.

Notifications You must be signed in to change notification settings

wookingwoo/trainmate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

37 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿš‡ ์ง€ํ•˜์ฒ  ๋”์›Œ์ถ”์›Œ

๊ฐ™์€ ์—ด์ฐจ๋ฅผ ํƒ€๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์†Œํ†ตํ•˜๋Š” ์›น ์•ฑ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

1. ๐ŸŒก๏ธ ์‹ค์‹œ๊ฐ„ ํˆฌํ‘œ

  • ์˜จ๋„: ๋”์›Œ์š” / ์ถ”์›Œ์š”
  • ํ˜ผ์žก๋„: ์—ฌ์œ ๋กœ์›€ / ๋ณดํ†ต / ํ˜ผ์žกํ•จ
  • ๋ƒ„์ƒˆ: ์‹ฌํ•จ / ๊ดœ์ฐฎ์Œ
  • ์ฒญ๊ฒฐ๋„: 1~5์  ํ‰๊ฐ€
  • ์†Œ์Œ: 1~5์  ํ‰๊ฐ€
  • Socket.io๋ฅผ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ํˆฌํ‘œ ๊ฒฐ๊ณผ ์—…๋ฐ์ดํŠธ

2. ๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œํŒ

  • ์ผ๋ฐ˜ ์ฑ„ํŒ…
  • ์ž๋ฆฌ ์–‘๋ณด ์š”์ฒญ
  • ๋ถ„์‹ค๋ฌผ ์ฐพ๊ธฐ/์‹ ๊ณ 
  • 10๋ถ„ ํ›„ ์ž๋™ ์‚ญ์ œ (TTL)

3. ๐Ÿšจ ๋น„์ƒ ์•Œ๋ฆผ

  • ์„ฑ์ถ”ํ–‰/์œ„ํ—˜ ์ƒํ™ฉ
  • ์˜๋ฃŒ ์‘๊ธ‰ ์ƒํ™ฉ
  • ์ด์ƒํ•œ ๋ƒ„์ƒˆ
  • ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ „ํŒŒ

๊ธฐ์ˆ  ์Šคํƒ

  • Frontend: Next.js 14 (App Router), TypeScript, Tailwind CSS
  • UI Library: shadcn/ui
  • Backend: Next.js API Routes
  • Database: MongoDB (Mongoose)
  • Real-time: Socket.io
  • State Management: Zustand

์„ค์น˜ ๋ฐ ์‹คํ–‰

1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

.env.local ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

# MongoDB Connection String
MONGODB_URI=mongodb://localhost:27017/trainmate
# ๋˜๋Š” MongoDB Atlas ์‚ฌ์šฉ ์‹œ
# MONGODB_URI=mongodb+srv://<username>:<password>@cluster.mongodb.net/trainmate

# Socket.io Server URL
NEXT_PUBLIC_SOCKET_URL=http://localhost:3001

2. ์˜์กด์„ฑ ์„ค์น˜

npm install

3. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

npm run dev

์ด ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ ๋‘ ์„œ๋ฒ„๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

4. ๋ณ„๋„๋กœ ์‹คํ–‰ํ•˜๊ธฐ

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ ์„œ๋ฒ„๋ฅผ ๋ณ„๋„๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# Next.js๋งŒ ์‹คํ–‰
npm run dev:next

# Socket.io ์„œ๋ฒ„๋งŒ ์‹คํ–‰
npm run dev:socket

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

trainmate/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ app/
โ”‚   โ”‚   โ”œโ”€โ”€ page.tsx              # ๋ฉ”์ธ ํŽ˜์ด์ง€ (์—ด์ฐจ ๋ฒˆํ˜ธ ์ž…๋ ฅ)
โ”‚   โ”‚   โ”œโ”€โ”€ train/[id]/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ page.tsx          # ์—ด์ฐจ ์ƒ์„ธ ํŽ˜์ด์ง€
โ”‚   โ”‚   โ””โ”€โ”€ api/
โ”‚   โ”‚       โ”œโ”€โ”€ trains/[id]/      # ์—ด์ฐจ ์ •๋ณด API
โ”‚   โ”‚       โ””โ”€โ”€ posts/            # ๊ฒŒ์‹œ๊ธ€ API
โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ ui/                   # shadcn/ui ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”œโ”€โ”€ VotingPanel.tsx       # ํˆฌํ‘œ ํŒจ๋„
โ”‚   โ”‚   โ”œโ”€โ”€ CommunityBoard.tsx    # ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œํŒ
โ”‚   โ”‚   โ””โ”€โ”€ EmergencyAlert.tsx    # ๋น„์ƒ ์•Œ๋ฆผ
โ”‚   โ”œโ”€โ”€ lib/
โ”‚   โ”‚   โ”œโ”€โ”€ mongodb.ts            # MongoDB ์—ฐ๊ฒฐ
โ”‚   โ”‚   โ”œโ”€โ”€ models.ts             # Mongoose ์Šคํ‚ค๋งˆ
โ”‚   โ”‚   โ””โ”€โ”€ socket.ts             # Socket.io ํด๋ผ์ด์–ธํŠธ
โ”‚   โ””โ”€โ”€ types/
โ”‚       โ””โ”€โ”€ index.ts              # TypeScript ํƒ€์ž… ์ •์˜
โ”œโ”€โ”€ socket-server.js              # Socket.io ์„œ๋ฒ„
โ”œโ”€โ”€ Dockerfile                    # Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์„ค์ •
โ”œโ”€โ”€ docker-compose.yml            # Docker Compose ์„ค์ •
โ””โ”€โ”€ package.json

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ

trains ์ปฌ๋ ‰์…˜

{
  trainNumber: string;      // ์—ด์ฐจ ๋ฒˆํ˜ธ (์˜ˆ: "2ํ˜ธ์„ -2234")
  line: string;             // ํ˜ธ์„  (์˜ˆ: "2ํ˜ธ์„ ")
  votes: VoteCount;         // ํˆฌํ‘œ ๋ฐ์ดํ„ฐ
  lastUpdated: Date;        // ๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„
}

posts ์ปฌ๋ ‰์…˜

{
  trainNumber: string;      // ์—ด์ฐจ ๋ฒˆํ˜ธ
  type: PostType;           // 'community' | 'emergency' | 'seat' | 'lost'
  content: string;          // ๋‚ด์šฉ
  imageUrl?: string;        // ์ด๋ฏธ์ง€ URL (์„ ํƒ)
  createdAt: Date;          // ์ž‘์„ฑ ์‹œ๊ฐ„
  expiresAt: Date;          // ๋งŒ๋ฃŒ ์‹œ๊ฐ„ (TTL)
}

์‹ค์‹œ๊ฐ„ ํ†ต์‹  ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์—ด์ฐจ ๋ฒˆํ˜ธ๋กœ ์ ‘์†
  2. Socket.io๋กœ ํ•ด๋‹น ์—ด์ฐจ room์— join
  3. ํˆฌํ‘œ/๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ์‹œ ์„œ๋ฒ„๋กœ ์ „์†ก
  4. ์„œ๋ฒ„์—์„œ MongoDB ์—…๋ฐ์ดํŠธ
  5. ๊ฐ™์€ room์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ broadcast

๋ฐฐํฌ

๐Ÿณ Docker๋กœ ๋ฐฐํฌํ•˜๊ธฐ (๊ถŒ์žฅ)

๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ

# ์ด๋ฏธ์ง€ ๋นŒ๋“œ
docker build -t trainmate .

# Docker Compose๋กœ ์‹คํ–‰ (MongoDB ํฌํ•จ)
docker-compose up -d

# ๋กœ๊ทธ ํ™•์ธ
docker-compose logs -f

# ์ ‘์†
# http://localhost:3000

ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์— ๋ฐฐํฌ

  1. ์„œ๋ฒ„ ์ค€๋น„ (Ubuntu ๊ธฐ์ค€)

    # Docker ์„ค์น˜
    curl -fsSL https://get.docker.com | sh
    sudo usermod -aG docker $USER
    
    # Docker Compose ์„ค์น˜
    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
  2. ์ฝ”๋“œ ๋ฐฐํฌ

    # ํ”„๋กœ์ ํŠธ ํด๋ก 
    git clone https://github.com/YOUR_USERNAME/trainmate.git
    cd trainmate
    
    # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
    cp .env.example .env.production
    nano .env.production  # MONGODB_URI, NEXT_PUBLIC_SOCKET_URL ๋“ฑ ์ˆ˜์ •
    
    # ๋นŒ๋“œ ๋ฐ ์‹คํ–‰
    docker build -t trainmate .
    docker-compose --env-file .env.production up -d
  3. ํฌํŠธ ์—ด๊ธฐ

    • 3000 (Next.js)
    • 3001 (Socket.io)

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

.env.production ์˜ˆ์‹œ:

MongoDB Atlas ์‚ฌ์šฉ ์‹œ (๊ถŒ์žฅ):

MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/trainmate?retryWrites=true&w=majority
NEXT_PUBLIC_SOCKET_URL=http://YOUR_SERVER_IP:3001
CORS_ORIGIN=http://YOUR_SERVER_IP:3000
NODE_ENV=production

๋กœ์ปฌ MongoDB ์‚ฌ์šฉ ์‹œ (Docker Compose ๊ธฐ์ค€):

MONGODB_URI=mongodb://mongodb:27017/trainmate
NEXT_PUBLIC_SOCKET_URL=http://YOUR_SERVER_IP:3001
CORS_ORIGIN=http://YOUR_SERVER_IP:3000
NODE_ENV=production

์œ ์šฉํ•œ ๋ช…๋ น์–ด

# ๋กœ๊ทธ ํ™•์ธ
docker-compose logs -f

# ์žฌ์‹œ์ž‘
docker-compose restart

# ์ค‘์ง€
docker-compose down

# ์—…๋ฐ์ดํŠธ
git pull
docker build -t trainmate .
docker-compose up -d

์ฃผ์˜์‚ฌํ•ญ

  • ์ต๋ช… ์‚ฌ์šฉ์ž ๋ฐฉ์‹์œผ๋กœ ๋ณ„๋„์˜ ์ธ์ฆ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ์‹œ๊ธ€์€ 10๋ถ„ ํ›„ ์ž๋™ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • ๋น„์ƒ ์•Œ๋ฆผ์€ ์‹ค์ œ ๊ธด๊ธ‰ ์ƒํ™ฉ์—๋งŒ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.
  • MongoDB TTL ์ธ๋ฑ์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๊ฐœ๋ฐœ ์ฐธ๊ณ ์‚ฌํ•ญ

shadcn/ui ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

npx shadcn@latest add [component-name]

์ƒˆ๋กœ์šด API ๋ผ์šฐํŠธ ์ถ”๊ฐ€

src/app/api/ ๋””๋ ‰ํ† ๋ฆฌ์— route.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š”.

Socket.io ์ด๋ฒคํŠธ ์ถ”๊ฐ€

  1. src/types/index.ts์— ์ด๋ฒคํŠธ ํƒ€์ž… ์ •์˜
  2. socket-server.js์— ์„œ๋ฒ„ ์ธก ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€
  3. ํด๋ผ์ด์–ธํŠธ์—์„œ getSocket()์œผ๋กœ ์ด๋ฒคํŠธ ์†ก์ˆ˜์‹ 

About

A real-time train cabin status platform where riders can vote on temperature, share comments, track live locations, and explore fun community features.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published