Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

213 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Hackathon - ์Œ์‹ ์กฐํ•ฉ ๊ณต์œ  ์•ฑ

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ์ž์‹ ๋งŒ์˜ ์กฐํ•ฉ(๋ ˆ์‹œํ”ผ)์„ ๋“ฑ๋กํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š”
Android ๊ธฐ๋ฐ˜ ์กฐํ•ฉ ๊ณต์œ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.

์‚ฌ์šฉ์ž๋Š” ์กฐํ•ฉ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
๋งˆ์Œ์— ๋“œ๋Š” ์กฐํ•ฉ์— ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์ง์ ‘ ์ƒˆ๋กœ์šด ์กฐํ•ฉ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ ๋งˆ์ด ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ์ž‘์„ฑํ•œ ์กฐํ•ฉ๊ณผ ์ข‹์•„์š”ํ•œ ์กฐํ•ฉ์„ ํ•œ๋ˆˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ฑ ์ฃผ์š” ๊ธฐ๋Šฅ

  • โœ… ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ: ์ผ๋ฐ˜ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๋ฐ ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ
  • โœ… ํ™ˆ ํ™”๋ฉด: ์กฐํ•ฉ ๋ชฉ๋ก ์กฐํšŒ, ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ, ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
  • โœ… ์กฐํ•ฉ ์ƒ์„ธ: ์กฐํ•ฉ ์ƒ์„ธ ์ •๋ณด ๋ณด๊ธฐ, ์ข‹์•„์š” ๊ธฐ๋Šฅ
  • โœ… ์กฐํ•ฉ ๋“ฑ๋ก: ์ƒˆ ์กฐํ•ฉ ๋“ฑ๋ก (์ด๋ฏธ์ง€, ์ œ๋ชฉ, ์žฌ๋ฃŒ, ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•)
  • โœ… ๋งˆ์ด ํŽ˜์ด์ง€: ๋‚˜์˜ ๋ ˆ์‹œํ”ผ, ์ข‹์•„์š”ํ•œ ์กฐํ•ฉ ๋ชจ์•„ ๋ณด๊ธฐ ๊ธฐ๋Šฅ

์„œ๋น„์Šค ๊ธฐ๋Šฅ๋ณ„ ์ฝ”๋“œ ์„ค๋ช…

1๏ธโƒฃ ๋กœ๊ทธ์ธ / ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ

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

  • ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž…
  • ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๊ด€๋ฆฌ
  • ๋กœ๊ทธ์•„์›ƒ ๋ฐ ์ธ์ฆ ์ƒํƒœ ์ดˆ๊ธฐํ™”

๐Ÿ“‚ ์ฝ”๋“œ ์œ„์น˜

UI

  • presentation/screen/auth/LoginScreen.kt
  • presentation/screen/auth/RegistrationScreen.kt
  • presentation/screen/auth/RegistrationSuccessScreen.kt

ViewModel

  • presentation/viewmodel/LoginViewModel.kt
  • presentation/viewmodel/RegistrationViewModel.kt

Repository

  • domain/repository/AuthRepository.kt
  • data/repositoryimpl/AuthRepositoryImpl.kt

Network / Data

  • data/service/AuthService.kt
  • data/dto/request/LoginRequest.kt
  • data/dto/request/SignupRequest.kt
  • data/dto/response/LoginResponse.kt
  • data/local/TokenManager.kt
  • data/network/AuthInterceptor.kt

โœ๏ธ ์ฃผ์š” ์ฝ”๋“œ ์„ค๋ช…

  • ์ธ์ฆ ๋กœ์ง์„ Repository๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ UI์™€ ๋ถ„๋ฆฌ
  • Interceptor๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์š”์ฒญ์— ํ† ํฐ ์ž๋™ ์‚ฝ์ž…
  • TokenManager๋กœ ๋กœ๊ทธ์ธ ์ƒํƒœ ์ผ๊ด€์„ฑ ์œ ์ง€

๐Ÿ”‘ AuthInterceptor (์ธ์ฆ ์ธํ„ฐ์…‰ํ„ฐ)

AuthInterceptor๋Š” ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋Œ€ํ•ด
Access Token์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ธ์ฆ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

  • ์ธ์ฆ์ด ํ•„์š”ํ•œ API ์š”์ฒญ์— Authorization: Bearer <token> ํ—ค๋” ์ž๋™ ์‚ฝ์ž…
  • ๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž… / ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ์€ ์ธ์ฆ ์—†์ด ํ†ต๊ณผ
  • UI๋‚˜ Repository์—์„œ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ์ง์ ‘ ํ•˜์ง€ ์•Š๋„๋ก ๋ถ„๋ฆฌ
  1. ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์ „์†ก๋˜๊ธฐ ์ „ Interceptor๋ฅผ ๊ฑฐ์นจ
  2. ์š”์ฒญ URL์„ ๊ธฐ์ค€์œผ๋กœ ์ธ์ฆ ํ•„์š” ์—ฌ๋ถ€ ํŒ๋‹จ
  3. ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ:
    • TokenManager์—์„œ Access Token ์กฐํšŒ
    • ํ† ํฐ์ด ์กด์žฌํ•˜๋ฉด Authorization ํ—ค๋” ์ถ”๊ฐ€
  4. ์ธ์ฆ์ด ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ:
    • ์›๋ณธ ์š”์ฒญ ๊ทธ๋Œ€๋กœ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ

