- JWT 기반 사용자 인증
- 콘텐츠를 조회, 구매, 삭제 및 콘텐츠 이벤트 기간 등록을 통한 무료/유료 전환
- 조회 수 및 구매 수에 따른 인기 콘텐츠 조회 Pagination 처리
- 비동기 이벤트 처리 : 대용량 트래픽을 고려하여 콘텐츠 조회 이력 저장 및 삭제
- Java 17
- SpringBoot 3.3.4
- SpringDataJPA
- SpringSecurity
- JUnit
- Swagger
- H2 DB
./gradlew bootRunURL : http://localhost:8080/swagger-ui/index.html
POST /api/auth/signup: 사용자 회원가입GET /api/auth/signin: 사용자 로그인, JWT 토큰 반환
POST /api/content/: 콘텐츠 등록GET /api/content/{contentId}: 콘텐츠 정보 조회 및 비동기 이벤트 기반으로 조회 내역 저장DELETE /api/content/{contentId}: 콘텐츠 삭제(인증된 사용자만 가능), 비동기 이벤트 기반으로 조회 이력도 함께 삭제POST /api/content/event: 콘텐츠 이벤트 등록(인증된 사용자만 가능)GET /api/content/{contentId}/history: 콘텐츠별 조회한 사용자 및 조회일자 히스토리 조회GET /api/contentview/top: 조회수를 기준으로 인기 콘텐츠 조회 및 Pagination 제공
POST /api/purchase: 이벤트 기간에 해당하는 경우 무료, 해당하지 않는 경우 유료로 콘텐츠 구매 (인증된 사용자만 가능)GET /api/purchase/top: 구매수를 기준으로 인기 콘텐츠 조회 및 Pagination 제공
-
옵저버 패턴 사용 : 이벤트 처리 로직이 다른 시스템 컴포넌트와 독립적으로 동작하도록 결합도를 낮추고 응집도를 높임으로써 유지 보수을 향상시켰습니다.
-
비동기 처리 : 콘텐츠 조회/삭제가 발생할 때 즉시 조회 내역을 저장/삭제하는 대신, 이벤트를 발생시키고 해당 이벤트를 비동기로 처리함으로써 사용자는 콘텐츠를 빠르게 조회하고, 서비스의 응답 시간을 줄여 성능을 향상시켰습니다.
- 콘텐츠 조회 내역 도메인 특성상 매우 자주 추가되거나 대용량으로 축적되는 케이스를 고려하여 이벤트 기반 연관관계를 생략하고 비동기 처리를 통해 조회 내역을 독립적으로 관리함으로써 성능 최적화하였습니다.
- 이벤트 기반 비동기 처리(예: Kafka, RabbitMQ)를 이용해 별도의 통계 시스템에서 조회 내역을 처리에 용이
- 인기 순위 작품 10개 사이즈 고정 조회 아닌, size 와 page 요청 파라미터를 추가 및 Pageable을 활용한 Pagination 기능을 구현하여 인기 작품 조회 API의 확장성을 높였습니다.
- 객체의 불변성 유지 : 객체가 생성된 이후에는 상태를 변경할 수 없도록 Setter 를 생략하고 빌더 패턴을 활용하여 작업의 영향도를 최소화하였습니다.