๋ค์ด๋ฒ 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