2๏ธโƒฃ ํ™ˆ ํ™”๋ฉด (์กฐํ•ฉ ๋ชฉ๋ก / ์นดํ…Œ๊ณ ๋ฆฌ / ๊ฒ€์ƒ‰)

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

  • ์กฐํ•ฉ(๋ ˆ์‹œํ”ผ) ๋ชฉ๋ก ์กฐํšŒ
  • ์นดํ…Œ๊ณ ๋ฆฌ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง
  • ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ œ๊ณต

๐Ÿ“‚ ์ฃผ์š” ์ฝ”๋“œ ์œ„์น˜

UI

  • presentation/screen/home/HomeScreen.kt
  • presentation/screen/home/HomeContent.kt
  • presentation/screen/home/HomeCombinationList.kt
  • presentation/screen/home/HomeTopBar.kt
  • presentation/screen/home/SearchScreen.kt

ViewModel

  • presentation/viewmodel/HomeViewModel.kt
  • presentation/viewmodel/SearchViewModel.kt

Repository

  • domain/repository/CombinationRepository.kt
  • data/repositoryimpl/CombinationRepositoryImpl.kt

Data

  • data/service/HomeService.kt
  • data/dto/response/CombinationResponse.kt
  • data/mapper/CombinationMapper.kt

๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ

  • core/component/CombinationCard.kt
  • core/component/CategoryChip.kt
  • core/component/SearchBar.kt

โœ๏ธ ์ฃผ์š” ์ฝ”๋“œ ์„ค๋ช…

  • ํ™ˆ ํ™”๋ฉด์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ViewModel์—์„œ ์ฒ˜๋ฆฌ
  • ์นดํ…Œ๊ณ ๋ฆฌ ์„ ํƒ ๋ฐ ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ์— ๋”ฐ๋ผ ์กฐํ•ฉ ๋ชฉ๋ก์„ ๋™์ ์œผ๋กœ ๊ฐฑ์‹ 
  • ๊ณตํ†ต UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ UI ์ผ๊ด€์„ฑ ํ™•๋ณด

๐Ÿ  HomeViewModel (ํ™ˆ ํ™”๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ)

HomeViewModel์€ ํ™ˆ ํ™”๋ฉด์—์„œ ๋ฐœ์ƒํ•˜๋Š”
์กฐํ•ฉ ๋ชฉ๋ก ์กฐํšŒ, ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง, ๊ฒ€์ƒ‰ ์ƒํƒœ๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ViewModel์ด๋‹ค.

  • ํ™ˆ ํ™”๋ฉด ์ง„์ž… ์‹œ ์กฐํ•ฉ ๋ชฉ๋ก์„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์กฐํšŒ
  • ์„ ํƒ๋œ ์นดํ…Œ๊ณ ๋ฆฌ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชฉ๋ก ํ•„ํ„ฐ๋ง
  • ๊ฒ€์ƒ‰์–ด ์ž…๋ ฅ ์‹œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ƒํƒœ๋กœ ๊ด€๋ฆฌ
  • UI๋Š” ViewModel์ด ์ œ๊ณตํ•˜๋Š” ์ƒํƒœ(StateFlow)๋ฅผ ๊ด€์ฐฐํ•˜์—ฌ ๋ Œ๋”๋ง
  1. ํ™”๋ฉด ์ง„์ž… ๋˜๋Š” ์‚ฌ์šฉ์ž ์•ก์…˜ ๋ฐœ์ƒ
  2. ViewModel์—์„œ Repository๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์š”์ฒญ
  3. ์„œ๋ฒ„ ์‘๋‹ต์„ Domain Entity๋กœ ๋ณ€ํ™˜
  4. ์ƒํƒœ(State) ๊ฐฑ์‹  โ†’ UI ์ž๋™ ๋ฆฌ๋ Œ๋”๋ง

๐Ÿงฉ CombinationCard (์กฐํ•ฉ ์นด๋“œ ์ปดํฌ๋„ŒํŠธ)

CombinationCard๋Š” ์กฐํ•ฉ(๋ ˆ์‹œํ”ผ)์„ ํ‘œํ˜„ํ•˜๋Š”
ํ™ˆ ํ™”๋ฉด์˜ ๊ธฐ๋ณธ UI ๋‹จ์œ„ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

  • ์กฐํ•ฉ ์ด๋ฏธ์ง€, ์ œ๋ชฉ, ๊ฐ„๋‹จํ•œ ์ •๋ณด ํ‘œ์‹œ

  • ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์•„ ํ™”๋ฉด ์ด๋™ ์ฒ˜๋ฆฌ

  • ํ™ˆ / ๊ฒ€์ƒ‰ / ๋งˆ์ด ํŽ˜์ด์ง€ ๋“ฑ ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • UI ์ค‘๋ณต ์ œ๊ฑฐ

  • ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ ์„ค๊ณ„๋กœ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

  • ํ™”๋ฉด ๊ฐ„ ์ผ๊ด€๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ œ๊ณต


