DEV Community

sunj
sunj

Posted on • Edited on

테니스 레슨 스케줄링 시스템


NestJS 기반의 테니스 레슨 스케줄링 시스템 백엔드 프로젝트를 진행하며 작성한 포트폴리오 요약입니다.

---

## ✅ 프로젝트 개요

- **목표**: 사용자와 코치 간의 테니스 레슨 예약 시스템 개발
- **핵심 기능**:
  - 사용자의 조건 기반 가능한 시간 탐색
  - 요일/시간 반복 예약
  - 코치별 스케줄 분리
- **기술 스택**: NestJS, TypeScript, PostgreSQL, TypeORM

---

## ⚙️ 기술 스택

- **Backend**: TypeScript, NestJS
- **Database**: PostgreSQL
- **ORM**: TypeORM
- **Testing**: Jest
- **DevTools**: ESLint, Prettier
- **기타**: dotenv 환경 설정, seed script

---

## 📡 주요 API 예시

### ✅ 가능한 레슨 시간 조회

- `GET /lesson/possibleList`

```

json
요청:
{
  "name": "김민준",
  "time": 60,
  "number": 2
}


Enter fullscreen mode Exit fullscreen mode

json
응답:
{
  "success": true,
  "data": [
    "2024-04-13 07:00:00",
    "2024-04-13 07:30:00"
  ]
}


Enter fullscreen mode Exit fullscreen mode

🧩 ERD 요약

  • User, Coach, Lesson, Schedule, LessonTime 등의 엔티티가 관계형으로 연결
  • 다양한 예약 조건 (요일, 시간, 반복 예약 등)을 처리하기 위한 모델링

ERD 시각화는 ERD.md (GitHub) 참고


🧱 서비스 계층 구조



[Client]
   ↓
[Controller] → [Service] → [Repository] → [PostgreSQL]


Enter fullscreen mode Exit fullscreen mode
  • NestJS의 계층 기반 아키텍처
  • 도메인 단위 모듈 구조 (lesson.module.ts)
  • DI(의존성 주입) 패턴 중심 설계

🐛 트러블슈팅 요약

🔄 순환 참조 문제

  • Lesson ↔ ScheduleforwardRef() 미사용 시 NestJS DI 에러
  • forwardRef() 사용으로 해결

⏰ 시간대 불일치

  • DB 저장은 UTC, 클라이언트 응답은 KST로 변환 처리

🧪 테스트 환경 충돌

  • seed script가 실DB 덮어쓰는 문제 발생
  • .env.test 환경 구분 및 테스트 전용 설정으로 분리

💭 회고

NestJS의 구조와 설계 철학을 직접 체험하면서, 단순한 CRUD를 넘어서 예약 로직, 시간 조건 처리, 관계형 DB 모델링 등을 경험할 수 있었습니다. 실무형 프로젝트를 구성하며 기술적 의사결정과 구조 설계 역량을 키울 수 있는 좋은 기회였습니다.


🔗 참고 링크

Top comments (0)