|
| 1 | +# Denamu Project - GitHub Copilot Instructions |
| 2 | + |
| 3 | +## 프로젝트 개요 |
| 4 | + |
| 5 | +**데나무(Denamu)** - RSS 기반 기술 블로그 큐레이션 플랫폼 |
| 6 | + |
| 7 | +개발자들이 분산된 기술 블로그 콘텐츠를 한 곳에서 편리하게 구독하고, 실시간 트렌드를 확인하며, 커뮤니티를 통해 소통할 수 있는 서비스입니다. |
| 8 | + |
| 9 | +## 프로젝트 구조 |
| 10 | + |
| 11 | +### `/server` |
| 12 | + |
| 13 | +- **NestJS 기반 WAS(Web Application Server)** |
| 14 | +- TypeORM을 사용한 MySQL 데이터베이스 연동 |
| 15 | +- Redis를 활용한 캐싱 및 세션 관리 |
| 16 | +- Socket.IO 기반 실시간 채팅 기능 |
| 17 | +- JWT 인증 및 OAuth(Google, GitHub) 소셜 로그인 |
| 18 | +- Prometheus를 통한 모니터링 |
| 19 | +- Winston을 활용한 구조화된 로깅 |
| 20 | + |
| 21 | +### `/feed-crawler` |
| 22 | + |
| 23 | +- **RSS 피드 크롤러 서비스** |
| 24 | +- 등록된 RSS 피드를 주기적으로 수집 |
| 25 | +- AI(Anthropic Claude) 기반 콘텐츠 분석 및 태그 생성 |
| 26 | +- MySQL 데이터베이스에 수집 데이터 저장 |
| 27 | +- 의존성 주입(tsyringe) 기반 아키텍처 |
| 28 | + |
| 29 | +### `/client` |
| 30 | + |
| 31 | +- **React + TypeScript 기반 프론트엔드** |
| 32 | +- Vite 빌드 도구 사용 |
| 33 | +- TanStack Query를 통한 서버 상태 관리 |
| 34 | +- Zustand를 통한 클라이언트 상태 관리 |
| 35 | +- Radix UI + Tailwind CSS 기반 컴포넌트 시스템 |
| 36 | +- Socket.IO Client로 실시간 채팅 연동 |
| 37 | + |
| 38 | +### `/docker-compose` |
| 39 | + |
| 40 | +- **인프라 구성 파일** |
| 41 | +- 로컬 개발 환경 (docker-compose.local.yml) |
| 42 | +- 개발 서버 환경 (docker-compose.dev.yml) |
| 43 | +- 프로덕션 환경 (docker-compose.prod.yml) |
| 44 | +- 인프라 서비스 (MySQL, Redis, Prometheus, Grafana) |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## 코드 리뷰 가이드라인 |
| 49 | + |
| 50 | +### 리뷰 언어 |
| 51 | + |
| 52 | +코드 리뷰시에는 반드시 한국어를 사용하세요. |
| 53 | + |
| 54 | +### 리뷰 우선순위 (Pn 룰 적용) |
| 55 | + |
| 56 | +코드 리뷰 시 아래 우선순위를 반드시 명시하여 피드백을 제공하세요: |
| 57 | + |
| 58 | +- **P1 (최우선)**: 즉각 수정이 필요한 중대한 문제 (보안 취약점, 크리티컬 버그, 비즈니스 로직 오류) |
| 59 | +- **P2 (매우 중요)**: 반드시 반영해야 하는 코드 품질/기능 이슈 |
| 60 | +- **P3 (중요)**: 잠재적 버그 위험이나 중요한 개선 사항 |
| 61 | +- **P4 (가벼운 제안)**: 가독성/유지보수성 개선 권장 사항 |
| 62 | +- **P5 (질문 및 추천)**: 선택적 제안 및 질문 |
| 63 | + |
| 64 | +### 백엔드 코드 리뷰 중점 사항 |
| 65 | + |
| 66 | +#### 1. 보안 및 잠재 버그 위험 (P1-P2) |
| 67 | + |
| 68 | +- **SQL Injection**: TypeORM 쿼리 빌더 사용 시 raw query 검증 |
| 69 | +- **인증/인가**: JWT 토큰 검증, refresh token 갱신 로직 확인 |
| 70 | +- **입력 검증**: class-validator DTO 검증 누락 여부 |
| 71 | +- **XSS 방지**: 사용자 입력 sanitization 확인 |
| 72 | +- **Race Condition**: Redis 동시성 제어 (락, 트랜잭션) |
| 73 | +- **에러 핸들링**: try-catch 누락, 적절한 HTTP 상태 코드 반환 |
| 74 | +- **파일 업로드**: 파일 크기 제한, MIME 타입 검증 |
| 75 | +- **리소스 누수**: DB 커넥션, 파일 핸들러 정리 확인 |
| 76 | + |
| 77 | +#### 2. 비즈니스 로직 검증 (P1-P3) |
| 78 | + |
| 79 | +- **데이터 일관성**: 트랜잭션 범위 적절성 |
| 80 | +- **상태 전이**: 엔티티 상태 변화 로직의 정합성 |
| 81 | +- **엣지 케이스**: 경계값, null/undefined 처리 |
| 82 | +- **중복 방지**: 조회수 증가, 좋아요 등 중복 방지 로직 |
| 83 | +- **도메인 규칙**: 비즈니스 제약 조건 준수 여부 |
| 84 | + |
| 85 | +#### 3. 성능 최적화 (P2-P4) |
| 86 | + |
| 87 | +- **N+1 쿼리**: TypeORM relations eager loading 확인 |
| 88 | +- **인덱스 활용**: WHERE, JOIN 조건에 인덱스 사용 |
| 89 | +- **캐싱 전략**: Redis 캐시 TTL 적정성, 캐시 무효화 로직 |
| 90 | +- **페이지네이션**: offset 대신 cursor 기반 페이지네이션 고려 |
| 91 | +- **불필요한 쿼리**: 중복 DB 호출 제거 |
| 92 | +- **메모리 사용**: 대용량 데이터 스트리밍 처리 |
| 93 | + |
| 94 | +#### 4. 코드 품질 (P3-P5) |
| 95 | + |
| 96 | +- **SOLID 원칙**: 단일 책임, 의존성 역전 준수 |
| 97 | +- **중복 제거**: DRY 원칙, 공통 로직 추출 |
| 98 | +- **명명 규칙**: 명확하고 일관된 변수/함수명 |
| 99 | +- **타입 안정성**: any 타입 남용 방지, 적절한 타입 정의 |
| 100 | +- **테스트 커버리지**: 주요 비즈니스 로직 단위 테스트 |
| 101 | + |
| 102 | +--- |
| 103 | + |
| 104 | +## 기술 스택별 권장 사항 |
| 105 | + |
| 106 | +### NestJS (Server) |
| 107 | + |
| 108 | +- 모듈화된 구조 유지 (각 기능별 Module, Controller, Service 분리) |
| 109 | +- Dependency Injection 적극 활용 |
| 110 | +- Global Exception Filter로 일관된 에러 응답 |
| 111 | +- Pipe를 통한 입력 검증 및 변환 |
| 112 | +- Interceptor로 로깅, 응답 변환 처리 |
| 113 | +- Guard를 통한 인증/인가 구현 |
| 114 | + |
| 115 | +### TypeScript 공통 |
| 116 | + |
| 117 | +- strict 모드 활성화 유지 |
| 118 | +- enum 대신 union type 사용 고려 |
| 119 | +- 타입 추론 활용, 불필요한 타입 명시 지양 |
| 120 | +- 유틸리티 타입 적극 활용 (Pick, Omit, Partial 등) |
| 121 | + |
| 122 | +### React (Client) |
| 123 | + |
| 124 | +- 컴포넌트 단일 책임 원칙 준수 |
| 125 | +- Custom Hooks로 로직 재사용 |
| 126 | +- useCallback, useMemo로 불필요한 리렌더링 방지 |
| 127 | +- TanStack Query의 staleTime, cacheTime 적절히 설정 |
| 128 | +- 접근성(a11y) 고려 (ARIA 레이블, 키보드 네비게이션) |
| 129 | + |
| 130 | +--- |
| 131 | + |
| 132 | +## 리뷰 예시 |
| 133 | + |
| 134 | +### 좋은 리뷰 예시 |
| 135 | + |
| 136 | +``` |
| 137 | +P1) [보안] JWT 토큰 검증 시 만료 시간(exp) 체크가 누락되었습니다. |
| 138 | +만료된 토큰으로도 인증이 통과될 수 있어 즉시 수정이 필요합니다. |
| 139 | +
|
| 140 | +P2) [성능] findAll() 메서드에서 전체 데이터를 가져온 후 필터링하고 있습니다. |
| 141 | +WHERE 절로 DB 레벨에서 필터링하는 것이 성능상 유리합니다. |
| 142 | +
|
| 143 | +P3) [버그 가능성] Redis 캐시 조회 실패 시 에러 핸들링이 없습니다. |
| 144 | +Redis 장애 시 서비스 전체가 중단될 수 있으니 fallback 로직을 추가하는 것이 좋겠습니다. |
| 145 | +
|
| 146 | +P4) [가독성] 중첩된 if문이 많아 로직 이해가 어렵습니다. |
| 147 | +Early return 패턴이나 Guard clause를 활용하면 더 명확해질 것 같습니다. |
| 148 | +
|
| 149 | +P5) [제안] lodash 대신 native array 메서드를 사용하면 번들 크기를 줄일 수 있습니다. |
| 150 | +성능 차이가 크지 않다면 고려해보시면 좋을 것 같아요. |
| 151 | +``` |
| 152 | + |
| 153 | +--- |
| 154 | + |
| 155 | +## 주의사항 |
| 156 | + |
| 157 | +- **배포 전 체크리스트**: 환경변수 설정, 마이그레이션 실행, 테스트 통과 확인 |
| 158 | +- **로깅**: 민감 정보(비밀번호, 토큰) 로그 출력 금지 |
| 159 | +- **에러 메시지**: 프로덕션에서는 상세 에러 스택 노출 방지 |
| 160 | +- **API 버전 관리**: Breaking change 시 API 버전업 고려 |
| 161 | +- **DB 마이그레이션**: 데이터 손실 방지를 위한 롤백 계획 수립 |
0 commit comments