3๏ธโƒฃ ์กฐํ•ฉ ์ƒ์„ธ ํ™”๋ฉด (์ƒ์„ธ ์กฐํšŒ / ์ข‹์•„์š”)

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

  • ์„ ํƒํ•œ ์กฐํ•ฉ์˜ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ
  • ์ข‹์•„์š”(์ฐœ) ๊ธฐ๋Šฅ ์ œ๊ณต

๐Ÿ“‚ ์ฃผ์š” ์ฝ”๋“œ ์œ„์น˜

UI

  • presentation/screen/combination/DetailScreen.kt

ViewModel

  • presentation/viewmodel/DetailViewModel.kt

Repository

  • domain/repository/RecipeRepository.kt
  • data/repositoryimpl/RecipeRepositoryImpl.kt

Data / Mapper

  • data/service/RecipeService.kt
  • data/dto/response/RecipeDetailResponse.kt
  • data/mapper/RecipeMapper.kt
  • domain/entity/RecipeDetail.kt

โœ๏ธ ์„ค๋ช…

  • ๋‹จ์ผ ์กฐํ•ฉ ์ƒํƒœ๋งŒ ๊ด€๋ฆฌํ•˜๋„๋ก ViewModel ๊ตฌ์„ฑ
  • ์„œ๋ฒ„ ์‘๋‹ต DTO๋ฅผ Mapper๋ฅผ ํ†ตํ•ด Domain Entity๋กœ ๋ณ€ํ™˜
  • UI๋Š” ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ž๋™ ๋ Œ๋”๋ง

โœ๏ธ ์ฃผ์š” ์ฝ”๋“œ ์„ค๋ช…

  • ์กฐํ•ฉ ์ƒ์„ธ ํ™”๋ฉด์€ ๋‹จ์ผ ์กฐํ•ฉ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋งŒ ๊ด€๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑ
  • ์ƒ์„ธ ์กฐํšŒ ๋ฐ ์ข‹์•„์š” ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ์ง์€ ViewModel์—์„œ ์ฒ˜๋ฆฌ
  • ์„œ๋ฒ„ ์‘๋‹ต DTO๋Š” Mapper๋ฅผ ํ†ตํ•ด Domain Entity๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ
  • UI๋Š” ViewModel์ด ์ œ๊ณตํ•˜๋Š” ์ƒํƒœ(State)๋ฅผ ๊ด€์ฐฐํ•˜์—ฌ ์ž๋™ ๋ Œ๋”๋ง

๐Ÿ“„ DetailViewModel (์กฐํ•ฉ ์ƒ์„ธ ์ƒํƒœ ๊ด€๋ฆฌ)

DetailViewModel์€ ์„ ํƒ๋œ ์กฐํ•ฉ ํ•˜๋‚˜์— ๋Œ€ํ•œ
์ƒ์„ธ ์ •๋ณด ์กฐํšŒ ๋ฐ ์ข‹์•„์š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ViewModel์ด๋‹ค.

  • ์กฐํ•ฉ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ธ ์ •๋ณด ์š”์ฒญ
  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์กฐํ•ฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœ๋กœ ๊ด€๋ฆฌ
  • ์ข‹์•„์š” ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ข‹์•„์š” ์ƒํƒœ ๊ฐฑ์‹ 
  • UI๋Š” ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ
  1. ์ƒ์„ธ ํ™”๋ฉด ์ง„์ž… ์‹œ ์กฐํ•ฉ ID ์ „๋‹ฌ
  2. ViewModel์—์„œ Repository๋ฅผ ํ†ตํ•ด ์ƒ์„ธ ์ •๋ณด ์š”์ฒญ
  3. ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœ(State)๋กœ ์ €์žฅ
  4. ์ข‹์•„์š” ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
  5. ์ƒํƒœ ๋ณ€๊ฒฝ โ†’ UI ์ž๋™ ๋ฆฌ๋ Œ๋”๋ง

๐Ÿ”„ RecipeMapper (DTO โ†’ Domain ๋ณ€ํ™˜)

RecipeMapper๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€
RecipeDetailResponse๋ฅผ ์•ฑ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š”
RecipeDetail Domain Entity๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ(DTO)๊ณผ ์•ฑ ๋‚ด๋ถ€ ๋ชจ๋ธ(Entity) ๋ถ„๋ฆฌ

  • ๋ฐ์ดํ„ฐ ๊ณ„์ธต๊ณผ ๋„๋ฉ”์ธ ๊ณ„์ธต ๊ฐ„ ์˜์กด์„ฑ ์ œ๊ฑฐ

  • ์„œ๋ฒ„ ์‘๋‹ต ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ Mapper๋กœ ํ•œ์ •

  • Clean Architecture ๊ธฐ๋ฐ˜ ๊ณ„์ธต ๋ถ„๋ฆฌ ๊ฐ•ํ™”

  • ViewModel๊ณผ UI์—์„œ ์„œ๋ฒ„ ๋ชจ๋ธ์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„


