Teamflix 프로젝트

YEON·2022년 3월 30일
1

Teamflix 프로젝트

목록 보기
1/7
post-thumbnail

✨ Introduction

영화 시리즈 스트리밍을 위한 구독 서비스 REST API (Server)
참여 인원 : 서버 2명 / 프론트엔드 1명



Skill/Stack

Java  Spring Framework  Spring Boot  JUnit 

MySQL  Nginx  AWS  Git/GitHub 



📚 Architecture

📍 프로젝트 기술 스택 적용 과정과 선택 이유에 대한 설명은 포스팅 참조



⚙️ ERD 설계

final_Netflix



📝 기능 목록

넷플릭스 기능 목록

계정(Account)

  • 생성
    • 회원 가입 단계 조회
    • 회원 등록
    • 이메일 인증
    • 결제수단 등록
  • 변경
    • 이메일, 비밀번호, 휴대폰번호, 멤버쉽 (개별 페이지 존재)
  • 탈퇴
  • 전체 회원 조회 또는 membership으로 검색 조회
  • 회원 조회
  • 로그인
    • Jwt 로그인
    • 소셜 로그인 (네이버, 카카오, 구글, 라인)
  • 로그아웃
  • 비밀번호 찾기
    • 문자 보내기
    • SMS 인증

프로필(Profile)

  • 생성(1계정당 5개 가능)
  • 변경
    • 전체 변경 (언어,이름,자동재생설정)
    • 사진 변경
  • 삭제
  • 회원 개별,목록 조회

비디오(Video)

  • 콘텐츠 목록 조회
    • TOP 10 콘텐츠 목록 조회
    • 내가 찜한 콘텐츠 목록 조회
    • 인기 콘텐츠 목록 조회
    • 신규 콘텐츠 목록 조회
    • 시청중인 콘텐츠 목록 조회
    • 장르별 콘텐츠 목록 조회
    • 출연자가 참여한 콘텐츠 목록 조회 (출연자 이름 클릭)
    • 감독이 참여한 콘텐츠 목록 조회 (출연자 이름 클릭)
    • 특징별 작품 목록 조회 (영화/시리즈 특징 클릭)
    • 장르별 수상작 컨텐츠 조회 (영화/시리즈 모두)
    • 최다 검색 컨텐츠 조회 (영화/시리즈 모두)
  • 장르 대분류 목록 조회 (영화, 시리즈 내부 기능)
  • 하나의 영화 또는 시리즈의 방영분 (회차)목록 조회
  • 상세정보 조회(작품정보, 해당 작품에 속한 모든 출연자, 장르, 특징, 총망라 조회)
  • 작품의 출연자 조회 (출연자 이름 클릭)
  • 작품의 특징 조회 (영화/시리즈 특징 클릭)
  • 상세페이지 첫화면 동영상 재생시 정보 조회

영상 시청을 위한 정보(Play)

  • 생성, 변경, 조회

검색(Search)

  • 검색(제목/사람/장르) 콘텐츠 목록 조회

북마크(Bookmark)

  • 생성, 변경, 조회

좋아요(Assessment)

  • 생성, 변경, 조회

알림(Alarm)

  • 생성, 변경, 조회

기타(ETC)

  • 성인인증 필요 여부 검증 조회


📝 API 명세서

Spring Rest Docs 반영 예정입니다

RESTful API 문서도구로 Swagger 와 Spring REST Docs 중에서 Spring Rest Docs 를 선택한 이유
Rest DocsSwagger
테스트가 성공해야 문서작성된다.API 를 테스트 해 볼수 있는 화면을 제공한다.
버전 변화에 유연하고 정확성이 높다.버전 변화에 맞춰 재 작성이 필요하다.
적용하기 어렵다적용하기 쉽다


📂 Directory Structure

