/AfreecaTV

Primary LanguageKotlin

image

๐Ÿ“ฑ ๊ธฐ๋Šฅ ์„ค๋ช…

  • ๋ฐ๋ชจ ์˜์ƒ

Afreeca Thumbnail

๋ฉ”์ธ ํŽ˜์ด์ง€

Home Loading
  • ์นดํ…Œ๊ณ ๋ฆฌ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜จ ์นดํ…Œ๊ณ ๋ฆฌ ์ค‘ 3๊ฐœ ์ด์ƒ์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ์ •ํ•˜์—ฌ ํƒญ์„ ๊ตฌ์„ฑ
  • ๊ฐ ํƒญ ํด๋ฆญ ์‹œ ๊ทธ ์นดํ…Œ๊ณ ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฉ์†ก ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์คŒ
  • ํŽ˜์ด์ง• ๊ธฐ๋Šฅ์œผ๋กœ ๋‹ค์Œ ํŽ˜์ด์ง€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•˜๋‹จ์— ์ถ”๊ฐ€๋œ๋‹ค.
  • ๋ฐฉ์†ก ํด๋ฆญ ์‹œ ํ•ด๋‹น ๋ฐฉ์†ก์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™

์ƒ์„ธ ํŽ˜์ด์ง€

Detail Play
  • ํด๋ฆญํ•œ ํ•ด๋‹น ๋ฐฉ์†ก ์ •๋ณด๋ฅผ ์ƒ์„ธํžˆ ํ™•์ธ ๊ฐ€๋Šฅ
  • ํ•ด๋‹น ํ™”๋ฉด์—์„œ ๋ฐฉ์†ก ์‹œ์ฒญ์ด ๊ฐ€๋Šฅ

๐Ÿ”ฅ ๊ฐœ๋ฐœ ํŠน์ง•

Project Common Ground

  • Multi Module
    • ๋น„๊ต์  ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ„๋‹จํ•œ๋งŒํผ Monolithic ์•ฑ ๊ตฌ์กฐ๊ฐ€ ๋” ๊ฐœ๋ฐœ์— ์žˆ์–ด ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค.
    • ํ•˜์ง€๋งŒ, ์ด๋ฒˆ ๊ธฐํšŒ๋ฅผ ํ†ตํ•ด ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ํ•™์Šต๊ณผ ๋ถ„๋ฆฌ๋œ ๋ชจ๋“ˆ์—์„œ ๊ฐ์ž์˜ ์—ญํ• ์„ ์ถฉ์‹คํžˆ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๋‘๊ณ  ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ๋กœ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • buildSrc + Kotlin DSL
    • Multi Mdoule๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ ๊ทธ๋ž˜๋“ค ๊ด€๋ฆฌ๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.
    • ๊ธฐ์กด์— ํ•˜๋˜ ์Šคํƒ€์ผ๋Œ€๋กœ Groovy๋ฅผ ํ†ตํ•ด ํ•˜๋ ค๋˜ ์ค‘ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ KTS๋ฅผ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
    • Kotlin์ด ๋” ์ต์ˆ™ํ•˜๋˜ ๋‚ด๊ฒ ์ด๋ฅผ ํ†ตํ•ด ๋ฒ„์ „๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋ผ ํŒ๋‹จํ•ด ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • Fragment Transaction
    • Detailํ™”๋ฉด๋„ Fragment๋กœ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฉด์„œ Jetpack navigation ํ™œ์šฉ์„ ์ƒ๊ฐํ–ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ Home ํ™”๋ฉด์—์„œ ๋ฒ—์–ด๋‚˜ Detail ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ ํ›„ Home ํ™”๋ฉด์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๊ฒŒ ๋˜์—ˆ์„ ๋•Œ Home ํ™”๋ฉด์€ ์ด์ „ ์ƒํƒœ๋ฅผ ์žƒ๊ณ  ์ƒˆ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
      • jetpack navigation์„ ํ™œ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ด์ „ ์ƒํƒœ์˜ fragment๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Œ
    • Jetpack Navigation์˜ ํ•œ๊ณ„๋กœ Fragment Transaction์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
  • Test Code
    • Data Module์˜ BroadDataSource๊ฐ€ API ํ˜ธ์ถœ์„ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋งŒํผ ์ค‘์š”ํ•œ ์—ญํ• ์„ ๋งก๊ณ  ์žˆ๊ธฐ์— ํ•ด๋‹น ๋ถ€๋ถ„์— Test Code๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
    • MockWebServer๋ฅผ ํ™œ์šฉํ•ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋กœ์ง์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • UseCase
    • viewmodel์ด Repository๋ฅผ ๊ฐ€์ง€๊ณ  ์ง์ ‘ ์›ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, viewModel์€ ์ž์‹ ์˜ ์—ญํ• ์ด ๋ชจํ˜ธํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
      • viewmodel์€ ๊ฐ ํ™”๋ฉด์˜ data holder์˜ ์—ญํ• ๋กœ ๊ทธ ์—ญํ• ์ด ๋ชจํ˜ธํ•ด์ง€๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
    • ๊ฐ viewmodel์ด ์ž์‹ ์ด ํ•˜๊ณ ์ž ํ•˜๋Š” ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด UseCase๋ฅผ ์ž‘์„ฑํ•ด viewModel์ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