4๏ธโƒฃ ์กฐํ•ฉ ๋“ฑ๋ก ๊ธฐ๋Šฅ

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

  • ์ƒˆ๋กœ์šด ์กฐํ•ฉ(๋ ˆ์‹œํ”ผ) ๋“ฑ๋ก
  • ์ด๋ฏธ์ง€, ์žฌ๋ฃŒ, ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ์ž…๋ ฅ

๐Ÿ“‚ ์ฃผ์š” ์ฝ”๋“œ ์œ„์น˜

UI

  • presentation/screen/combination/CreateCombinationScreen.kt

ViewModel

  • presentation/viewmodel/CreateCombinationViewModel.kt

Data

  • data/dto/request/CreateCombinationRequest.kt
  • data/service/CombinationService.kt

โœ๏ธ ์ฃผ์š” ์ฝ”๋“œ ์„ค๋ช…

  • ์กฐํ•ฉ ๋“ฑ๋ก ํ™”๋ฉด์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํผ(Form) ํ˜•ํƒœ์˜ ํ™”๋ฉด
  • ์ž…๋ ฅ ๊ฐ’(์ œ๋ชฉ, ์žฌ๋ฃŒ, ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•, ์ด๋ฏธ์ง€ ๋“ฑ)์€ ViewModel์—์„œ ์ƒํƒœ๋กœ ๊ด€๋ฆฌ
  • ๋“ฑ๋ก ์š”์ฒญ์€ Request DTO๋กœ ๋ฌถ์–ด ์„œ๋ฒ„์— ์ „๋‹ฌ
  • ๋“ฑ๋ก ์„ฑ๊ณต ์‹œ ํ™ˆ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ํ๋ฆ„ ๊ตฌ์„ฑ

โœ๏ธ CreateCombinationViewModel (์กฐํ•ฉ ๋“ฑ๋ก ์ƒํƒœ ๊ด€๋ฆฌ)

CreateCombinationViewModel์€ ์กฐํ•ฉ ๋“ฑ๋ก ํ™”๋ฉด์—์„œ ๋ฐœ์ƒํ•˜๋Š”
๋ชจ๋“  ์ž…๋ ฅ ์ƒํƒœ์™€ ๋“ฑ๋ก ์ด๋ฒคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ViewModel์ด๋‹ค.

  • ์ œ๋ชฉ, ์žฌ๋ฃŒ, ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ๋“ฑ ์ž…๋ ฅ ๊ฐ’ ์ƒํƒœ ๊ด€๋ฆฌ
  • ์ด๋ฏธ์ง€ ์„ ํƒ ๊ฒฐ๊ณผ๋ฅผ ์ƒํƒœ๋กœ ์ €์žฅ
  • ๋“ฑ๋ก ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ž…๋ ฅ๊ฐ’์„ Request DTO๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์„œ๋ฒ„ ์š”์ฒญ
  • ๋“ฑ๋ก ์„ฑ๊ณต/์‹คํŒจ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ UI ์ƒํƒœ ๊ฐฑ์‹ 
  1. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐœ์ƒ (ํ…์ŠคํŠธ / ์ด๋ฏธ์ง€ ์„ ํƒ)
  2. ViewModel์—์„œ ์ž…๋ ฅ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
  3. ๋“ฑ๋ก ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ CreateCombinationRequest ์ƒ์„ฑ
  4. Repository(Service)๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ๋“ฑ๋ก ์š”์ฒญ
  5. ์„ฑ๊ณต ์‹œ ํ™”๋ฉด ์ด๋™, ์‹คํŒจ ์‹œ ์—๋Ÿฌ ์ƒํƒœ ์ฒ˜๋ฆฌ

๐Ÿ“ฆ CreateCombinationRequest (๋“ฑ๋ก ์š”์ฒญ DTO)

CreateCombinationRequest๋Š” ์กฐํ•ฉ ๋“ฑ๋ก ์‹œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋˜๋Š”
๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” Request DTO์ด๋‹ค.

  • ์ œ๋ชฉ, ์žฌ๋ฃŒ ๋ชฉ๋ก, ์กฐ๋ฆฌ ๋ฐฉ๋ฒ•, ์ด๋ฏธ์ง€ ์ •๋ณด ํฌํ•จ

  • ์„œ๋ฒ„ API ์ŠคํŽ™๊ณผ 1:1๋กœ ๋งคํ•‘

  • UI ๋ฐ ViewModel์ด ์„œ๋ฒ„ ๊ตฌ์กฐ์— ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ๋ถ„๋ฆฌ

  • ๋„คํŠธ์›Œํฌ ๊ณ„์ธต๊ณผ UI ๊ณ„์ธต ๊ฐ„ ๋ช…ํ™•ํ•œ ์—ญํ•  ๋ถ„๋ฆฌ

  • ์š”์ฒญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ DTO๋กœ ํ•œ์ •


