프로젝트 개요
싹둑(Ssakdook)은 식물 애호가들을 위한 통합 커뮤니티 및 관리 플랫폼입니다. 사용자들이 식물 가지치기(전정) 노하우를 공유하고, 일상 속 식물 관리 일지를 기록하며, 실시간 채팅을 통해 전문가 조언을 받을 수 있는 종합 서비스를 제공합니다. 관리자 대시보드를 통한 콘텐츠 예약 발행, 푸시 알림 관리, 회원 관리 등 운영 효율화 기능도 갖추고 있습니다.
서비스 흐름도
주요 기능
1. 커뮤니티 게시판
- 식물 가지치기 노하우 공유 및 질의응답
- 카테고리별 게시글 분류 (전정, 병충해, 식물추천 등)
- 좋아요 및 댓글 기능
- 인기글 자동 선정 (좋아요 10개 이상)
- 조회수 추적 및 첨부파일 업로드
사용자들이 식물 관리 경험과 노하우를 자유롭게 공유할 수 있습니다. 카테고리를 통해 관심 주제를 빠르게 찾고, 좋아요 10개 이상 받은 게시글은 자동으로 인기글로 선정되어 더 많은 사람들에게 노출됩니다.
2. 식물 일지
- 날짜별 식물 관리 기록 작성
- 개인 히스토리 조회 및 캘린더 뷰 제공
- 사진 첨부 및 메모 기능
내 식물의 물주기, 분갈이, 가지치기 등 모든 관리 이력을 날짜별로 기록하고 캘린더에서 한눈에 확인할 수 있습니다. 사진과 메모를 함께 남겨 나만의 식물 성장 일지를 만들어보세요.
3. 라이프 포스팅
- 식물 관련 라이프스타일 콘텐츠 큐레이션
- 외부 링크 연동 및 썸네일 이미지 제공
- 관리자 전용 콘텐츠 발행
전문가가 선별한 식물 라이프스타일 콘텐츠를 제공합니다. 인테리어 팁, 식물 트렌드, 제품 추천 등 다양한 정보를 외부 링크와 함께 큐레이션하여 사용자에게 전달합니다.
4. 실시간 채팅
- Stream Chat 기반 1:1 상담
- 전문가 매칭 및 채팅방 생성
- 메시지 히스토리 보관
식물 관리에 대한 고민이 생기면 전문가와 1:1 채팅으로 즉시 상담받을 수 있습니다. 모든 대화 내역은 보관되어 나중에 다시 확인할 수 있습니다.
5. 예약 발행 시스템
- 게시글 및 댓글 예약 발행
- 스케줄러를 통한 자동 발행
- 초기 좋아요 수 보정 기능
관리자가 콘텐츠를 원하는 시간에 자동으로 발행되도록 예약할 수 있습니다. 스케줄러가 매 분마다 예약 시각을 확인하여 정확한 시간에 게시글이나 댓글을 자동 발행하며, 초기 좋아요 수를 설정하여 콘텐츠의 초기 노출을 조절할 수 있습니다.
6. 푸시 알림
- Firebase Cloud Messaging 연동
- 디바이스 토큰 관리
- 알림 동의 관리 및 선택적 수신
새 댓글, 좋아요, 채팅 메시지 등 중요한 이벤트가 발생하면 푸시 알림으로 즉시 알려줍니다. 사용자는 알림 종류별로 수신 여부를 선택할 수 있습니다.
7. 관리자 대시보드
- 회원 관리 및 게시글/댓글 모더레이션
- 파일 업로드 (AWS S3)
- 앱 설정 관리 (버전 정보, 서비스 약관 등)
커뮤니티 운영에 필요한 모든 기능을 웹 대시보드에서 관리할 수 있습니다. 부적절한 콘텐츠를 블라인드 처리하고, 회원 정보를 조회하며, 앱 버전과 약관 정보를 업데이트할 수 있습니다.
플랫폼 구성
| 구분 | 기술 스택 | 비고 |
|---|---|---|
| 백엔드 | NestJS, TypeScript, TypeORM | Layered Architecture |
| 데이터베이스 | MariaDB | UTF-8MB4 |
| 인증 | JWT, Passport | 토큰 기반 |
| 파일 저장소 | AWS S3 | 버킷 분리 |
| 실시간 채팅 | Stream Chat | REST API |
| 푸시 알림 | Firebase Cloud Messaging | - |
| 결제 | Iamport | - |
| 알림톡 | NCP SENS | - |
| 스케줄링 | @nestjs/schedule | Cron |
| 에러 모니터링 | Slack Webhook | - |
기술적 선택과 이유
NestJS 레이어드 아키텍처
도메인 주도 설계(DDD)를 적용하여 domain, application, presentation, infrastructure 레이어를 명확히 분리했습니다. 이를 통해 비즈니스 로직의 독립성을 확보하고 테스트 용이성을 높였습니다.
TypeORM + Custom Base Entity
공통 엔티티 클래스를 정의하여 createdAt, updatedAt, deletedAt 등의 필드를 재사용하고, 소프트 딜리트 및 블라인드 처리 로직을 일관되게 적용했습니다.
JWT 인증
stateless한 토큰 기반 인증을 통해 서버 확장성을 확보하고, Passport 전략 패턴으로 인증 로직을 모듈화하여 유지보수성을 높였습니다.
예약 발행 시스템
@nestjs/schedule의 Cron을 활용해 매 분마다 예약 이벤트를 검사하여 자동 발행합니다. 예약 데이터를 체계적으로 관리하며, 게시글과 댓글 모두 예약 발행을 지원합니다.
Stream Chat 연동
자체 채팅 서버 구축 대신 Stream Chat SaaS를 활용하여 개발 속도를 높이고, 안정적인 실시간 메시징 인프라를 확보했습니다. REST API를 통해 채널 생성 및 메시지 전송을 제어합니다.
AWS S3 파일 관리
Presigned URL을 활용한 안전한 파일 업로드/다운로드를 구현했으며, 클라이언트 버킷과 관리자 버킷을 분리하여 권한을 격리했습니다.
Firebase Cloud Messaging
크로스 플랫폼 푸시 알림을 위해 FCM을 채택했습니다. 디바이스 토큰을 DB에 저장하여 관리하고, 알림 동의 여부를 세밀하게 제어할 수 있습니다.
프로젝트 특징
확장 가능한 도메인 모델
명확히 분리된 도메인 엔티티를 통해 각 기능을 독립적으로 확장할 수 있습니다. 좋아요 기능은 별도 엔티티로 분리되어 추후 다른 도메인에도 재사용 가능합니다.
관리자 대시보드를 통한 운영 효율화
예약 발행, 초기 좋아요 수 보정, 블라인드 처리 등 운영에 필요한 기능을 관리자 전용 API로 제공하여 콘텐츠 품질 관리 및 커뮤니티 활성화를 지원합니다.
에러 모니터링 자동화
처리되지 않은 예외를 자동으로 Slack 채널에 전송하여 실시간 장애 대응이 가능합니다.
서비스 약관 및 푸시 알림 동의 관리
법적 요구사항을 충족하는 약관 동의 시스템을 구축했습니다.
커서 기반 페이지네이션
무한 스크롤을 위해 커서 기반 페이지네이션을 구현하여 대량 데이터에서도 일관된 성능을 제공합니다.
이벤트 기반 아키텍처
@nestjs/event-emitter를 활용하여 도메인 이벤트를 발행하고, 느슨하게 결합된 이벤트 핸들러로 부가 기능(알림 전송, 로깅 등)을 처리합니다.