Main Page

  • TabLayout + ViewPager
    • Category List๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜จ ํ›„ ์ž„์˜์˜ 5๊ฐœ์˜ ์นดํ…Œ๊ณ ๋ฆฌ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ํ”„๋ž˜๊ทธ๋จผํŠธ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์ƒ์„ฑํ•œ๋‹ค.
    • ๊ทธ๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ 5๊ฐœ์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” TabLayout๊ณผ ViewPager์˜ ๊ฒฐํ•ฉ์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๊ณ , ํ™”๋ฉด์— ๋„์šธ ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ์— fragment๋ฅผ ํ™”๋ฉด์— ๋„์šธ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์ƒ์„ฑ์ด ๋˜๊ธฐ์— ๋‹ค์†Œ ๋Š๋ฆผ๊ฐ์ด ์žˆ๋‹ค.
      • ํ•ด๋‹น ๋ฌธ์ œ๋Š” HomeFragment๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์ฆ‰ ViewPager๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๊ณ  ๋‚œ ํ›„์— offscreenPageLimit๋ฅผ ์„ค์ •ํ•ด ๋‘์–ด preFetch๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•œ๋‹ค.
  • Paging
    • ํŽ˜์ด์ง• ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Android Jetpack์—์„œ ์ œ๊ณต๋˜๋Š” Paging Library๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • RecyclerView Adapter๋ฅผ PagingDataAdapter๋กœ ๊ตฌํ˜„ํ•˜๊ณ , RecyclerView๊ฐ€ ๋ฐ”๋‹ฅ์— ๋‹ฟ์„ ๋•Œ ์ฆˆ์Œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•Œ์•„์„œ ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์ค€๋‹ค.
    • PagingSource์˜ ์œ„์น˜์— ๋Œ€ํ•œ ๊ณ ์ฐฐ์„ ์ง„ํ–‰ํ–ˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋งํฌ์— ์ •๋ฆฌํ•ด๋‘์—ˆ๋‹ค.
    • ๋‹ค์Œ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํ•˜๋‹จ LinearProgress๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋˜๋Š” ์ƒํ™ฉ์„ ํ‘œ์‹œํ•œ๋‹ค.

Detail Page

  • Fragment๋กœ ๊ตฌํ˜„
    • Home ํ™”๋ฉด๊ณผ ๋งค์šฐ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ์— Activity๋กœ ๊ตฌํ˜„์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ํ™”๋ฉด ์ „ํ™˜์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํ™”๋ฉด๋“ค์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋“ค์„ ์ง์ ‘ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์— Fragment๋ฅผ ์„ ํƒํ–ˆ๋‹ค.
    • ๋ฐฉ์†ก ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ฆญํ•˜๊ณ  ํ™”๋ฉด์ด ์ „ํ™˜๋  ๋•Œ Detail ํ™”๋ฉด์œผ๋กœ ์ž์—ฐ์Šค๋ ˆ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • WebView
    • ํ•ด๋‹น ํ™”๋ฉด์—์„œ ๋ฐฉ์†ก ์ธ๋„ค์ผ์„ ๋ณด์—ฌ์ฃผ๊ณ  ํด๋ฆญ ์‹œ player๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์ƒ๊ฐํ–ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ๋ฐฉ์†ก์„ ํ˜„์žฌ ํ™”๋ฉด์—์„œ ์ง์ ‘ ๋ณด๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜์–ด ์›น๋ทฐ๋ฅผ ํ™œ์šฉํ•ด player๋ฅผ ์ง์ ‘ ๋„์šฐ๊ฒŒ ๋˜์—ˆ๋‹ค.
    • player ๋ชจ๋ฐ”์ผ ๋ฒ„์ „์˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์–ด ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋‹ค์†Œ ํž˜๋“ค์—ˆ๋˜ ์ ์ด ์žˆ์—ˆ๋‹ค.

๐Ÿ“š Specification

Architecture MVVM
Design Pattern Repository Pattern, Delegation Pattern
Jetpack Components DataBinding, Flow, ViewModel, RecyclerView, Lifecycle, ViewPager2, Paging3
Dependency Injection Hilt
Network OkHttp3, Retrofit2, Gson
Unit Test junit, Coroutine, MockWebServer
Asynchronous Processing Coroutine
Third Party Library Coil
Strategy Git Flow
Other Tool Notion, Git Wiki
๐Ÿ’ป Dev Environment Language : Kotlin
minSdk : 23
targetSdk : 31

๐Ÿ“– Docs

๐Ÿ’ก Rule

๐Ÿš€ ์Šคํ”„๋ฆฐํŠธ

๐Ÿง‘โ€๐Ÿ’ป ๊ณ ๋ฏผํ–ˆ๋˜ ๋‚ด์šฉ