5๏ธโƒฃ ๋งˆ์ด ํŽ˜์ด์ง€ (๋‚ด ์กฐํ•ฉ / ์ข‹์•„์š”ํ•œ ์กฐํ•ฉ)

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

  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์กฐํšŒ
  • ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์กฐํ•ฉ ๋ชฉ๋ก ์กฐํšŒ
  • ์ข‹์•„์š”ํ•œ ์กฐํ•ฉ ๋ชจ์•„๋ณด๊ธฐ
  • ํ”„๋กœํ•„ ์ˆ˜์ • ๊ธฐ๋Šฅ

๐Ÿ“‚ ์ฃผ์š” ์ฝ”๋“œ ์œ„์น˜

UI

  • presentation/screen/profile/MyScreen.kt
  • presentation/screen/profile/EditProfileScreen.kt

ViewModel

  • presentation/viewmodel/MyPageViewModel.kt
  • presentation/viewmodel/EditProfileViewModel.kt

Repository

  • domain/repository/UserRepository.kt
  • data/repositoryimpl/UserRepositoryImpl.kt

Data

  • data/service/UserService.kt
  • data/dto/request/UpdateProfileRequest.kt
  • data/dto/response/UserResponse.kt

โœ๏ธ ์„ค๋ช…

  • ์‚ฌ์šฉ์ž ๊ด€๋ จ ๊ธฐ๋Šฅ์„ UserRepository๋กœ ํ†ตํ•ฉ ๊ด€๋ฆฌ
  • ํ”„๋กœํ•„ ์ˆ˜์ •๊ณผ ์กฐํšŒ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฑ…์ž„ ๋ช…ํ™•ํ™”

โœ๏ธ ์ฃผ์š” ์ฝ”๋“œ ์„ค๋ช…

  • ๋งˆ์ด ํŽ˜์ด์ง€๋Š” ์‚ฌ์šฉ์ž ๊ธฐ์ค€ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ํ™”๋ฉด์œผ๋กœ ๊ตฌ์„ฑ
  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ •๋ณด, ์ž‘์„ฑํ•œ ์กฐํ•ฉ, ์ข‹์•„์š”ํ•œ ์กฐํ•ฉ์„ ํ•œ ํ™”๋ฉด์—์„œ ์ œ๊ณต
  • ์‚ฌ์šฉ์ž ๊ด€๋ จ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์€ UserRepository๋ฅผ ํ†ตํ•ด ์ผ๊ด„ ๊ด€๋ฆฌ
  • ํ”„๋กœํ•„ ์กฐํšŒ์™€ ์ˆ˜์ • ๋กœ์ง์„ ViewModel ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฑ…์ž„ ๋ช…ํ™•ํ™”

๐Ÿ‘ค MyPageViewModel (๋งˆ์ด ํŽ˜์ด์ง€ ์ƒํƒœ ๊ด€๋ฆฌ)

MyPageViewModel์€ ๋งˆ์ด ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ
์‚ฌ์šฉ์ž ์ •๋ณด ๋ฐ ์‚ฌ์šฉ์ž ๊ด€๋ จ ์กฐํ•ฉ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ViewModel์ด๋‹ค.

  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ •๋ณด ์กฐํšŒ
  • ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์กฐํ•ฉ ๋ชฉ๋ก ์กฐํšŒ
  • ์ข‹์•„์š”ํ•œ ์กฐํ•ฉ ๋ชฉ๋ก ์กฐํšŒ
  • ์„ ํƒ๋œ ํƒญ ๋˜๋Š” ํ™”๋ฉด ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
  1. ๋งˆ์ด ํŽ˜์ด์ง€ ์ง„์ž… ์‹œ ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ
  2. Repository๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ด€๋ จ ๋ฐ์ดํ„ฐ ์กฐํšŒ
  3. ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ์ƒํƒœ(State)๋กœ ์ €์žฅ
  4. UI๋Š” ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜์—ฌ ํ™”๋ฉด ๊ฐฑ์‹ 

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

  • Language: Kotlin
  • UI: Jetpack Compose (Material 3)
  • Architecture: MVVM + Clean Architecture
  • DI: Hilt
  • Network: Retrofit + OkHttp + Kotlinx Serialization
  • Image Loading: Coil 3
  • Navigation: Navigation Compose

๐Ÿ“‹ ์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌ

์ด ํ”„๋กœ์ ํŠธ๋Š” ์ž๋™ํ™”๋œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ์‹คํ–‰ ๋ฐฉ๋ฒ•

1. Git Hook (์ปค๋ฐ‹ ์ „ ์ž๋™ ์‹คํ–‰)

์ปค๋ฐ‹ ์‹œ ์ž๋™์œผ๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜: Windows์—์„œ Git Hook์€ Git Bash๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์ž๋™ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. PowerShell์ด๋‚˜ CMD์—์„œ๋Š” ์ž๋™ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ˆ˜๋™์œผ๋กœ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