Directory Structure
netflix-server
└─src
    ├─main
    │  ├─java
    │  │  └─com
    │  │    └─example
    │  │        └─demo
    │  │          │  DemoApplication.java
    │  │          │
    │  │          ├─config
    │  │          │  │  BaseException.java
    │  │          │  │  BaseResponse.java
    │  │          │  │  BaseResponseStatus.java
    │  │          │  │  Constant.java
    │  │          │  │
    │  │          │  └─secret
    │  │          │          Secret.java
    │  │          │
    │  │          ├─src
    │  │          │  │  WebSecurityConfig.java
    │  │          │  │
    │  │          │  ├─account
    │  │          │  │  │  AccountController.java
    │  │          │  │  │  AccountDao.java
    │  │          │  │  │  AccountProvider.java
    │  │          │  │  │  AccountService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          Account.java
    │  │          │  │          PatchAccountReq.java
    │  │          │  │          PatchPasswordReq.java
    │  │          │  │          PostAccountRes.java
    │  │          │  │          PostLoginReq.java
    │  │          │  │
    │  │          │  ├─alarm
    │  │          │  │  │  AlarmController.java
    │  │          │  │  │  AlarmDao.java
    │  │          │  │  │  AlarmProvider.java
    │  │          │  │  │  AlarmService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          Alarm.java
    │  │          │  │          GetAlarmRes.java
    │  │          │  │          SetAlarmReq.java
    │  │          │  │
    │  │          │  ├─assessment
    │  │          │  │  │  AssessmentController.java
    │  │          │  │  │  AssessmentDao.java
    │  │          │  │  │  AssessmentProvider.java
    │  │          │  │  │  AssessmentService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          Assessment.java
    │  │          │  │
    │  │          │  ├─bookmark
    │  │          │  │  │  BookmarkController.java
    │  │          │  │  │  BookmarkDao.java
    │  │          │  │  │  BookmarkProvider.java
    │  │          │  │  │  BookmarkService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          Bookmark.java
    │  │          │  │          BookmarkReq.java
    │  │          │  │          GetBookmarkRes.java
    │  │          │  │          PatchBookmarkReq.java
    │  │          │  │
    │  │          │  ├─category
    │  │          │  │  │  CategoryController.java
    │  │          │  │  │  CategoryService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          MainCategory.java
    │  │          │  │
    │  │          │  ├─character
    │  │          │  │  │  CharacterDao.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          Character.java
    │  │          │  │
    │  │          │  ├─email
    │  │          │  │  │  EmailController.java
    │  │          │  │  │  EmailService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          EmailDto.java
    │  │          │  │          EmailNotificationReqDto.java
    │  │          │  │          VerificationReqDto.java
    │  │          │  │
    │  │          │  ├─genre
    │  │          │  │  │  GenreController.java
    │  │          │  │  │  GenreDao.java
    │  │          │  │  │  GenreProvider.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          Genre.java
    │  │          │  │
    │  │          │  ├─googleAccount
    │  │          │  │  │  ConfigUtils.java
    │  │          │  │  │  GoogleAccountController.java
    │  │          │  │  │  GoogleAccountDao.java
    │  │          │  │  │  GoogleAccountProvider.java
    │  │          │  │  │  GoogleAccountService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          GoogleAccount.java
    │  │          │  │
    │  │          │  ├─kakaoAccount
    │  │          │  │  │  KakaoAccountController.java
    │  │          │  │  │  KakaoAccountDao.java
    │  │          │  │  │  KakaoAccountService.java
    │  │          │  │  │  KakaoOAuth.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          KakaoAccount.java
    │  │          │  │          PostKakaoAccount.java
    │  │          │  │
    │  │          │  ├─lineAccount
    │  │          │  │  │  LineAccountController.java
    │  │          │  │  │  LineAccountDao.java
    │  │          │  │  │  LineAccountProvider.java
    │  │          │  │  │  LineAccountService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          LineAccount.java
    │  │          │  │
    │  │          │  ├─naverAccount
    │  │          │  │  │  NaverAccountController.java
    │  │          │  │  │  NaverAccountDao.java
    │  │          │  │  │  NaverAccountProvider.java
    │  │          │  │  │  NaverAccountService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          NaverAccount.java
    │  │          │  │
    │  │          │  ├─profile
    │  │          │  │  │  ProfileController.java
    │  │          │  │  │  ProfileDao.java
    │  │          │  │  │  ProfileProvider.java
    │  │          │  │  │  ProfileService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          PatchProfileReq.java
    │  │          │  │          PostProfileReq.java
    │  │          │  │          PostProfileRes.java
    │  │          │  │          Profile.java
    │  │          │  │
    │  │          │  ├─profilePhoto
    │  │          │  │  │  ProfilePhotoController.java
    │  │          │  │  │  ProfilePhotoDao.java
    │  │          │  │  │  ProfilePhotoProvider.java
    │  │          │  │  │  ProfilePhotoService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          GetProfilePhotoRes.java
    │  │          │  │          PatchProfilePhotoReq.java
    │  │          │  │          ProfilePhoto.java
    │  │          │  │
    │  │          │  ├─search
    │  │          │  │  │  SearchDao.java
    │  │          │  │  │  SearchProvider.java
    │  │          │  │  │  SearchService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          Search.java
    │  │          │  │
    │  │          │  ├─sms
    │  │          │  │  │  SmsController.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          MessagesReqDto.java
    │  │          │  │          SendSmsResDto.java
    │  │          │  │          SendVerificationNumberResDto.java
    │  │          │  │          SmsRequest.java
    │  │          │  │          SmsRequestDto.java
    │  │          │  │          VerificationReqDto.java
    │  │          │  │
    │  │          │  ├─test
    │  │          │  │      TestController.java
    │  │          │  │
    │  │          │  ├─video
    │  │          │  │  │  VideoController.java
    │  │          │  │  │  VideoDao.java
    │  │          │  │  │  VideoProvider.java
    │  │          │  │  │  VideoService.java
    │  │          │  │  │
    │  │          │  │  └─domain
    │  │          │  │          GetVideoRes.java
    │  │          │  │          Video.java
    │  │          │  │          VideoContent.java
    │  │          │  │          VideoDetail.java
    │  │          │  │
    │  │          │  └─videoPlay
    │  │          │      │  VideoPlayController.java
    │  │          │      │  VideoPlayDao.java
    │  │          │      │  VideoPlayProvider.java
    │  │          │      │  VideoPlayService.java
    │  │          │      │
    │  │          │      └─domain
    │  │          │              VideoPlay.java
    │  │          │
    │  │          └─utils
    │  │                AES128.java
    │  │                JwtService.java
    │  │                ValidationRegex.java
    │  │
    │  └─resources
    │          application.yml
    │          logback-spring.xml
    │
    └─test
        └─java
            └─com
                └─example
                    └─demo
                            DemoApplicationTests.java
