네이버 OpenAPI와 주요 언론사 RSS(연합뉴스, 조선일보, 한국경제)를 통합하여 사용자의 관심사에 맞춘 뉴스를 제공하고, 댓글 및 소셜 기능을 통해 사용자 간 상호작용이 가능한 통합형 뉴스 플랫폼입니다.
- 뉴스 통합 제공: 네이버 OpenAPI와 주요 언론사 RSS를 연동하여 최신 뉴스 콘텐츠를 수집 및 제공
- 소셜 기능: 댓글 및 의견 공유 기능을 통해 사용자 간 소통
- 뉴스 기사 백업 및 복구 시스템
프로젝트 기간: 2025.10.20 ~ 2025.11.07
| 항목 | 내용 |
|---|---|
| 📣 발표 자료 | 발표 자료 PDF |
| 📄 협업 문서 | Notion 페이지 |
| 🔗 배포 링크 | 배포 링크 |
| 🎬 시연 영상 | YouTube 시연 영상 |
| 팀장/ 박유한 | 김유민 | 남현수 | 조하람 |
|---|---|---|---|
|
• 뉴스 기사 스프링 배치 처리 • AWS S3 연동 및 뉴스 데이터 백업 기능 개발 • 뉴스 기사 관리 모듈 개발 • CI/CD 파이프라인 구축 |
• 활동 내역 관리 기능 개발 • 알림 관리 기능 개발 • MongoDB 설계 |
• 관심사 관리 기능 개발 • 댓글 관리 기능 개발 • 시스템 모니터링 및 부하 테스트 수행 |
• 사용자 관리 기능 개발 • 서버 인프라 구성 및 운영 |
| yuhandemian | kimyumin03 | Namsoo315 | haram-jo |
-
뉴스 기사 도메인 총괄: 논리/물리 삭제 API 등 기사 관련 핵심 비즈니스 로직 개발.
-
데이터 수집 자동화: Spring Batch Job을 설계하여, 외부 뉴스 API 및 RSS 피드를 주기적으로 수집 및 파싱하여 DB에 저장하는 기능 구현.
-
성능 최적화: Redis의 setIfAbsent를 활용한 조회수 중복 방지 로직 및 try-catch 기반의 Redis 장애 대비 Fallback로직 구현.
-
데이터 백업/복구: AWS S3 연동 및 Spring Batch를 활용, 일일 뉴스 데이터를 S3에 백업하고, 관리자가 날짜별로 데이터를 복원할 수 있는 API 개발.
-
CI/CD 파이프라인 구축: GitHub Actions 워크플로우(*.yml)를 작성
-
NoSQL 데이터 모델링: MongoDB를 기반으로 '사용자 활동 내역'컬렉션 스키마를 설계.
-
활동 내역 관리: 기사 조회, 댓글 작성, 좋아요 등 사용자의 주요 활동 이력을 추적하여 MongoDB에 비동기적으로 저장 및 조회하는 기능 구현.
-
실시간 알림 기능: 내 관심사의 새 기사, 내 글의 새 댓글 등 주요 이벤트 발생 시 MongoDB에 알림 문서를 생성하고 관리하는 API 개발.
-
댓글/대댓글 기능 개발: 기사별 댓글/대댓글 CRUD API, 댓글 좋아요 기능 구현.
-
데이터 생명주기 관리: Spring Scheduler를 활용, 논리 삭제(Soft Delete)된 댓글(CommentCleanupScheduler)을 N시간/일 기준으로 자동 물리 삭제(Hard Delete)하는 배치 작업 구현.
-
관심사 기능 개발: 사용자별 관심 키워드 등록/삭제(CRUD) API 및 사용자의 관심사와 신규 수집된 뉴스를 매칭하는 로직 개발.
-
CI/CD 파이프라인 구축: Gradle 빌드, Docker 이미지 생성, AWS ECR 푸시 및 ECS 서비스 롤링 업데이트까지의 배포 자동화 파이프라인 구축.
-
컨테이너화 및 배포: Docker Compose를 활용하여 개발 환경의 Postgres, Redis 등을 컨테이너로 관리하며, 운영 환경 배포 전략 수립.
-
시스템 모니터링 구축: Prometheus, Grafana를 Spring Actuator와 연동하여 JVM, API 응답 속도, HTTP Status 등 핵심 메트릭 시각화 대시보드 구축.
-
성능 부하 테스트: 주요 API(로그인, 기사 조회, 댓글 작성)의 부하 테스트 시나리오를 작성하고, 병목 지점을 분석하여 성능 개선.
-
인증/인가 시스템 구축: Spring Security를 활용하여 사용자 회원가입, 로그인(인증), 권한(ADMIN/USER) 관리(인가) 시스템 전반을 구현.
-
사용자 도메인 관리: 사용자 정보 CRUD API 및 Spring Scheduler를 활용한 탈퇴 계정(UserCleanupScheduler) 자동 물리 삭제 로직 구현.
-
클라우드 인프라 구축: AWS (EC2, RDS-PostgreSQL, ElastiCache-Redis) 등 핵심 인프라를 프로비저닝하고 보안 그룹(SG) 및 네트워크(VPC) 설정.
src/main/java/com/spring/monew 트리
com.spring.monew
|-- activity
| |-- controller
| | |-- dto
| | | |-- data
| | | | `-- Test.java
| | | |-- request
| | | | `-- Test.java
| | | `-- response
| | | |-- CommentActivityDto.java
| | | |-- CommentLikeActivityDto.java
| | | `-- UserActivityDto.java
| | `-- UserActivityController.java
| |-- domain
| | |-- ActivityArticleViewDoc.java
| | |-- ActivityCommentDoc.java
| | |-- ActivityCommentLikeDoc.java
| | `-- UserInterestSubscriptionDoc.java
| |-- repository
| | |-- impl
| | | |-- ActivitySyncRepositoryImpl.java
| | | `-- UserActivityQueryRepositoryImpl.java
| | |-- ActivityArticleViewRepository.java
| | |-- ActivitySyncRepository.java
| | `-- UserActivityQueryRepository.java
| |-- service
| | |-- impl
| | | `-- UserActivityServiceImpl.java
| | `-- UserActivityService.java
| `-- util
| `-- ActivityMapper.java
|-- article
| |-- client
| | |-- dto
| | | `-- ArticleCandidate.java
| | |-- NaverNewsApiClient.java
| | `-- RssFeedClient.java
| |-- controller
| | |-- dto
| | | |-- data
| | | | `-- Test.java
| | | |-- request
| | | | `-- Test.java
| | | `-- response
| | | |-- ArticleDto.java
| | | |-- ArticleRestoreResultDto.java
| | | `-- CursorPageResponseArticleDto.java
| | `-- ArticleController.java
| |-- domain
| | |-- Article.java
| | `-- ArticleSource.java
| |-- exception
| | `-- ArticleNotFoundException.java
| |-- repository
| | |-- impl
| | | `-- ArticleRepositoryCustomImpl.java
| | |-- ArticleRepository.java
| | `-- ArticleRepositoryCustom.java
| `-- service
| |-- impl
| | `-- ArticleServiceImpl.java
| `-- ArticleService.java
|-- articleview
| |-- controller
| | |-- dto
| | | `-- response
| | | `-- ArticleViewDto.java
| | `-- ArticleViewController.java
| |-- domain
| | `-- ArticleView.java
| |-- repository
| | |-- impl
| | | `-- Test.java
| | `-- ArticleViewRepository.java
| `-- service
| |-- impl
| | `-- ArticleViewServiceImpl.java
| `-- ArticleViewService.java
|-- auth
| |-- config
| | |-- HeaderAuthFilter.java
| | |-- HeaderUserAuthentication.java
| | `-- SecurityConfig.java
| |-- controller
| | `-- AuthController.java
| `-- service
| `-- AuthService.java
|-- backup
| |-- dto
| | `-- ArticleBackupDto.java
| |-- exception
| | |-- BackupNotFoundException.java
| | `-- S3ServiceException.java
| `-- service
| |-- impl
| | |-- S3BackupServiceImpl.java
| | `-- S3LogBackupServiceImpl.java
| |-- LogBackupService.java
| `-- S3BackupService.java
|-- batch
| |-- config
| | |-- ArticleBackupBatchConfig.java
| | |-- BatchSkipListener.java
| | |-- LogBackupBatchConfig.java
| | |-- NewsCollectionJobConfig.java
| | `-- RestTemplateConfig.java
| |-- controller
| | `-- BatchJobController.java
| |-- dto
| | `-- response
| | |-- BatchJobExecutionResponse.java
| | |-- BatchJobTriggerResponse.java
| | |-- CleanupTriggerResponse.java
| | `-- StepStatistics.java
| |-- exception
| | |-- BatchJobExceptionHandler.java
| | `-- BatchJobExecutionNotFoundException.java
| |-- listener
| | `-- ArticleNotificationListener.java
| |-- processor
| | |-- ArticleBackupProcessor.java
| | `-- ArticleCandidateProcessor.java
| |-- reader
| | `-- ArticleCandidateReader.java
| |-- scheduler
| | |-- ArticleBackupScheduler.java
| | |-- ArticleCleanupScheduler.java
| | |-- CommentCleanupScheduler.java
| | |-- LogBackupScheduler.java
| | |-- NewsCollectionScheduler.java
| | `-- UserCleanupScheduler.java
| |-- service
| | `-- BatchJobService.java
| `-- writer
| |-- ArticleBackupWriter.java
| `-- ArticleWriter.java
|-- comment
| |-- controller
| | |-- dto
| | | |-- request
| | | | |-- CommentRegisterRequest.java
| | | | `-- CommentUpdateRequest.java
| | | `-- response
| | | |-- CommentDto.java
| | | `-- CursorPageResponseCommentDto.java
| | `-- CommentController.java
| |-- domain
| | `-- Comment.java
| |-- repository
| | |-- impl
| | | `-- CommentRepositoryCustomImpl.java
| | |-- CommentRepository.java
| | `-- CommentRepositoryCustom.java
| `-- service
| |-- impl
| | `-- CommentServiceImpl.java
| `-- CommentService.java
|-- commentlike
| |-- controller
| | |-- dto
| | | `-- response
| | | `-- CommentLikeDto.java
| | `-- CommentLikeController.java
| |-- domain
| | `-- CommentLike.java
| |-- repository
| | |-- impl
| | | `-- Test.java
| | `-- CommentLikeRepository.java
| `-- service
| |-- impl
| | `-- CommentLikeServiceImpl.java
| `-- CommentLikeService.java
|-- common
| |-- config
| | |-- converter
| | | `-- StringToInstantConverter.java
| | |-- AwsS3Config.java
| | |-- HibernateFilterAspect.java
| | |-- MongoConfig.java
| | |-- QuerydslConfig.java
| | `-- RedisConfig.java
| |-- converter
| | `-- KeywordsConverter.java
| |-- exception
| | `-- GlobalExceptionHandler.java
| |-- filter
| | `-- RequestIdFilter.java
| |-- logging
| | `-- AuditLogger.java
| `-- util
| `-- RequestUserExtractor.java
|-- data
| |-- config
| | `-- Test.java
| `-- storage
| `-- Test.java
|-- interest
| |-- controller
| | |-- dto
| | | |-- request
| | | | |-- InterestRegisterRequest.java
| | | | `-- InterestUpdateRequest.java
| | | `-- response
| | | |-- CursorPageResponseInterestDto.java
| | | `-- InterestDto.java
| | `-- InterestController.java
| |-- domain
| | `-- Interest.java
| |-- repository
| | |-- impl
| | | `-- InterestRepositoryCustom.java
| | `-- InterestRepository.java
| `-- service
| |-- impl
| | `-- InterestServiceImpl.java
| `-- InterestService.java
|-- notification
| |-- controller
| | |-- dto
| | | `-- response
| | | |-- BulkConfirmResultDto.java
| | | |-- CursorPageResponseNotificationDto.java
| | | |-- NotificationConfirmResponseDto.java
| | | `-- NotificationDto.java
| | `-- NotificationController.java
| |-- domain
| | |-- Notification.java
| | `-- NotificationResourceType.java
| |-- repository
| | |-- impl
| | | `-- NotificationRepositoryImpl.java
| | |-- NotificationRepository.java
| | `-- NotificationRepositoryCustom.java
| |-- scheduler
| | `-- NotificationCleanupScheduler.java
| `-- service
| `-- NotificationService.java
|-- subscription
| |-- controller
| | |-- dto
| | | `-- response
| | | `-- SubscriptionDto.java
| | `-- SubscriptionController.java
| |-- domain
| | `-- Subscription.java
| |-- repository
| | |-- impl
| | | `-- Test.java
| | `-- SubscriptionRepository.java
| `-- service
| |-- impl
| | `-- SubscriptionServiceImpl.java
| `-- SubscriptionService.java
`-- user
|-- controller
| |-- dto
| | |-- data
| | | `-- UserDto.java
| | `-- request
| | |-- UserLoginRequest.java
| | |-- UserRegisterRequest.java
| | `-- UserUpdateRequest.java
| `-- UserController.java
|-- domain
| |-- User.java
| `-- UserRole.java
|-- repository
| `-- UserRepository.java
`-- service
|-- UserService.java
`-- UserServiceImpl.java