# Git Bash์—์„œ ์ปค๋ฐ‹ ์‹œ ์ž๋™ ์‹คํ–‰
git commit -m "your message"
# ์ž๋™์œผ๋กœ Ktlint + Detekt ์‹คํ–‰

# PowerShell/CMD์—์„œ๋Š” ์ˆ˜๋™ ์‹คํ–‰ ํ•„์š”
.\scripts\check-code-quality.ps1
```

#### 2. Gradle Task (๋นŒ๋“œ ์‹œ ์ž๋™ ํฌ๋งทํŒ…)
๋นŒ๋“œ ์‹œ ์ž๋™์œผ๋กœ ์ฝ”๋“œ ํฌ๋งทํŒ…์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค (๊ฒ€์‚ฌ๋Š” Git Hook์—์„œ ์ฒ˜๋ฆฌ).

`````bash
./gradlew assembleDebug
# ์ž๋™์œผ๋กœ Ktlint ํฌ๋งทํŒ… ์‹คํ–‰ (๊ฒ€์‚ฌ๋Š” Git Hook์—์„œ ์ฒ˜๋ฆฌ)
```

#### 3. ์ˆ˜๋™ ์‹คํ–‰

**Windows (PowerShell)**:
`````powershell
.\scripts\check-code-quality.ps1
```

**Git Bash / Linux / Mac**:
`````bash
./scripts/check-code-quality.sh
```

**Gradle ์ง์ ‘ ์‹คํ–‰**:
`````bash
# ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ ํ†ตํ•ฉ ์‹คํ–‰
./gradlew codeQualityCheck

# ๊ฐœ๋ณ„ ์‹คํ–‰
./gradlew ktlintFormat    # ์ฝ”๋“œ ํฌ๋งทํŒ…
./gradlew ktlintCheck     # ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ
./gradlew detekt          # ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ

### ํ…Œ์ŠคํŠธ ์‹คํ–‰

**Windows (PowerShell)**:
```powershell
# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
.\scripts\run-tests.ps1

# ํŠน์ • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋งŒ ์‹คํ–‰
.\scripts\run-tests.ps1 "CreateCombinationViewModelTest"
```

**Git Bash / Linux / Mac**:
```bash
# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
./scripts/run-tests.sh

# ํŠน์ • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋งŒ ์‹คํ–‰
./scripts/run-tests.sh "CreateCombinationViewModelTest"
```

**Gradle ์ง์ ‘ ์‹คํ–‰**:
```bash
# ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰
./gradlew test

# ํŠน์ • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋งŒ ์‹คํ–‰
./gradlew test --tests "CreateCombinationViewModelTest"
```