.gitignore
build.gradle
gradlew
gradlew.bat
README.md
settings.gradle


📹 Postman Test Video

구글 드라이브 POSTMAN SERVER 시연 영상



🗓 프로젝트 협업 과정

1. 프로젝트 마일스톤

  • 개발을 진행하며 프로젝트 마일스톤에 관하여는 Git&GitHub 를 최대한 활용하여 진행하며 애자일 개발 프로세스를 경험할 수 있었습니다.
    Git Pull requests 뿐만 아니라 ISSUE & Projects 를 활용하여 프로젝트 마일스톤을 진행하였습니다.
    ISSUE에서 개발한 API에 관한 이슈들을 정리해놓거나 따로 공부하여 공유하면 좋을 것들을 정리하며 공유할 수 있었습니다.
    또한 Projects를 통해 스프린트를 관리하며 서로 개발하는 진행 상황을 파악하고, PR 통해 코드리뷰를 진행하며 부족한 부분들을 보완하며 프로젝트를 안전하게 진행할 수 있었습니다.

2. 데일리 회고, 위클리 스크럼

  • Discord 를 통해 데일리 회고, 위클리 스크럼를 진행하면서 서버 개발자와의 구현 진행 과정 공유 뿐만 아니라 프론트엔드 개발자와 서로 구현하고자 하는 API 의 이해도를 높이며 소통하고 개발할 수 있었습니다.

3. 개발 일지

  • 개발하는 것에 관하여 매일 개발일지를 작성함으로써, 매일 회의&회고한 것에 대한 기록과 매일 다시한번 상대방이 구현을 진행한 것에 관하여 파악하고 공유할 수 있었습니다.


🔍 잘했던 / 깨달았던 점

  • 짧은 기간동안 목표로 했던 넷플릭스의 기능들 뿐만 아니라 외부 API 등 자체적인 추가 기능들까지 구현을 성공적으로 구현하였다
  • 애자일 프로세스를 차용하여 협업함으로써 개발을 유연하게 진행 및 공유할 수 있었다.
  • 팀원들과 매일 데일리 회고를 진행하며 협업의 소통을 이어나가며 커뮤니케이션의 중요성을 다시 한번 깨달았다.
  • 팀원들과 코드리뷰를 진행하며 안전성있게 개발하고, 부족한 부분들은 함께 채우며 성장할 수 있었다.


🔍 어려웠던 / 아쉬웠던 점

  • TDD 를 끝까지 지키며 개발하지 못하여 Git에 업로드를 못하였다.
  • 팀원과 처음에 조율하지 못하고 Clean Code를 지키지 못해 리팩터링할 것들이 많아졌다.
    이로 인해 다시 한번 클린 코드의 중요성을 깨달았다.
  • Spring Security, Jwt 에 대한 심층적인 학습이 부족하였다


💫 향후 개선해 나아갈 점

  • Clean code (자바 코딩 컨벤션 주의)
  • Jwt를 사용한 로그아웃 리팩토링
  • 소셜 결제 API 적용 (사업자 문제로 사용이 안되는 것이 많아 paypal을 이용해볼 예정)
  • 예외처리문 따로 구현 (Annotation 통한 Validation 처리)
  • JdbcTemplate 대신 ORM 기반의 JPA로 변경 (쿼리문에 따른 유지보수가 불편하여 변경)
  • 쿼리문, 캐싱 기능등을 통한 성능 개선


profile
- 👩🏻‍💻

1개의 댓글

comment-user-thumbnail
2023년 7월 25일

너무 도움됐습니다!!!!
혹시 깃허브 주소 공유가능 하실까요??

답글 달기