[내일배움캠프][TIL] 24.02.05 (월) - 팀 프로젝트(심화) : 프로젝트 논의
1. 팀 프로젝트(심화)
오늘부터 약 2주 동안 심화 과정에서 배운 내용들을 토대로 팀 프로젝트를 진행한다.
이번 프로젝트는 2주라는 시간이 있지만, 중간에 설 연휴가 끼어있어서 준비 기간은 사실상 저번 프로젝트와 거의 비슷하다고 보면 된다. 게다가 내용도 훨씬 어려워서 체감 시간은 저번보다 더 빡빡하게 느낄 수도 있다.
아무
팀 프로젝트 : 미디어 앱
이번 팀 프로젝트 주제는 '미디어 앱'이다.
API를 받아오는 Retrofit을 사용하는 데에 가장 최적의 컨셉이고, 그렇기 때문에 그 미디어 앱에 가장 특화된 유튜브를 API로 받는다.
이번 팀 프로젝트에서 필수적으로 들어가야 하는 사항은 다음과 같다. (굉장히 길다)
- 효율적인 Fragment UI 관리
- 주요 3개의 화면을 효과적으로 관리하고, 사용자에게 최적화된 경험을 제공하기 위해 적절한 Fragment 관리 위젯을 선택하고 구현하세요.
- 먼저 앱의 전체적인 구조와 주요 화면, 그리고 각 화면 간의 관계를 파악해 보세요.
- 다양한 위젯의 장단점과 앱의 요구 사항을 비교하여 최적의 Fragment 관리 위젯을 선택해 구현하세요.
- Navigation Component : Fragment 간의 전환, 데이터 전달, 반환 값 관리 등을 매우 단순화하고 시각적으로 제공
- ViewPager2 : fragment들을 수평 혹은 수직으로 스와이프하여 전환하는 UI 패턴을 구현할 수 있게 해주는 위젯
- BottomNavigationView or TabLayout : 주로 하단 탭 혹은 상단 탭을 통해 여러 Fragment 간의 빠른 전환이 필요할 때 사용다양한 Fragment 관리 위젯들 예시
- Retrofit을 활용한 YouTube API 데이터 연동
- **YouTube Data API v3**를 사용하기 위해 Google Developer Console에서 새로운 프로젝트를 생성하고, YouTube Data API v3 서비스를 활성화하세요.
- 활성화 후, API key값을 받아 안드로이드 앱 내에 안전하게 저장해 사용하세요.
- Retrofit을 활용하여 YouTube API와 앱을 연동하세요.
- YouTube Data API v3를 이용하여 필요한 비디오 정보를 앱 내에서 요청하고 결과를 받아오세요.
- 받아온 비디오 데이터는 앱 내 UI 요소에 동적으로 출력하세요.
- API 호출 과정에서 발생하는 가능한 오류 상황들을 예측하고, 적절한 에러 처리 기법을 구현해보세요.
- 홈 화면 (HomeFragment)
- 사용자에게 YouTube의 현재 인기 및 새로운 콘텐츠를 중점적으로 보여주는 핵심 화면
- Most Popular Videos, Category Videos, Category Channels 목록을 스크롤이 가능한 RecyclerView 형태로 나열하여 출력하세요.
- Most Popular Videos 목록 구현
- YouTube의 현재 Trend 비디오 목록을 출력하세요.
- API 활용: videos 엔드 포인트에 chart=mostPopular 파라미터를 사용하여 최신 인기 비디오 목록을 획득하세요.
- Category Videos 목록
- 비디오 카테고리 조회
- YouTube에서 제공하는 다양한 비디오 카테고리를 조회해보세요.
- API 연동: videoCategories 엔드 포인트를 사용하여 원하는 국가의 비디오 카테고리 목록을 가져와 참조하세요.
- 카테고리 별 비디오 목록 조회
- 특정 카테고리에 속하는 인기 비디오 목록을 조회하세요.
- API 연동: videos 엔드 포인트에 videoCategoryId 파라미터를 활용하여 해당 카테고리의 가장 인기 있는(chart=mostPopular) 비디오 목록을 가져오세요.
- 비디오 카테고리 조회
- Category Channels 목록
- 특정 카테고리에 속하는 비디오의 각 채널들의 정보를 조회해 보세요.
- API 연동: channels 엔드 포인트를 활용하고, id 파라미터에 채널 ID 값을 넣어 해당 채널의 정보를 가져오세요.
- 가져온 채널 정보 중 snippet 부분을 활용하여, 채널의 기본 정보와 대표 이미지를 정확히 표시하십시오. API를 사용할 때 part 파라미터에 snippet 값을 넣어 주어야 해요.
- 비디오 검색 (SearchFragment)
- 사용자가 원하는 비디오를 쉽게 검색하고 결과를 빠르게 확인할 수 있는 기능을 제공
- 상단에는 검색을 위한 **Search EditText**를 배치하고, 그 아래에 검색 결과를 출력할 **RecyclerView**를 배치하세요.
- API 연동: YouTube Data API v3의 search 엔드 포인트를 활용하여, 검색 쿼리 기반으로 비디오 정보를 가져오세요.
- 오류 및 예외 처리: 네트워크 오류, API 호출 제한, 검색 결과 없음 등의 예외 상황을 고려하여 사용자에게 적절한 메시지를 표시합니다.
- 상세 정보 (VideoDetailFragment or VideoDetailAcitvity)
- 각 비디오 아이템 선택시 Detail로 이동하여 선택된 비디오의 상세 정보를 제공하세요.
- "좋아요" 버튼 추가: 비디오 상세 정보 아래에 "좋아요" 버튼을 추가하세요. 사용자가 버튼을 클릭하면 해당 비디오 정보가 내부 (예: Room or SharedPreference)에 저장됩니다.
- My Video 저장: "좋아요"를 누른 비디오 정보는 My Videos에서 조회 가능해야 합니다. 내부(예: Room or SharedPreference)에서 "좋아요"를 누른 비디오 목록을 가져와 출력하세요.
- Detail page 시작과 종료시 특별한 Effect를 추가해 보세요.
- 마이 페이지 (MyVideoFragment)
- 사용자의 개인 정보 및 사용자가 ‘좋아요’를 누른 비디오 목록을 보여주는 기능 제공
- 사용자의 프로필 사진, 이름 등의 개인 정보를 상단에 표시
- ‘좋아요’를 누른 비디오 목록은 **RecyclerView**를 사용해 아래쪽에 목록 형태로 출력하세요.
- "좋아요" 버튼을 통해 추가된 비디오는 내부 (예: Room or SharedPreference)에 저장되어야 하며, **MyVideoFragment**에서는 이 정보를 가져와서 표시하세요.
여기에 선택 구현 사항도 더 있는데 지금 필수 구현 사항만 봐도 굉장히 할 것이 많아보인다.
그렇기 때문에 이번 프로젝트는 그 어느 때보다 팀원 간의 협업이 매우 중요해보인다.
팀 프로젝트 논의
팀 프로젝트에 대한 논의에 앞서, 저번에 받은 피드백을 떠올리자면
- 와이어프레임을 조금 더 자세히 작성하는 것이 좋다
- 역할 분담 또한 세세하게 하는 것이 좋다.
이를 떠올리면서 논의를 진행했다.
1. 프로젝트 컨셉
이번 팀에서는 제목을 먼저 짓지 않고, 어떤 앱을 만들지부터 논의했다.
- 취침용 유튜브 앱
- 아시안컵을 하니까 축구관련 유튜브 앱
- 동물만 볼 수 있는 힐링 유튜브 앱
- 뮤직비디오 유튜브 앱
- 이걸 굳이 컨셉을 하나만 잡지 말고, 하나씩 만들자.
그리고 여기서 우리 팀은 '동물만 볼 수 있는 힐링 유튜브 앱'으로 컨셉을 잡았다.
어떻게 보면 굉장히 협소한 범위일 수도 있지만, 동물 내에서도 포유류, 조류, 파충류 등으로 나눌 수 있으니까. (여차하면 고수달을….)
이렇게 컨셉을 잡고나서, 어떤 기능들을 넣으면 좋을지에 대해서도 이야기를 나눴다.
- 홈 화면의 추천 영상은 좌우로 스크롤(HorizontalScrollView), 전체 영상은 위아래로 스크롤
- 카테고리를 클릭하면 클릭된 카테고리의 색상이 변하고, 그 카테고리에 해당하는 영상을 보여줌
- 상세 정보에서 메모를 남길 수 있는 기능 → Playlist를 추가하는 형식으로 해도 되지 않을까 싶음
- 상세 정보에 들어가고 나갈 때 특수한 Effect 추가
여기에 디자인 또한
- 다양한 색깔을 예시로 만들어서 하나 뽑기
- 기능을 어디다가 배치 할건지에 회의
- 좋아요 기능 버튼을 발바닥으로 표현
이렇게 회의가 진행되었다.
컨셉을 한 번 잡으니까 제목짓는 거는 술술 나왔다.
힐링하면 냥이 발바닥 꾹꾹이고, 거기에 착안해서 '꾹꾹튜브'로 이름지었다.
2. 와이어프레임
이번에는 이것만 보고도 어떤 기능을 넣을지 한눈에 알기 위해서 와이어프레임을 자세하게 표현했다.
다만, 내가 생각하기에 여기에 각 팀원들이 어떤 역할을 맡을지 적는 것도 괜찮아 보인다.
3. 역할분담
이번에는 양도 양이기도 하고, 중간에 설날도 끼어 있어서 어떤 식으로 역할을 나눌지에 대해서도 의견이 분분했는데 우선은 저 중에서 공통적인 부분이 'BottomNavigationView', 'RecyclerView', 그리고 'Retrofit'이므로 우선 이 부분부터 해결하기로 결정했다.
그리고 내가 오늘 맡은 역할은 바로…!
Git 이었다. (…어?)
예전에 git clone에 한 번 데이고나서 새로운 프로젝트를 만들기 전에 git clone으로 받는 걸 중요하게 생각했는데 오늘은 내가 그 초기 파일을 만드는 역할을 진행했다.
원래 이거는 다른 팀원들이 도맡아서 했었는데 이번에는 내가 이걸 처음 하다보니 gitignore를 어떻게 작성하는지부터 잔실수도 꽤 많이 했지만, 어찌어찌하여 초기 파일을 올리는 데에 성공했다.
다만, dev 브랜치를 따로 만들고, 거기에 pull request를 '요청' 받아서 검토 후에 'merge'를 하는 식으로 설정을 했어야 했는데(자연 그 동안에 main 브랜치는 push 자체를 하지 못하게) 그걸 아직 설정하지 않아서 중간에 main 브랜치에 push를 한 팀원도 있었다. 물론 아직은 초기라서 크게 티가 나지는 않았지만 중후반부에 이런 실수가 나왔으면 굉장히 아찔할 뻔했다. (이거 덕분에 브랜치를 세팅하는 법도 알게됐다….)
4. 컨벤션
이번에도 코딩 컨벤션과 git 컨벤션을 진행했는데 저번과 크게 달라진 점은 없었다.
코딩 컨벤션의 경우, Ctr+Alt+L을 사용하는 습관을 가지기로 하고
git 컨벤션의 경우
Feat : 새로운 기능 추가 |
Fix : 버그 수정 |
Merge : Merge, pull 전용 |
Refactor: 코드 리펙토링 |
Design : xml 등 사용자 UI 디자인 변경 |
Init : 프로젝트 초기생성 |
Rename : 파일 혹은 폴더명을 수정하거나 옮기는 경우 |
Remove : 파일을 삭제하는 작업만 수행한 경우 |
Commit을 할 때 다음처럼 메시지를 남기기로 했다.
이렇게 기본적인 논의는 거의 끝마쳤다.
내일부터는 본격적으로 앱 개발에 착수할 예정이다.