```

## ๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

```
com.example.hackathon/
โ”œโ”€โ”€ data/                    # ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด
โ”‚   โ”œโ”€โ”€ dto/                # Request/Response ๋ชจ๋ธ
โ”‚   โ”œโ”€โ”€ mapper/              # Entity โ†” DTO ๋ณ€ํ™˜
โ”‚   โ”œโ”€โ”€ repositoryimpl/     # Repository ๊ตฌํ˜„
โ”‚   โ””โ”€โ”€ service/            # API ์ธํ„ฐํŽ˜์ด์Šค
โ”œโ”€โ”€ domain/                  # ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด
โ”‚   โ”œโ”€โ”€ entity/             # ๋น„์ฆˆ๋‹ˆ์Šค ์—”ํ‹ฐํ‹ฐ
โ”‚   โ””โ”€โ”€ repository/          # Repository ์ธํ„ฐํŽ˜์ด์Šค
โ”œโ”€โ”€ presentation/            # ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ์ด์–ด
โ”‚   โ”œโ”€โ”€ navigation/         # ๋„ค๋น„๊ฒŒ์ด์…˜
โ”‚   โ”œโ”€โ”€ route/              # ๋ผ์šฐํŠธ ์ •์˜
โ”‚   โ”œโ”€โ”€ screen/             # ํ™”๋ฉด ์ปดํฌ์ €๋ธ”
โ”‚   โ””โ”€โ”€ viewmodel/          # ViewModel
โ”œโ”€โ”€ core/                    # ๊ณตํ†ต
โ”‚   โ””โ”€โ”€ component/          # ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ
โ”œโ”€โ”€ di/                      # ์˜์กด์„ฑ ์ฃผ์ž…
โ””โ”€โ”€ ui/theme/               # ํ…Œ๋งˆ ์„ค์ •
```

## ๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

### ํ™˜๊ฒฝ ์š”๊ตฌ์‚ฌํ•ญ

- Android Studio Hedgehog (2023.1.1) ์ด์ƒ
- JDK 17 ์ด์ƒ
- Android SDK 36 (compileSdk, targetSdk)
- Min SDK 36

### ์‹คํ–‰ ๋ฐฉ๋ฒ•

1. ํ”„๋กœ์ ํŠธ ํด๋ก 
   `````bash
   git clone https://github.com/1hyok/Hackathon-FE.git
   cd Hackathon-FE
   ```

2. Android Studio์—์„œ ์—ด๊ธฐ
   - `File` โ†’ `Open` โ†’ ํ”„๋กœ์ ํŠธ ํด๋” ์„ ํƒ

3. Gradle ๋™๊ธฐํ™”
   - Android Studio๊ฐ€ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜
   - `File` โ†’ `Sync Project with Gradle Files`

4. ์‹คํ–‰!
   - ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋˜๋Š” ์‹ค์ œ ๊ธฐ๊ธฐ ์—ฐ๊ฒฐ
   - `Run` ๋ฒ„ํŠผ ํด๋ฆญ ๋˜๋Š” `Shift + F10`

## ๐Ÿ‘ฅ ํŒ€ ๊ตฌ์„ฑ

- **์ผํ˜**: ๋กœ๊ทธ์ธ ํ™”๋ฉด, ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด, ์˜จ๋ณด๋”ฉ ํ™”๋ฉด, ์กฐํ•ฉ ๋“ฑ๋ก ํ™”๋ฉด, ๊ฒ€์ƒ‰ ํ™”๋ฉด
- **์˜ˆ์›**: ํ™ˆ ํ™”๋ฉด, ์กฐํ•ฉ ์ƒ์„ธ ํ™”๋ฉด

## ๐ŸŒฟ ๋ธŒ๋žœ์น˜ ์ „๋žต

- `main`: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ (์•ˆ์ •์ ์ธ ์ฝ”๋“œ)
- `ilhyuk`: ์ผํ˜ ์ž‘์—… ๋ธŒ๋žœ์น˜
- `yewon`: ์˜ˆ์› ์ž‘์—… ๋ธŒ๋žœ์น˜

๊ฐ์ž ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—… ํ›„ `main`์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

## ๐Ÿ“ ์ฐธ๊ณ  ๋ฌธ์„œ

- [PROJECT_MEMO.md](./PROJECT_MEMO.md) - ํ”„๋กœ์ ํŠธ ๋ฉ”๋ชจ ๋ฐ ์ƒ์„ธ ์ •๋ณด
- [CHECKLIST.md](./CHECKLIST.md) - ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ
- [CONVENTION.md](./CONVENTION.md) - ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜
- [GIT_STRATEGY.md](./GIT_STRATEGY.md) - Git ์ „๋žต
- [.cursorrules](./.cursorrules) - Cursor AI ๊ทœ์น™

## ๐ŸŽจ ๋””์ž์ธ

- Figma ๋””์ž์ธ ํŒŒ์ผ ์ฐธ๊ณ 
- Figma AI ํ”„๋กฌํ”„ํŠธ:
  - [๋กœ๊ทธ์ธ ํ™”๋ฉด](./FIGMA_AI_PROMPT_LOGIN.md)
  - [์กฐํ•ฉ ๋“ฑ๋ก ํ™”๋ฉด](./FIGMA_AI_PROMPT_CREATE_COMBINATION.md)

## ๐Ÿ“Œ ์ฃผ์š” ํŠน์ง•

- **๋‹คํฌ ๋ชจ๋“œ ๋ฏธ์ง€์›**: ํ•ญ์ƒ ๋ผ์ดํŠธ ๋ชจ๋“œ๋งŒ ์‚ฌ์šฉ
- **Material 3**: ์ตœ์‹  Material Design 3 ์ ์šฉ
- **Clean Architecture**: ๋ ˆ์ด์–ด ๋ถ„๋ฆฌ๋กœ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
- **์ฝ”๋“œ ํ’ˆ์งˆ**: Ktlint + Detekt๋กœ ์ž๋™ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ

## ๐Ÿš€ APK ์ž๋™ ๋ฐฐํฌ

๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ๋  ๋•Œ๋งˆ๋‹ค APK๊ฐ€ ์ž๋™์œผ๋กœ ๋นŒ๋“œ๋˜๊ณ  ํŒ€์›๋“ค์—๊ฒŒ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

### ์„ค์ • ๋ฐฉ๋ฒ•

#### ์˜ต์…˜ 1: Firebase App Distribution (์ถ”์ฒœ)

1. **Firebase ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ**
   - [Firebase Console](https://console.firebase.google.com)์—์„œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
   - ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ ์ถ”๊ฐ€ (ํŒจํ‚ค์ง€๋ช…: `com.example.hackathon`)

2. **google-services.json ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๋ฐ ๋ณด์•ˆ ์ฒ˜๋ฆฌ**
   - Firebase ์ฝ˜์†”์—์„œ `google-services.json` ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
   - **โš ๏ธ ๋ณด์•ˆ ์ฃผ์˜**: ์ด ํŒŒ์ผ์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ GitHub ์ €์žฅ์†Œ์— ์ง์ ‘ ์˜ฌ๋ฆฌ์ง€ ๋งˆ์„ธ์š”!
   - ํŒŒ์ผ์„ Base64๋กœ ์ธ์ฝ”๋”ฉ:
     ```powershell
     # Windows (PowerShell)
     [Convert]::ToBase64String([IO.File]::ReadAllBytes("google-services.json")) | Out-File google-services-base64.txt
     ```
     ```bash
     # Mac/Linux
     base64 -i google-services.json > google-services-base64.txt
     ```
   - `google-services-base64.txt` ํŒŒ์ผ์˜ ์ „์ฒด ๋‚ด์šฉ์„ ๋ณต์‚ฌ

3. **Firebase CLI ํ† ํฐ ๋ฐœ๊ธ‰**
   ```bash
   firebase login:ci
   ```
   ๋ฐœ๊ธ‰๋œ ํ† ํฐ์„ ๋ณต์‚ฌ

4. **Firebase App ID ํ™•์ธ**
   - Firebase ์ฝ˜์†” โ†’ ํ”„๋กœ์ ํŠธ ์„ค์ • โ†’ ์ผ๋ฐ˜ ํƒญ
   - App ID ๋ณต์‚ฌ

5. **GitHub Secrets ์„ค์ •**
   - GitHub ์ €์žฅ์†Œ โ†’ Settings โ†’ Secrets and variables โ†’ Actions
   - ๋‹ค์Œ Secrets ์ถ”๊ฐ€:
     - `GOOGLE_SERVICES_JSON`: Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ `google-services.json` ๋‚ด์šฉ (2๋‹จ๊ณ„์—์„œ ๋ณต์‚ฌํ•œ ์ „์ฒด ๋ฌธ์ž์—ด)
     - `FIREBASE_APP_ID`: Firebase App ID
     - `FIREBASE_TOKEN`: Firebase CLI ํ† ํฐ
     - `DISCORD_WEBHOOK`: Discord ์›นํ›… URL (์„ ํƒ์‚ฌํ•ญ)

6. **Firebase ํ…Œ์Šคํ„ฐ ๊ทธ๋ฃน ์ƒ์„ฑ**
   - Firebase ์ฝ˜์†” โ†’ App Distribution โ†’ ํ…Œ์Šคํ„ฐ ๋ฐ ๊ทธ๋ฃน
   - "testers" ๊ทธ๋ฃน ์ƒ์„ฑ ๋ฐ ํŒ€์› ์ด๋ฉ”์ผ ์ถ”๊ฐ€

7. **์›Œํฌํ”Œ๋กœ์šฐ ํ™œ์„ฑํ™”**
   - `.github/workflows/deploy-apk.yml` ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค
   - ์›Œํฌํ”Œ๋กœ์šฐ๋Š” GitHub Secret์—์„œ `google-services.json` ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค

#### ์˜ต์…˜ 2: GitHub Releases (Firebase ์—†์ด)

1. **GitHub Secrets ์„ค์ •**
   - `DISCORD_WEBHOOK`: Discord ์›นํ›… URL (์„ ํƒ์‚ฌํ•ญ)

2. **์›Œํฌํ”Œ๋กœ์šฐ ํ™œ์„ฑํ™”**
   - `.github/workflows/deploy-apk-github-releases.yml` ํŒŒ์ผ ์‚ฌ์šฉ
   - `deploy-apk.yml` ํŒŒ์ผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œ

### Discord ์›นํ›… ์„ค์ • (์„ ํƒ์‚ฌํ•ญ)

1. Discord ์ฑ„๋„ ์„ค์ • โ†’ ์—ฐ๋™ โ†’ ์›นํ›… ์ƒ์„ฑ
2. ์›นํ›… URL์„ GitHub Secrets์— `DISCORD_WEBHOOK`์œผ๋กœ ์ €์žฅ

### ํŒ€์› ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

#### Firebase App Distribution ์‚ฌ์šฉ ์‹œ:
1. ์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ [Firebase App Tester ์•ฑ](https://play.google.com/store/apps/details?id=com.google.firebase.appdistribution) ์„ค์น˜
2. ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ์—…๋ฐ์ดํŠธ ์‹œ ์ž๋™์œผ๋กœ ์ด๋ฉ”์ผ ๋ฐ ์•ฑ ํ‘ธ์‹œ ์•Œ๋ฆผ ์ˆ˜์‹ 
3. ์•Œ๋ฆผ ํด๋ฆญ โ†’ ์›ํ„ฐ์น˜ ์„ค์น˜

#### GitHub Releases ์‚ฌ์šฉ ์‹œ:
1. Discord ์•Œ๋ฆผ์—์„œ ๋งํฌ ํด๋ฆญ
2. GitHub Releases ํŽ˜์ด์ง€์—์„œ APK ๋‹ค์šด๋กœ๋“œ
3. ์•ˆ๋“œ๋กœ์ด๋“œ ๊ธฐ๊ธฐ์—์„œ "์ถœ์ฒ˜๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์•ฑ" ์„ค์น˜ ๊ถŒํ•œ ํ—ˆ์šฉ
4. APK ์„ค์น˜

About

Android app for discovering and sharing custom food combinations, built with Kotlin and Jetpack Compose.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages