/2023-diggin-room

๐ŸŽต ์‚ฌ์šฉ์ž ํ™œ๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Œ์•…์„ ์ถ”์ฒœํ•˜๋Š” ์ˆํผ ์ปจํ…์ธ  ์„œ๋น„์Šค

Primary LanguageKotlin

Diggin' Room

์‚ฌ์šฉ์ž ํ™œ๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Œ์•…์„ ์ถ”์ฒœํ•˜๋Š” ์ˆํผ ์ปจํ…์ธ  ์„œ๋น„์Šค ๐ŸŽต

Kotlin Android Java Spring MySQL

๊ธฐ๋Šฅ

์Œ์•… ํƒ์ƒ‰

  • ์ƒˆ๋กœ์šด ์Œ์•…์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์•„๋ž˜๋กœ ์Šค์™€์ดํ”„ ํ•ด๋ณด์„ธ์š”!
  • ๋Š๊น€์—†๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ์Šคํฌ๋กค๊ณผ ๋™์˜์ƒ ์žฌ์ƒ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.
    browse-cut.webm

์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์„ธ์ƒ์˜ ๋ชจ๋“  ์žฅ๋ฅด์—์„œ ์ถ”์ฒœ๋˜๋Š” ์Œ์•…์„ ์ฆ๊ฒจ๋ณด์„ธ์š”!

์Šคํฌ๋žฉ

  • ํƒ์ƒ‰ํ•˜๋‹ค ๋ฐœ๊ฒฌํ•œ ์ข‹์€ ์Œ์•…์€ ์Šคํฌ๋žฉํ•ด์„œ ๋‚˜์ค‘์— ๋˜ ๋“ค์–ด๋ณด์„ธ์š”!
    scrap-cut.webm

๋Œ“๊ธ€

  • ๋‹ค๋ฅธ ์นœ๊ตฌ๋“ค๊ณผ ์Œ์•…์— ๋Œ€ํ•œ ์ƒ๊ฐ์„ ๋‚˜๋ˆ ๋ณด์„ธ์š”!

๊ตฌํ˜„

์„œ๋ฒ„

๊ธฐ์ˆ  ์Šคํƒ

  • Spring Boot
  • Spring MVC
  • ORM(Spring Data JPA)
  • MySQL
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ(JUnit 5, RestAssured, Mockito ์‚ฌ์šฉ)
  • ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ ์ ์šฉ, ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• (์ž์ฒด Filter ๋ฐ Logback ์‚ฌ์šฉ)
  • DDL ํ˜•์ƒ ๊ด€๋ฆฌ ๋„๊ตฌ ์ ์šฉ(Flyway)
  • ๋ฐฐํฌ ์ž๋™ํ™” (Github Actions, ํ”„๋กœํŒŒ์ผ ๋ณ„ ์„ค์ • ๋ถ„๋ฆฌ)
  • ์†Œ์…œ ์‚ฌ์šฉ์ž ์ธ์ฆ(OAuth 2.0 OpenID Connect ๋ฐ ์ž์ฒด ๊ตฌ์กฐ ์‚ฌ์šฉ)
  • Salting์ด ์ ์šฉ๋œ DPE(DigginRoom Password Encryption)

์•ˆ๋“œ๋กœ์ด๋“œ

๊ธฐ์ˆ  ์Šคํƒ

  • MVVM
  • AAC ViewModel
  • Repository ํŒจํ„ด
  • UI State
  • Retrofit
  • MockK
  • ์ž์ฒด ์ž๋™ ์˜์กด ์ฃผ์ž…

RoomPager

๋ฌธ์ œ์ 

  • ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ˜์˜์„ ์œ„ํ•œ "์‹ซ์–ด์š”" ์ œ์Šค์ฒ˜๋ฅผ ์œ„ํ•ด 4๋ฐฉํ–ฅ ์Šคํฌ๋กค ์ง€์›์ด ํ•„์š”
  • ๊ธฐ์กด์˜ ScrollView ์ค‘์ฒฉ์œผ๋กœ๋Š” WebView ํ˜ธํ™˜์ด ๋ถˆ๊ฐ€๋Šฅ (WebView์—์„œ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€๋กœ์ฑ”)
  • WebView ์บ์‹ฑ, ๋ทฐ ์žฌํ™œ์šฉ ๋“ฑ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ปค์Šคํ…€ ๋ทฐ๋ฅผ ๋งŒ๋“ค ํ•„์š”์„ฑ ์ œ๊ธฐ

๊ธฐ๋Šฅ

  • 4๋ฐฉํ–ฅ ์Šคํฌ๋กค
  • ๋ถ€๋“œ๋Ÿฌ์šด ํŽ˜์ด์ง•
  • ๋Š๊น€์—†๋Š” ๋™์˜์ƒ ์žฌ์ƒ์„ ์œ„ํ•œ ์ด์ „, ๋‹ค์Œ ์˜์ƒ ๋ฏธ๋ฆฌ ๋กœ๋”ฉ
  • ์ตœ์†Œํ•œ์˜ ๋ทฐ(3๊ฐœ)๋กœ 4๋ฐฉํ–ฅ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ทฐ ์žฌ์‚ฌ์šฉ
  • RecyclerView์™€ ๋™์ผํ•˜๊ฒŒ Adatper์™€ ViewHolder ๊ตฌํ˜„์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ƒˆ๋กœ์šด ๋™์˜์ƒ ๋กœ๋“œ, ์žฌ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ ์ œ๊ณต

LogResult

๋ฌธ์ œ์ 

  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์„ฑ๊ณต๊ณผ ์‹คํŒจ ์ƒํ™ฉ ๋ชจ๋‘ ๋กœ๊ทธ ์ถœ๋ ฅ์ด ํ•„์š”

๊ธฐ๋Šฅ

  • kotlin์˜ Result ํด๋ž˜์Šค์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋กœ๊ทธ๋ฅผ ์ž๋™์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” LogResult ๊ตฌํ˜„
  • logRunCatching ์ „์—ญ ํ•จ์ˆ˜ ์ œ๊ณต
  • ๋กœ๊ทธ๋ฅผ ์—ฌ๋Ÿฌ ์ฑ„๋„์—์„œ ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ๋Š” Logger ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
  • logRunCatching์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  onSuccess, onFailure ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๋“ฑ๋กํ•œ Logger๋“ค์— ์ž๋™์œผ๋กœ ๋กœ๊ทธ ์ถœ๋ ฅ
  • ํ˜„์žฌ ์•ฑ์—๋Š” ์ฝ˜์†”, ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์ฑ„๋„ ๊ตฌํ˜„

ํ…Œ์ŠคํŠธ

  • ViewModel Test
  • Domain Test

ํ™˜๊ฒฝ

  • Kotlin 1.8.20
  • Android Target SDK 33
  • Android Gradle Plugin 8.0.2

ํ˜‘์—…

Git

Github Wiki

  • ํšŒ๊ณ 
  • ํ”„๋กœ์ ํŠธ ์šด์˜ ๋ฐ ๊ณ„ํš
  • ๊ฐœ๋ฐœ ๋ฌธ์„œ

Notion

  • ๋ฐ์ผ๋ฆฌ ๋ฏธํŒ…
  • ํšŒ์˜๋ก
  • ๊ธฐํš
  • ์ž๋ฃŒ
  • ๊ณ ๋ฏผํ•˜๊ธฐ
  • ํŒ€ ์ปจ๋ฒค์…˜

Slack

  • ์„œ๋ฒ„ ์žฅ์•  ์•Œ๋ฆผ
  • ํŒ€ ๋‚ด ๊ณต์ง€

ํŒ€์› & ์—ญํ• 

ํŒ€์› ์—ญํ• 
์ฝ”๊ฑด (๊น€๋„์—ฝ)

์ดˆ๊ธฐ ๊ธฐํš

4๋ฐฉํ–ฅ ๋ทฐ ์žฌ์‚ฌ์šฉ ์Šคํฌ๋กค๋ทฐ RoomPager ๊ฐœ๋ฐœ

Android WebView ์—์„œ Youtube IFrame API๋ฅผ ์ด์šฉํ•œ ์˜์ƒ ์žฌ์ƒ

RoomPager์™€ YoutubePlayer๋ฅผ ์ด์šฉํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์ˆํผ ๊ฒฝํ—˜ ์ œ๊ณต

์šฐ๊ธฐ (๊น€์ง„์šฑ)

๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ

๋ฃธ ์ถ”์ฒœ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž์˜ ์ดˆ๊ธฐ ์žฅ๋ฅด ์ทจํ–ฅ ์„ ํ˜ธ๋„ ์ž…๋ ฅ

์Šคํฌ๋žฉ ๊ธฐ๋Šฅ ๋ฐ ์Šคํฌ๋žฉ๋œ ๋ชฉ๋ก์— ๋Œ€ํ•œ ์œ ํŠœ๋ธŒ ์žฌ์ƒ๋ชฉ๋ก ์ถ”์ถœ

๋ฒ ๋ฆฌ (์šฐํ˜œ๊ฒฝ)

ViewPager2 ๋ฅผ ์ด์šฉํ•œ ์•ฑ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ์ œ๊ณต

์ถ”์ฒœ ์Œ์•…์— ๋Œ€ํ•œ ์ •๋ณด ํ‘œ์‹œ

์›ํ•˜๋Š” ์Œ์•…์„ ์Šคํฌ๋žฉํ•˜๊ณ  ๋Œ“๊ธ€ ๋‹ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

๋•ก์น  (๋ฐ•์„ฑ์ฒ )

์•ˆ์ „ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ์„ ์œ„ํ•ด ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

์•ˆ์ „ํ•œ DDL ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด DDL ๊ฒ€์ฆ ์ž๋™ํ™” ๊ตฌํ˜„

ํ˜‘์—…์šฉ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํฌ๋กฌ ํ™•์žฅ ๊ฐœ๋ฐœ

์ง„์ž…์žฅ๋ฒฝ ๊ฐ์†Œ๋ฅผ ์œ„ํ•ด ๊ฒŒ์ŠคํŠธ ๋กœ๊ทธ์ธ ๋ฐ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„

์ฝฉํ•˜๋‚˜ (์ตœํ•œ๋นˆ)

๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ

๋Œ“๊ธ€ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ

๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํŒŒ์›Œ (์†ก์žฌ๋ฐฑ)

OIDC๋ฅผ ํ™œ์šฉํ•œ ์†Œ์…œ๋กœ๊ทธ์ธ

๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”

์œ ํŠœ๋ธŒ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ถ”์ถœ ๊ธฐ๋Šฅ

Flyway ๋„์ž… ๋ฐ CI

๋ธ”๋ž™์บฃ (์†ก์šฐ์„)

์ปค์„œ ๋ฐฉ์‹ ๋ฌดํ•œ ๋Œ“๊ธ€ ์กฐํšŒ API ๊ตฌํ˜„
๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ๋ฃธ ์ถ”์ฒœ API ๊ตฌํ˜„
๋ฃธ ์Šคํฌ๋žฉ ๋ชฉ๋ก ์กฐํšŒ API ๊ตฌํ˜„
๋ฃธ ์Šคํฌ๋žฉ ์ถ”๊ฐ€ ์‚ญ์ œ API ๊ตฌํ˜„
Flyway๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