SWYP Web 10기 프로젝트 3팀
기획 및 개발 기간 : 2025.6.30 ~ 25.8.10 유지보수 및 고도화 : 25.8.14 ~ 25.8.31
INDEX는 사용자가 책을 읽으며 느낀 감정을 중심으로 기록하고 공유할 수 있는 감정 기반 독서 기록 서비스입니다. 단순히 책을 저장하는 데 그치지 않고, 읽는 과정에서의 감정과 생각을 함께 남길 수 있도록 설계되었습니다.
내가 읽은 책들을 보기 좋게 정리하고 관리할 수 있습니다.
책을 읽으면서 느낀 감정을 기록하고, 기억을 더욱 풍부하게 보존할 수 있습니다.
다른 사람들이 같은 책을 읽으며 어떤 감정을 주로 느꼈는지 살펴보고 인사이트를 얻을 수 있습니다.
아직 읽어보지 못한 책은 추천 시스템을 통해 새로운 독서를 이어갈 수 있습니다.
INDEX는 책과 감정이 함께 기록되는 공간을 목표로, 개인의 독서 여정을 시각화하고 공유할 수 있도록 돕습니다.
이메일 및 소셜 로그인(카카오/네이버/구글)으로 간편하게 가입 및 로그인할 수 있습니다.
도서명, 저자, 감정을 기반으로 원하는 책을 검색할 수 있습니다.
읽는 중/다 읽음 상태로 인덱스를 남기고, 수정·삭제할 수 있습니다.
독서 기록을 바탕으로 리포트와 달력을 확인할 수 있으며, 맞춤형 추천 도서도 제공합니다.
| Framework |
|
| Language |
|
| Configuration |
|
| Database |
|
| Data Access |
|
| Security |
|
| Build Tool |
|
| Deployment |
|
| CI/CD |
|
| 협업 도구 |
|
📦SWYP-BACKEND
📦 Index_Project
├── build.gradle
├── Dockerfile
└── src
└── main
├── java
│ └── com/swyp/index
│ ├── domain
│ │ ├── book
│ │ │ ├── Book.java
│ │ │ ├── BookInfo.java
│ │ │ └── BookStats.java
│ │ ├── bookshelf
│ │ │ ├── Bookshelf.java
│ │ │ ├── PageRecord.java
│ │ │ ├── ReadingStatus.java
│ │ │ ├── RecordCreatedEvent.java
│ │ │ ├── RecordDeletedEvent.java
│ │ │ ├── RecordEmotion.java
│ │ │ └── RecordUpdatedEvent.java
│ │ ├── emotion
│ │ │ ├── Emotion.java
│ │ │ ├── EmotionCategory.java
│ │ │ └── EmotionType.java
│ │ ├── user
│ │ │ ├── GoogleUserInfo.java
│ │ │ ├── KakaoUserInfo.java
│ │ │ ├── NaverUserInfo.java
│ │ │ ├── OAuth2UserInfo.java
│ │ │ ├── Provider.java
│ │ │ └── User.java
│ │ └── wishlist
│ │ └── Wishlist.java
│
│ ├── application
│ │ ├── book
│ │ │ ├── BookCommandService.java
│ │ │ ├── BookFacade.java
│ │ │ ├── BookQueryService.java
│ │ │ └── BookStatsEventListener.java
│ │ ├── bookshelf
│ │ │ ├── BookRecommendService.java
│ │ │ ├── BookshelfService.java
│ │ │ ├── ReadingFinishService.java
│ │ │ ├── ReadingStartService.java
│ │ │ └── RecordService.java
│ │ ├── report
│ │ │ ├── CalendarService.java
│ │ │ ├── EmotionAnalysisService.java
│ │ │ ├── ReadingReportService.java
│ │ │ └── StatsService.java
│ │ ├── user
│ │ │ ├── AuthService.java
│ │ │ ├── CustomOAuth2UserService.java
│ │ │ ├── CustomUserDetailsService.java
│ │ │ ├── SmtpMailService.java
│ │ │ ├── TokenService.java
│ │ │ └── UserService.java
│ │ └── wishlist
│ │ └── WishlistService.java
│
│ ├── infrastructure
│ │ ├── api
│ │ │ ├── AladinApiClient.java
│ │ │ ├── AladinSearchResponse.java
│ │ │ └── WebClientConfig.java
│ │ ├── redis
│ │ │ ├── RedisConfig.java
│ │ │ └── SearchCacheAdapter.java
│ │ └── repository
│ │ ├── BookRepository.java
│ │ ├── BookshelfRepository.java
│ │ ├── EmotionRepository.java
│ │ ├── PageRecordRepository.java
│ │ ├── RecordEmotionRepository.java
│ │ ├── UserEmotionStatProjection.java
│ │ ├── UserRepository.java
│ │ └── WishlistRepository.java
│
│ ├── presentation
│ │ ├── api
│ │ │ ├── book
│ │ │ │ └── BookApi.java
│ │ │ ├── bookshelf
│ │ │ │ ├── BookRecommendApi.java
│ │ │ │ ├── BookShelfApi.java
│ │ │ │ ├── DeskApi.java
│ │ │ │ ├── ReadingFinishApi.java
│ │ │ │ └── ReadingStartApi.java
│ │ │ ├── record
│ │ │ │ └── RecordApi.java
│ │ │ ├── report
│ │ │ │ ├── CalendarApi.java
│ │ │ │ ├── ReadingReportApi.java
│ │ │ │ └── StatsApi.java
│ │ │ ├── user
│ │ │ │ ├── AuthApi.java
│ │ │ │ └── UserApi.java
│ │ │ └── wishlist
│ │ │ └── WishlistApi.java
│ │ └── dto
│ │ ├── book
│ │ │ ├── BookDto.java
│ │ │ ├── BookInfoDto.java
│ │ │ ├── BookSearchResponse.java
│ │ │ ├── StatusResponse.java
│ │ │ └── UserBookEmotionStatDto.java
│ │ ├── bookshelf
│ │ │ ├── BookshelfCreateRequest.java
│ │ │ ├── BookshelfResponse.java
│ │ │ ├── BookshelfSummaryDto.java
│ │ │ └── RecommendedBookDto.java
│ │ ├── record
│ │ │ ├── CompletionRecordCreateRequest.java
│ │ │ ├── CompletionRecordResponse.java
│ │ │ ├── CompletionRecordUpdateRequest.java
│ │ │ ├── EmotionDto.java
│ │ │ ├── PageRecordCreateRequest.java
│ │ │ ├── PageRecordResponse.java
│ │ │ ├── PageRecordUpdateRequest.java
│ │ │ └── UnifiedRecordResponse.java
│ │ ├── report
│ │ │ ├── BookActivityDto.java
│ │ │ ├── DailyActivityDto.java
│ │ │ ├── EmotionRankingResponse.java
│ │ │ ├── MonthlyReadingStatsDto.java
│ │ │ └── ReadingReportResponse.java
│ │ ├── user
│ │ │ ├── EmailRequest.java
│ │ │ ├── EmailVerificationRequest.java
│ │ │ ├── LoginRequest.java
│ │ │ ├── LoginResponse.java
│ │ │ ├── SignUpRequest.java
│ │ │ ├── UserInfoResponse.java
│ │ │ └── UserResponse.java
│ │ └── wishlist
│ │ ├── WishlistRequest.java
│ │ └── WishlistResponseDto.java
│
│ └── global
│ ├── common
│ │ └── CookieUtil.java
│ ├── config
│ │ ├── JacksonConfig.java
│ │ ├── OpenApiConfig.java
│ │ ├── SecurityConfig.java
│ │ └── WebConfig.java
│ ├── exception
│ │ ├── CustomAuthenticationEntryPoint.java
│ │ ├── CustomException.java
│ │ ├── ErrorCode.java
│ │ ├── ErrorResponse.java
│ │ └── GlobalExceptionHandler.java
│ └── security
│ ├── CustomPrincipal.java
│ ├── JwtAuthenticationFilter.java
│ ├── JwtProvider.java
│ └── OAuth2SuccessHandler.java
│
└── resources
├── application.yml
└── data.sql
- 개발자가 GitHub에 코드를 Push합니다.
- GitHub Actions가 이를 감지하여 Gradle 빌드, Docker 이미지 빌드 및 테스트를 자동 수행합니다.
- 빌드가 성공하면, 생성된 Docker 이미지를 Docker Hub에 Push합니다.
- EC2 인스턴스에서 Docker Hub의 최신 이미지를 Pull하여 애플리케이션을 실행합니다.
- 사용자의 요청은 프론트엔드가 배포된 Vercel을 통해 EC2 인스턴스로 전달됩니다.
- Nginx가 Reverse Proxy 역할을 수행하며 요청을 Spring Boot 애플리케이션으로 라우팅합니다.
- Spring Boot 애플리케이션은 Redis를 캐시로 사용하고, Amazon RDS (MySQL) 에 데이터를 영속화합니다.
- Prometheus와 Grafana를 통해 애플리케이션의 상태를 모니터링합니다.
API 명세서는 Swagger UI를 통해 확인하고 직접 테스트해볼 수 있습니다.
➡️ INDEX API 문서 바로가기 (Swagger)
| PM | UX/UI | UX/UI | FE |
|---|---|---|---|
![]() |
![]() |
||
| 정환욱 | 정다희 | 채준병 | 김민희 |
| 일정 관리 및 회의 진행 문서화 |
디자인 시스템 UI/UX 디자인 |
디자인 시스템 UI/UX 디자인 |
로그인 및 회원가입 (소셜 로그인) 검색 기능 도서 상세 페이지 |
| FE | BE | BE | BE |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 최성령 | 나현오 | 박영찬 | 이동주 |
| 메인 페이지 인덱스 CRUD 독서 리포트 페이지 |
책상/책장 API 감정 랭킹, 내 독서 API 추천 도서 API Swagger API 문서화 |
로컬 로그인/로그아웃 (Spring Security) 독서 상태 관리 (CRUD) 도서 찜, 독서 캘린더, 월별 독서 통계 기능 Swagger API 문서화 |
DB 설계 및 연동 도서 검색 API 도서 상세 API |











