09
29

 

์ œ๊ฐ€ ๋ณด๋ ค๊ณ  ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์† ๋‚ด์šฉ์ด ์ถ”๊ฐ€๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
์ž˜๋ชป๋œ ๋‚ด์šฉ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ๋งํ•ด์ฃผ์„ธ์š”!!
์•ˆ๋“œ๋กœ์ด๋“œ 4๋Œ€ ๊ตฌ์„ฑ ์š”์†Œ

์•กํ‹ฐ๋น„ํ‹ฐ, ์„œ๋น„์Šค, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„(BR), ์ฝ˜ํ…์ธ  ํ”„๋กœ๋ฐ”์ด๋”(CP)

  • ์•กํ‹ฐ๋น„ํ‹ฐ - UIํ™”๋ฉด์„ ๋‹ด๋‹นํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
  • ์„œ๋น„์Šค - ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ• ์ˆ˜์žˆ์Œ
  • ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ์‹œ๋ฒ„ - ์‹œ์Šคํ…œ ๋‹จ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ  ์•ฑ์—์„œ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•จ, ์ •์ (๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋“ฑ๋ก), ๋™์ ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
  • ์ฝ˜ํ…์ธ  ํ”„๋กœ๋ฐ”์ด๋” - ์•ฑ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ๊ด€๋ฆฌ - URI๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์•กํ‹ฐ๋น„ํ‹ฐ, ํ”„๋ž˜๊ทธ๋จผํŠธ, AAC ViewModel, ์„œ๋น„์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ

 

๋‹ค๋ฅธ๊ฑด ๋‹ค ์ž˜ ์•Œ๊ณ ์žˆ๊ณ  ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ต๋‹ค.

  • `Unbound` ์„œ๋น„์Šค: ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์•„๋„ ์ž‘์—…์„ ๋งˆ์น˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ค‘์ง€ํ•  ๋•Œ๊นŒ์ง€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. 
  • `Bound` ์„œ๋น„์Šค: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค์— ๋ฐ”์ธ๋”ฉ๋˜์–ด์•ผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•˜๋‚˜ ์ด์ƒ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š” ๋™์•ˆ ์„œ๋น„์Šค๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๊ณ  ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ”์ธ๋”ฉ์„ ํ•ด์ œํ•˜๋ฉด ์„œ๋น„์Šค๋Š” ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค.

๋‘ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ์ƒ์„ฑ ์ดํ›„ ๋ฉ”์„œ๋“œ๊ฐ€ `onStartCommand`์ผ์ง€, `onBind(ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—†์œผ๋ฉด onUnbind)`์ผ์ง€ ๊ฐˆ๋ฆฐ๋‹ค.

ViewModel๊ณผ Jetpack์˜ AAC ViewModel์€ ์–ด๋–ค ์ฐจ์ด?

ViewModel

  • ViewModel์€ MVC, MVP, MVVM ๋“ฑ ๋‹ค์–‘ํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ์ฃผ๋กœ UI ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ™”๋ฉด์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ™”๋ฉด ํšŒ์ „ ๋“ฑ์œผ๋กœ ์ธํ•ด ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๋‹ค์‹œ ์ƒ์„ฑ๋  ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ํŠน์ง•์€ ํŠน์ • ํ”Œ๋žซํผ์— ์ข…์†๋˜์ง€ ์•Š๊ณ , UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•œ๋‹ค.

Jetpack AAC ViewModel

  • Jetpack์˜ AAC(ViewModel)๋Š” Android Jetpack์˜ Architecture Component์˜ ์ผ๋ถ€๋กœ, Android ์•ฑ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉ๋œ ViewModel์ด๋‹ค.
  • Android์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ™”๋ฉด ํšŒ์ „์ด๋‚˜ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‹œ์—๋„ ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠน์ง•์€ ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ๋งž์ถฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉด์„œ๋„ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.
  • AAC ViewModel์€ ViewModelProviders๋‚˜ Hilt์™€ ๊ฐ™์€ DI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ViewModel์€ ๋‹ค์–‘ํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์ด๋ผ๋ฉด, Jetpack AAC ViewModel์€ Android์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‹œ์—๋„ UI ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํŠนํ™”๋œ ๊ตฌํ˜„์ด๋‹ค.

์•กํ‹ฐ๋น„ํ‹ฐ์™€ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์ฐจ์ด?

๊ฐ ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ , ๋‹ค๋ฅธ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ์ „ํ™˜ํ•  ๋•Œ์—๋Š” ์ธํ…ํŠธ๋ฅผ ํ†ตํ•ด์•ผ ํ•œ๋‹ค.

ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ํ•˜๋‚˜์˜ ์•กํ‹ฐ๋น„ํ‹ฐ ์•ˆ์—์„œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ํ™”๋ฉด์„ ์˜๋ฏธํ•œ๋‹ค. ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์—†๊ณ  ํ•ญ์ƒ ์•กํ‹ฐ๋น„ํ‹ฐ ๋‚ด์— ํ˜ธ์ŠคํŒ…๋˜์–ด์•ผ ํ•œ๋‹ค.

ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š”, ํ”„๋ž˜๊ทธ๋จผํŠธ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • Host Activity (ํ˜ธ์ŠคํŠธ ์•กํ‹ฐ๋น„ํ‹ฐ)
    •  FragmentActivity: ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ๋‹ค. ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ์ž์‹ ์˜ supportFragmentManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • supportFragmentManager: ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, ์•กํ‹ฐ๋น„ํ‹ฐ(ํ˜ธ์ŠคํŠธ) ๋‚ด์—์„œ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์ถ”๊ฐ€, ์ œ๊ฑฐ, ๊ต์ฒด ๋“ฑ ํŠธ๋žœ์žญ์…˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Host Fragment (ํ˜ธ์ŠคํŠธ ํ”„๋ž˜๊ทธ๋จผํŠธ)
    • Fragment: ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋˜ ๋‹ค๋ฅธ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ํ˜ธ์ŠคํŠธ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ, ์ž์‹ ์˜parentFragmentManager(ํ˜ธ์ŠคํŠธ์˜ ๋งค๋‹ˆ์ €)์™€ childFragmentManager(ํ˜ธ์ŠคํŠธํ•ด์ค„ ๋งค๋‹ˆ์ €)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • parentFragmentManager: ํ˜ธ์ŠคํŠธ ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ํฌํ•จ๋œ ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜ ์ƒ์œ„ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ FragmentManager๋‹ค.
    • childFragmentManager: ํ”„๋ž˜๊ทธ๋จผํŠธ ์•ˆ์— ํฌํ•จ๋œ ์ž์‹ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ํ”„๋ž˜๊ทธ๋จผํŠธ ๋‚ด์—์„œ ๋‹ค๋ฅธ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Child Fragment (์ž์‹ ํ”„๋ž˜๊ทธ๋จผํŠธ)
    ์ž์‹ ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ํ˜ธ์ŠคํŠธ ํ”„๋ž˜๊ทธ๋จผํŠธ์— ์†ํ•œ ํ”„๋ž˜๊ทธ๋จผํŠธ๋‹ค. parentFragmentManager๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ํ˜ธ์ŠคํŠธ ํ”„๋ž˜๊ทธ๋จผํŠธ์™€ ์—ฐ๊ฒฐ๋œ๋‹ค.
๊ทธ๋Ÿผ Intent๋Š”?

์ปดํฌ๋„ŒํŠธ(4๋Œ€ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘ ํฌํ•จ) ๊ฐ„์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๋ฉ”์‹œ์ง€ ๊ฐ์ฒด์ด ๋ช…์‹œ์ , ์•”์‹œ์  ์ธํ…ํŠธ๋กœ ๋‚˜๋‰œ๋‹ค.
๋ช…์‹œ์  Intent๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ์‹œ์ž‘ํ•  ์ปดํฌ๋„ŒํŠธ๋‚˜ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ,
์•”์‹œ์  Intent๋Š” ํŠน์ • ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.(urlScheme๊ณผ ๊ฐ™์€)

์•”์‹œ์  Intent๋Š” Intent filter๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

> `PendingIntent`๋„ ์žˆ๋‹ค.
Intent๋ฅผ ๊ฐ–๋Š” ํด๋ž˜์Šค๋กœ, ๊ธฐ๋ณธ ๋ชฉ์ ์€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์˜ ๊ถŒํ•œ์„ ํ—ˆ๊ฐ€ํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Intent๋ฅผ ๋งˆ์น˜ ๋ณธ์ธ ์•ฑ์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Notification ์„ค์ •ํ•  ๋•Œ ๋ดค์„ ๊ฒƒ์ด๋‹ค.
Notification์„ ํด๋ฆญํ•ด์„œ ๊ทธ ์•ฑ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑด, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ PendingIntent๋ฅผ ์‚ฌ์šฉํ•ด์„œ NotificationManager๋กœ ํ•˜์—ฌ๊ธˆ ์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

์„œ๋น„์Šค๋Š”?
  • ํฌ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค - ์•Œ๋ฆผ์„ ํ‘œ์‹œํ•ด ๋†“๊ณ  ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š์•„๋„ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๊ฑธ ๋งํ•จ(์Œ์•… ํ”Œ๋ ˆ์ด์–ด ๊ฐ™์€)
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค - ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ
  • ๋ฐ”์šด๋“œ ์„œ๋น„์Šค - ์•ฑ ๋‚ด์—์„œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋งํ•จ(ํŠน์ • ์ปดํฌ๋„ŒํŠธ์™€ ์„œ๋น„์Šค๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ) -> onBind, onUnbind๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”

์˜ต์…˜ 3๊ฐœ๊ฐ€ ์žˆ๋‹ค.

  • `START_STICKY` - ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ๊ฐ•์ œ ์ค‘์ง€ํ•œ ๊ฒฝ์šฐ, null intent๋ฅผ ๋ณด๋‚ด์„œ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
  • `START_NOT_STICKY` - ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ๊ฐ•์ œ ์ค‘์ง€ํ•œ ๊ฒฝ์šฐ, ์žฌ์‹œ์ž‘ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • `START_REDELIVER_INTENT` - ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ๊ฐ•์ œ ์ค‘์ง€ํ•œ ๊ฒฝ์šฐ, ์ด์ „๊ณผ ๋™์ผํ•œ intent๋ฅผ ๋ณด๋‚ด์„œ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
๋””์ž์ธ ํŒจํ„ด? - MVC, MVP, MVVM

๋””์ž์ธ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • MVC - ๋ชจ๋ธ - ๋ทฐ - ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋ธ, UI๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ทฐ, ์ด๊ฑธ ์—ฐ๊ฒฐํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • MVP - ๋ทฐ์™€ ๋ชจ๋ธ ์‚ฌ์ด์— ํ”„๋ ˆ์  ํ„ฐ๋ฅผ ๋‘ฌ์„œ M-V ๊ฐ„์˜ ์ง์ ‘ ์—ฐ๊ฒฐ์„ ๋Š๊ณ , ๋ทฐ์˜ ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋งํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. MVC์˜ ์ง„ํ™”
  • MVVM - ๋ทฐ์™€ ๋ชจ๋ธ ์‚ฌ์ด์— ๋ทฐ ๋ชจ๋ธ์ด ์žˆ๋Š” ๊ตฌ์กฐ๋กœ, ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ๋ทฐ์™€ ๋ทฐ๋ชจ๋ธ์ด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐฉ์‹. ๋ทฐ ๋ชจ๋ธ์ด ์ค‘๊ฐ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋‹ด๋‹นํ•˜๊ณ  ๋ทฐ๋Š” ์ด๋ฒคํŠธ๋งŒ ๋ฐ›๋Š” ๋ฐฉ์‹์„ ์ ์šฉํ•˜์—ฌ, ๋ทฐ์™€ ๋ชจ๋ธ ์‚ฌ์ด์˜ ์˜์กด์„ฑ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.
๋ ˆ๊ฑฐ์‹œ ๋Œ€๋น„ - AsyncTask๊ฐ€ ๋ฌด์—‡์ธ์ง€? ์‚ฌ์šฉ์‹œ ๋‹จ์ ์€?

AsyncTask๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ UI ์Šค๋ ˆ๋“œ์—์„œ ์‰ฝ๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ํด๋ž˜์Šค์ด๋‹ค.
Android 11(API ๋ ˆ๋ฒจ 30)์—์„œ Deprecated๋˜์–ด, ์ฝ”๋ฃจํ‹ด, WorkManager, Handler๊ณผ ๊ฐ™์€ ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋‹จ์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leaks):
    AsyncTask๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜์—ˆ๋Š”๋ฐ, ๋งŒ์•ฝ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ „ํ™˜๋˜๊ฑฐ๋‚˜ ์†Œ๋ฉธ๋˜๋Š” ๋™์•ˆ AsyncTask๊ฐ€ ๊ณ„์† ์‹คํ–‰ ์ค‘์ผ ๊ฒฝ์šฐ, ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์— ์˜ํ•ด ์ˆ˜์ง‘๋˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ทจ์†Œ ๋ฐ ์ค‘๋‹จ์˜ ์–ด๋ ค์›€:
    AsyncTask๋Š” cancel() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ž‘์—…์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž‘์—…์ด ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ, ์ž‘์—…์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค.
  • ์ž‘์—… ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€:
    ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์ ์ ˆํžˆ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์€ ์œ„์—์„œ ๋งํ–ˆ๋“ฏ AsyncTask์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š์•„์„œ, ์—ฌ๋Ÿฌ AsyncTask๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์—ฐ์†์ ์œผ๋กœ ์‹คํ–‰๋  ๋•Œ๋Š” ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค.
  • ThreadPool ์ œํ•œ:
    AsyncTask๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์Šค๋ ˆ๋“œ ํ’€์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ AsyncTask๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ํ’€์˜ ๋Œ€๊ธฐ์—ด์— ์Œ“์—ฌ ์ž‘์—…์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ž‘์—… ์ˆœ์„œ ๋ถˆํ™•์‹ค์„ฑ:
    AsyncTask๋Š” Android 3.0(Honeycomb) ์ดํ›„๋กœ execute()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง๋ ฌ ์‹คํ–‰๋˜์—ˆ์ง€๋งŒ, ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ๋ณ‘๋ ฌ ์‹คํ–‰์ด ๊ธฐ๋ณธ๊ฐ’์ด์—ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋™์ž‘์ด ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์กŒ๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ executeOnExecutor()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ณ‘๋ ฌ ์‹คํ–‰์„ ๋ช…์‹œํ•ด์•ผ ํ–ˆ๋‹ค. ์•ˆ์ •์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๋ง.

๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” WorkManager๋Š” JetPack์— ํฌํ•จ๋œ Android์˜ ์ƒˆ๋กœ์šด ์ž‘์—… ์Šค์ผ€์ค„๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ, ๊ธด ์‹œ๊ฐ„ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ์— ์˜์กดํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์ž‘์—…์ด ์ทจ์†Œ๋˜์—ˆ๊ฑฐ๋‚˜ ์žฅ์น˜๊ฐ€ ์žฌ๋ถ€ํŒ…๋œ ๊ฒฝ์šฐ์—๋„ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด๋ดค๋Š”์ง€? ์™œ ์ผ๋Š”์ง€?

์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection, DI)์€ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ, ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

์ €๋Š” Hilt๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ,  Hilt๋Š” Google์ด ๊ด€๋ฆฌํ•˜๋Š” Android ํŠนํ™” DI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๋ณต์žกํ•œ ์„ค์ • ์—†์ด DI๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.Dagger์— ๋น„ํ•ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋Œ€ํญ ์ค„์—ฌ์ฃผ๊ณ , ๋ช…์‹œ์ ์ธ ์ปดํฌ๋„ŒํŠธ ์„ค์ • ์—†์ด๋„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

  Hilt Dagger
์„ค์ • ๋ณต์žก๋„ ๊ฐ„๋‹จํ•จ, ์ž๋™ ์ปดํฌ๋„ŒํŠธ ์„ค์ • ๋ณต์žกํ•จ, ์ˆ˜๋™ ์ปดํฌ๋„ŒํŠธ ์„ค์ •
๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ์ ์Œ ๋งŽ์Œ
Android ํŠนํ™” Android์— ์ตœ์ ํ™”๋จ Android ํŠนํ™” ์•„๋‹˜, Dagger-Android ํ•„์š”
์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ Android ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ ์ž๋™ํ™” ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ ์ˆ˜๋™ ์„ค์ • ํ•„์š”
ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ Hilt ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ ์ œ๊ณต, ๊ฐ„ํŽธํ•œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ํ…Œ์ŠคํŠธ์šฉ ์ปดํฌ๋„ŒํŠธ/๋ชจ๋“ˆ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ
์‚ฌ์šฉ์„ฑ Android ํ”„๋กœ์ ํŠธ์— ์ตœ์ ํ™” ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๋นŒ๋“œ ์†๋„ ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฆ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณต์žกํ•  ๊ฒฝ์šฐ ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ
Jetpack Navigation์—์„œ popUpTo์™€ popUpToInclusive ์ฐจ์ด

popUpTo

  • popUpTo๋Š” ์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰ ์‹œ ๋ฐฑ ์Šคํƒ์—์„œ ํŠน์ • ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์†์„ฑ์ด๋‹ค.
  • ์ด ์†์„ฑ์€ ํƒ์ƒ‰ํ•  ๋•Œ ํŠน์ • ๋ชฉ์ ์ง€ ์ดํ›„์— ์žˆ๋Š” ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋ฐฑ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, popUpTo="@+id/destination_home"๋กœ ์„ค์ •ํ•˜๋ฉด destination_home ๋ชฉ์ ์ง€๊นŒ์ง€ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ, destination_home ์ดํ›„์˜ ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค.
  • destination_home ์ž์ฒด๋Š” ๋ฐฑ ์Šคํƒ์— ๋‚จ์•„ ์žˆ์–ด, ์—ฌ์ „ํžˆ ๊ทธ ํ”„๋ž˜๊ทธ๋จผํŠธ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

popUpToInclusive

  • `popUpToInclusive`๋Š” `popUpTo`์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ง€์ •๋œ ๋ชฉ์ ์ง€ ์ž์ฒด๋ฅผ ๋ฐฑ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’์€ false๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋•Œ๋Š” popUpTo๋กœ ์ง€์ •๋œ ๋ชฉ์ ์ง€ ์ž์ฒด๋Š” ๋ฐฑ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๊ณ  ๋‚จ์•„ ์žˆ๋‹ค.
  • `popUpToInclusive="true"`๋กœ ์„ค์ •ํ•˜๋ฉด, ์ง€์ •๋œ ๋ชฉ์ ์ง€๋„ ํฌํ•จํ•˜์—ฌ ๋ฐฑ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, `popUpTo="@+id/destination_home" popUpToInclusive="true"`๋กœ ์„ค์ •ํ•˜๋ฉด, `destination_home`๊ณผ ๊ทธ ์ดํ›„์˜ ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, `popUpTo`๋Š” ํŠน์ • ๋ชฉ์ ์ง€ ์ดํ›„์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , `popUpToInclusive`๋Š” ๊ทธ ์ง€์ •๋œ ๋ชฉ์ ์ง€ ์ž์ฒด๋„ ์ œ๊ฑฐํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค.

 

์ข€ ๋” ๋ถ€์—ฐ์„ค๋ช…ํ•˜๋ฉด,

 

  • ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ทธ๋ž˜ํ”„๊ฐ€ A -> B -> C -> D ๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž.
  • ์—ฌ๊ธฐ์„œ D์—์„œ A๋กœ ๋Œ์•„๊ฐ€๋ฉด์„œ B์™€ C๋ฅผ ๋ฐฑ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๋ ค๋ฉด popUpTo="B"์™€ ํ•จ๊ป˜ popUpToInclusive=true๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿผ ๋ชฉ์ ์ง€์ธ B๋กœ ๊ฐˆ ๋•Œ, B๋„ ๋‚ ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ „์˜ backstack์ธ A๋งŒ ๋‚จ๊ณ  B, C, D๊ฐ€ ๋ฐฑ์Šคํƒ์—์„œ ๋ชจ๋‘ ์ œ๊ฑฐ๋œ๋‹ค.

 

  popUpTo popUpToInclusive
๊ธฐ๋Šฅ ๋ฐฑ ์Šคํƒ์—์„œ ํŠน์ • ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์ œ๊ฑฐํ•˜์ง€๋งŒ, ์ง€์ •๋œ ๋ชฉ์ ์ง€ ์ž์ฒด๋Š” ๋‚จ๊ฒจ๋‘  ๋ฐฑ ์Šคํƒ์—์„œ ํŠน์ • ๋ชฉ์ ์ง€์™€ ๊ทธ ์ดํ›„์˜ ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉฐ, ์ง€์ •๋œ ๋ชฉ์ ์ง€ ์ž์ฒด๋„ ์ œ๊ฑฐํ•จ
๋™์ž‘ ๋ฐฉ์‹ ์ง€์ •๋œ ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ๊ฒฝ๋กœ์—์„œ ๊ทธ ๋ชฉ์ ์ง€ ์ดํ›„์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋งŒ ์ œ๊ฑฐํ•จ ์ง€์ •๋œ ๋ชฉ์ ์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ ์ด์ „์˜ ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ํ•จ๊ป˜ ์ œ๊ฑฐํ•จ
์‚ฌ์šฉ ์˜ˆ์‹œ popUpTo="@+id/home": home ๋ชฉ์ ์ง€ ์ดํ›„์˜ ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  home์€ ๋‚จ๊ฒจ๋‘  popUpTo="@+id/home" popUpToInclusive="true": home๊ณผ ๊ทธ ์ดํ›„์˜ ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ํ•จ๊ป˜ ์ œ๊ฑฐํ•จ
์‚ฌ์šฉ ๋ชฉ์  ํŠน์ • ๋ชฉ์ ์ง€ ์ดํ›„์˜ ๋ฐฑ ์Šคํƒ์„ ์ •๋ฆฌํ•˜๊ณ , ์ง€์ •๋œ ๋ชฉ์ ์ง€๋กœ ๋Œ์•„๊ฐ€๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ํŠน์ • ๋ชฉ์ ์ง€ ์ž์ฒด๋„ ์ œ๊ฑฐํ•˜์—ฌ, ๊ทธ ์ด์ „์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋กœ ๋Œ์•„๊ฐ€๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ
Dispatchers์˜ ์ข…๋ฅ˜์™€ ํŠน์ง•?

 

  • Dispatchers.Main: UI ๊ด€๋ จ ์ž‘์—… (๋ฉ”์ธ ์Šค๋ ˆ๋“œ).
  • Dispatchers.IO: ๋„คํŠธ์›Œํฌ, ํŒŒ์ผ ์ž…์ถœ๋ ฅ ์ž‘์—… (I/O ๋ฐ”์šด๋“œ ์ž‘์—…).
  • Dispatchers.Default: CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—… (CPU ๋ฐ”์šด๋“œ ์ž‘์—…).
  • Dispatchers.Unconfined: ํŠน์ • ์Šค๋ ˆ๋“œ์— ์–ฝ๋งค์ด์ง€ ์•Š์œผ๋ฉฐ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์‹คํ–‰ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ฌ๋ผ์ง.

 

๋™๊ธฐ ๋น„๋™๊ธฐ, Blocking Non-Blocking

๋™๊ธฐ์™€ ๋น„๋™๊ธฐ๋Š” ์ž‘์—…์˜ ์ˆœ์ฐจ์„ฑ๊ณผ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋Œ€ํ•œ ์ฐจ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ธ”๋กœํ‚น๊ณผ ๋„Œ๋ธ”๋กœํ‚น์€ ์ž‘์—… ์ค‘ ๋Œ€๊ธฐ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋˜๋Š” ๊ฐœ๋…์ด๋‹ค.

graph TD
    A[Start] --> B[Task 1 - Synchronous]
    B --> C[Task 2 - Synchronous]
    C --> D[End]
    
    A1[Start] -->|Async Execution| B1[Task 1 - Asynchronous]
    B1 -->|No Waiting| C1[Task 2 - Asynchronous]
    C1 --> D1[End]
    
    A2[Start] -->|Blocking| B2[Task - Blocking]
    B2 -->|Wait until complete| C2[End]
    
    A3[Start] -->|Non-blocking| B3[Task - Non-blocking]
    B3 -->|Instant return| C3[End]

๋™๊ธฐ(Synchronous)

  • ๋™๊ธฐ ๋ฐฉ์‹์€ ์ž‘์—…์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์—๋Š” ๋‹ค์Œ ์ž‘์—…์ด ์‹œ์ž‘๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ ์ž‘์—…์€ ์„œ๋กœ ์˜์กดํ•˜๋ฉฐ, ์ž‘์—… A๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ ์ž‘์—… B๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.
  • ์ด ๋ฐฉ์‹์€ ๋ธ”๋กœํ‚น ์ƒํƒœ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ด์ „ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ž‘์—…์ด ๋Œ€๊ธฐ ์ƒํƒœ์— ๋†“์ด๊ฒŒ ๋œ๋‹ค.
  • ์˜ˆ: ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ, ํŒŒ์ผ์ด ์™„์ „ํžˆ ์ฝํž ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.

๋น„๋™๊ธฐ(Asynchronous)

  • ๋น„๋™๊ธฐ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์ด ์ง„ํ–‰๋œ๋‹ค.
  • ์ž‘์—… ๊ฐ„์— ์˜์กด์„ฑ์ด ์—†์œผ๋ฉฐ, ๊ฐ ์ž‘์—…์ด ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๋ฐฉ์‹์€ ๋„Œ๋ธ”๋กœํ‚น ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์—ฌ, ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ: ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•œ๋‹ค.

Blocking

  • ๋ธ”๋กœํ‚น ์ž‘์—…์€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋‚˜ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰ ํ๋ฆ„์ด ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ฆ‰, ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์ง€๋ฉฐ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์˜ˆ: ํŒŒ์ผ์„ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ฝ์œผ๋ฉด, ํŒŒ์ผ์ด ์™„์ „ํžˆ ์ฝํ˜€์งˆ ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

Non-blocking

  • ๋…ผ๋ธ”๋กœํ‚น ์ž‘์—…์€ ํ˜ธ์ถœ๋œ ์ž‘์—…์ด ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์‹คํ–‰ ํ๋ฆ„์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰๋œ๋‹ค.
  • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ: ํŒŒ์ผ์„ ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ฝ์œผ๋ฉด, ํŒŒ์ผ ์ฝ๊ธฐ ์š”์ฒญ ํ›„ ์ฆ‰์‹œ ๋‹ค์Œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉฐ, ๋‚˜์ค‘์— ํŒŒ์ผ ์ฝ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์•Œ๋ฆผ์„ ๋ฐ›๋Š”๋‹ค.

์„ž๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ ์šฉ๋œ๋‹ค.

 

  • Sync + Blocking: ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • Async + Blocking: ๋น„๋™๊ธฐ์  ์ž‘์—…์ด์ง€๋งŒ, ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • Sync + Non-blocking: ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ, ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Async + Non-blocking: ๋น„๋™๊ธฐ์  ์ž‘์—…์ด๋ฉฐ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜์–ด ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
Serializable๊ณผ Pacelable ์ฐจ์ด
  Serializable Parcelable
์„ฑ๋Šฅ ๋Š๋ฆผ: Java Reflection์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์†๋„๊ฐ€ ๋Š๋ฆผ. ๋Œ€๋Ÿ‰์˜ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•  ๋•Œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋” ์‹ฌํ•ด์งˆ ์ˆ˜ ์žˆ์Œ. ๋น ๋ฆ„: ํ•„๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”ํ•˜๋ฉฐ, Android์˜ Binder ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด ์ตœ์ ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚จ.
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ: Java์˜ ๊ธฐ๋ณธ ์ง๋ ฌํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์•„์ง. ๋” ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ: ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ง๋ ฌํ™”ํ•˜๋ฉฐ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์Œ.
๊ตฌํ˜„ ๋ณต์žก๋„ ๊ตฌํ˜„์ด ๊ฐ„๋‹จ: 'implements Serializable'๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋ฉฐ, ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ ์ž‘์„ฑ ์—†์ด๋„ ์ž๋™์œผ๋กœ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•จ. ๊ตฌํ˜„์ด ๋ณต์žก: ๊ฐ ํ•„๋“œ๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” 'writeToParcel' ๋ฐ 'createFromParcel' ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๋ณต์žกํ•จ.
ํ˜ธํ™˜์„ฑ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ: ํด๋ž˜์Šค ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์—ญ์ง๋ ฌํ™” ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฒ„์ „ ๋ถˆ์ผ์น˜๋‚˜ ํ•„๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ. ์œ ์—ฐํ•œ ํ˜ธํ™˜์„ฑ: ๋ช…์‹œ์ ์œผ๋กœ ์ง๋ ฌํ™” ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ๊ตฌ์กฐ ๋ณ€๊ฒฝ์— ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Œ. ํ•„๋“œ ์ถ”๊ฐ€๋‚˜ ์‚ญ์ œ ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ.
์‚ฌ์šฉ ํ™˜๊ฒฝ Java ๋ฐ Android์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ: Android๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Java ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. Android ์ „์šฉ: Android IPC ๋ฐ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, Java ํ‘œ์ค€ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€.
OkHttp์™€ Retrofit2์˜ ์ฐจ์ด

OkHttp์™€ Retrofit์€ ๋‘˜ ๋‹ค ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ง€๋งŒ, OkHttp๋Š” ๋” ๋‚ฎ์€ ์ˆ˜์ค€์˜ HTTP ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ , Retrofit์€ OkHttp๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ณ ์ˆ˜์ค€์˜ REST ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Wrapping๋œ๊ฒŒ Retrofit์ด๋ผ๊ณ  ๋ด์•ผ๋œ๋‹ค.

  OkHttp Retrofit
์—ญํ•  ์ €์ˆ˜์ค€ HTTP ํด๋ผ์ด์–ธํŠธ ๊ณ ์ˆ˜์ค€ REST ํด๋ผ์ด์–ธํŠธ
API ์„ค๊ณ„ URL, ํ—ค๋”, HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•จ ์ธํ„ฐํŽ˜์ด์Šค(์–ด๋…ธํ…Œ์ด์…˜)๋กœ API ์—”๋“œํฌ์ธํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ž๋™์œผ๋กœ HTTP ์š”์ฒญ์„ ์ƒ์„ฑํ•จ
๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ JSON ํŒŒ์‹ฑ์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ Gson, Moshi ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ž๋™์œผ๋กœ JSON์„ Java/Kotlin ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•จ
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ˆ˜๋™ ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ ์ฝ”๋ฃจํ‹ด ๋˜๋Š” RxJava์™€ ํ†ตํ•ฉ๋˜์–ด ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
๊ธฐ๋Šฅ HTTP/2, WebSocket, ์บ์‹ฑ, ํƒ€์ž„์•„์›ƒ ์„ค์ • ๋“ฑ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ๊ณผ ๊ด€๋ จ๋œ ์ €์ˆ˜์ค€ ๊ธฐ๋Šฅ ์ œ๊ณต ์ž๋™ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜, ๋” ๊ฐ„ํŽธํ•œ API ํ˜ธ์ถœ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋“ฑ REST API ํ˜ธ์ถœ์„ ์œ„ํ•œ ๊ณ ์ˆ˜์ค€ ๊ธฐ๋Šฅ ์ œ๊ณต
์‚ฌ์šฉ ์‚ฌ๋ก€ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์„ธ๋ถ€ ์ œ์–ด ๋ฐ HTTP ํ”„๋กœํ† ์ฝœ์˜ ์ง์ ‘ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ REST API ํ†ต์‹ ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ž๋™ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ
git merge์™€ rebase์˜ ์ฐจ์ด?
  git merge git rebase
๋™์ž‘ ๋ฐฉ์‹ ๋‘ ๋ธŒ๋žœ์น˜์˜ ์ด๋ ฅ์„ ๋ณ‘ํ•ฉํ•˜๊ณ , ์ƒˆ๋กœ์šด **๋จธ์ง€ ์ปค๋ฐ‹(Merge Commit)**์„ ์ƒ์„ฑํ•จ ํ•œ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹๋“ค์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜ ์œ„์— ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ์ด๋ ฅ์„ ์žฌ์ž‘์„ฑํ•จ
์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ๋ณ‘ํ•ฉ ์‹œ, ๋‘ ๋ธŒ๋žœ์น˜์˜ ์ด๋ ฅ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ถ”๊ฐ€ํ•ด ์ด๋ ฅ์— ๋ถ„๊ธฐ์ ์ด ์ƒ๊น€ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹๋“ค์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜ ์œ„์— ์žฌ๋ฐฐ์น˜ํ•˜๋ฏ€๋กœ, ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ง์„ ํ˜•์œผ๋กœ ์œ ์ง€๋จ
์‚ฌ์šฉ ์˜ˆ์‹œ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋œ ํ›„, ๊ธฐ์กด ์ด๋ ฅ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•  ๋•Œ ์‚ฌ์šฉ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ์œ„์— ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ์ด๋ ฅ์„ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ
์ถฉ๋Œ ํ•ด๊ฒฐ ๋ณ‘ํ•ฉ ์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด, ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ณ  ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•จ ์žฌ๋ฐฐ์น˜ ๊ณผ์ •์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด, ๊ฐ ์ปค๋ฐ‹๋งˆ๋‹ค ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•จ
์žฅ์  ์ด๋ ฅ์˜ ๋ชจ๋“  ์ปค๋ฐ‹์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ˜‘์—… ์‹œ ์ด๋ ฅ์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Œ ๊ฐ„๊ฒฐํ•œ ์ด๋ ฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ธŒ๋žœ์น˜๊ฐ€ ์ง์„ ํ˜•์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋จ
๋‹จ์  ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์œผ๋กœ ์ธํ•ด ์ด๋ ฅ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์žฌ์ž‘์„ฑ๋˜๋ฏ€๋กœ, ํ˜‘์—… ์ค‘์ธ ๋ธŒ๋žœ์น˜์—์„œ rebase๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Œ
์‚ฌ์šฉ ์ƒํ™ฉ ํ˜‘์—… ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์‹œ ๊ธฐ์กด ์ด๋ ฅ ์œ ์ง€๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ๊ฐœ์ธ ์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ

rebase๋Š” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์„ฑํ•ด์„œ ๊น”๋”ํ•œ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

git๊ณผ git flow์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
  Git Git Flow
์ •์˜ ๋ถ„์‚ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ, ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํ˜‘์—…์„ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ Git์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์œผ๋กœ, ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก 
๊ธฐ๋Šฅ ํŒŒ์ผ์„ ์ถ”์ ํ•˜๊ณ  ๋ฒ„์ „ ๊ธฐ๋ก์„ ๋‚จ๊ธฐ๋ฉฐ, ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ํ˜‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜, ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜, ํ•ซํ”ฝ์Šค ๋ธŒ๋žœ์น˜ ๋“ฑ ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์นญ ๊ทœ์น™์„ ์ •ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•จ
์ฃผ์š” ๋ช…๋ น์–ด git init, git add, git commit, git push, git merge, git rebase ๋“ฑ Git ๋ช…๋ น์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ํŠน์ • ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ๋”ฐ๋ฆ„. develop, feature, release, hotfix, master ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉ
์‚ฌ์šฉ ๋ชฉ์  ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—…์„ ์ง€์›ํ•˜๋ฉฐ, ๋ชจ๋“  ํ˜•์‹์˜ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ฃผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ฝ”๋“œ์˜ ๋ฆด๋ฆฌ์Šค ์ค€๋น„์™€ ๋ฐฐํฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต
๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ ์ž์œ ๋กญ๊ฒŒ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • ๋ธŒ๋žœ์นญ ๊ทœ์น™์€ ์—†์Œ master, develop, feature, release, hotfix ๋“ฑ์˜ ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ„
๋ณต์žก๋„ Git ์ž์ฒด๋Š” ๋ธŒ๋žœ์น˜ ์ „๋žต์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ณ ์ •๋œ ๋ธŒ๋žœ์นญ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฒด๊ณ„์ ์ธ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์คŒ
์‚ฌ์šฉ ์ƒํ™ฉ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ๋‹จ์ผ ๋ธŒ๋žœ์น˜๋‚˜ ๊ฐ„๋‹จํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์„ ์‚ฌ์šฉํ•  ๋•Œ ์ ํ•ฉ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ํŒ€ ํ˜‘์—…์—์„œ ์ฒด๊ณ„์ ์ธ ๋ธŒ๋žœ์นญ ์ „๋žต์„ ํ•„์š”๋กœ ํ•  ๋•Œ ์ ํ•ฉ. ๋ช…ํ™•ํ•œ ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ์™€ ๋ฐฐํฌ ์ฃผ๊ธฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ
  • Git์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ์ด๋ฉฐ, ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค.
  • Git Flow๋Š” Git์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์œผ๋กœ, ๊ฐœ๋ฐœ, ๋ฆด๋ฆฌ์Šค, ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.
interface์™€ abstract ์ฐจ์ด? -> ์ผ๋ฐ˜์ ์ธ ์ •์˜, ์ฝ”ํ‹€๋ฆฐ์—์„œ์˜ ์ •์˜
์ผ๋ฐ˜ Interface Abstract Class
๊ตฌํ˜„ ๋‚ด์šฉ ๊ตฌํ˜„์ด ์—†๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉฐ, ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ผ๋ถ€ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์™€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ํฌํ•จ ๊ฐ€๋Šฅ. ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๊ฐ€์ง
๋‹ค์ค‘ ์ƒ์† ํ•œ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ถ”์ƒ ํด๋ž˜์Šค๋งŒ ์ƒ์† ๊ฐ€๋Šฅ
๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ. ์ƒ์ˆ˜๋งŒ ์„ ์–ธ ๊ฐ€๋Šฅ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ณตํ†ต ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
์ƒ์„ฑ์ž ์ƒ์„ฑ์ž ์—†์Œ ์ƒ์„ฑ์ž ์žˆ์Œ. ์ƒ์†๋œ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ
๋ชฉ์  ์ฃผ๋กœ **๋™์ž‘(ํ–‰๋™)**์„ ์ •์˜ํ•˜๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์ด ๊ฐ™์€ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋„๋ก ์š”๊ตฌํ•  ๋•Œ ์‚ฌ์šฉ ๊ณตํ†ต๋œ ํŠน์„ฑ ๋ฐ ๋™์ž‘์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋“ค ๊ฐ„์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ
์ธ์Šคํ„ด์Šคํ™” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€, ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ถ”์ƒ ํด๋ž˜์Šค๋„ ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€, ๋ฐ˜๋“œ์‹œ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•จ
์‚ฌ์šฉ ์ƒํ™ฉ ํด๋ž˜์Šค ๊ฐ„ ๊ณตํ†ต์ ์ธ ํ–‰๋™์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ ๊ณตํ†ต์ ์ธ ์†์„ฑ๊ณผ ๋™์ž‘์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๊ธฐ๋ณธ ๋™์ž‘์„ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€๋งŒ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ
  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„์ด ์—†๋Š” ๋ฉ”์„œ๋“œ ์„ ์–ธ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ๋™์ž‘์„ ์ •์˜ํ•˜๊ณ , ๋‹ค์ค‘ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ์™€ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋ฉฐ, ์ƒ์†์„ ํ†ตํ•ด ๊ณตํ†ต ๋™์ž‘์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ์ผ ์ƒ์†๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
kotlin Interface(์—ฌ๊ธฐ์„œ ์ข€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค) Abstract Class
๊ตฌํ˜„ ๋‚ด์šฉ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์™€ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ํฌํ•จํ•œ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ์„ ์–ธ ๊ฐ€๋Šฅ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์™€ ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ํฌํ•จ ๊ฐ€๋Šฅ
๋‹ค์ค‘ ์ƒ์† ํ•œ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ถ”์ƒ ํด๋ž˜์Šค๋งŒ ์ƒ์† ๊ฐ€๋Šฅ
ํ”„๋กœํผํ‹ฐ(์ค‘์š”) ์ถ”์ƒ ํ”„๋กœํผํ‹ฐ์™€ ๊ธฐ๋ณธ getter๋ฅผ ์„ ์–ธ ๊ฐ€๋Šฅ. **์ƒํƒœ(๋ฉค๋ฒ„ ๋ณ€์ˆ˜)**๋Š” ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
์ƒ์„ฑ์ž ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ. ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์†์„ ํ†ตํ•ด ์ƒ์„ฑ์ž ํ˜ธ์ถœ ๊ฐ€๋Šฅ
๋ชฉ์  ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ๊ณตํ†ต ๋™์ž‘์„ ์ •์˜ํ•˜๊ณ , ๊ฐ™์€ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋„๋ก ์š”๊ตฌํ•  ๋•Œ ์‚ฌ์šฉ ๊ณตํ†ต๋œ ์ƒํƒœ์™€ ๋™์ž‘์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋“ค ๊ฐ„์— ๊ณตํ†ต ๊ตฌํ˜„์„ ๊ณต์œ ํ•  ๋•Œ ์‚ฌ์šฉ
์ธ์Šคํ„ด์Šคํ™” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€, ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ถ”์ƒ ํด๋ž˜์Šค๋„ ์ธ์Šคํ„ด์Šคํ™” ๋ถˆ๊ฐ€, ๋ฐ˜๋“œ์‹œ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•จ
์‚ฌ์šฉ ์ƒํ™ฉ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ๋™์ผํ•œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์ค‘ ์ƒ์†์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค ๊ฐ„์— ๊ณตํ†ต๋œ ์ƒํƒœ์™€ ๋™์ž‘์„ ๊ณต์œ ํ•˜๊ณ , ๋‹จ์ผ ์ƒ์† ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ
์•ˆ๋“œ๋กœ์ด๋“œ ๊ถŒ์žฅ ์•„ํ‚คํ…์ณ?
graph TD
    subgraph Presentation Layer
        A[View]
        A -->|์‚ฌ์šฉ์ž ์ž…๋ ฅ| B[ViewModel]
        B -->|LiveData or StateFlow| A
    end
    
    subgraph Domain Layer - optional
        B --> F[UseCase]
    end
    
    subgraph Data Layer
        F --> C
        B --> C[Repository]
        C --> D[Local Database]
        C --> E[Network]
        E --> C
        D --> C
    end

https://developer.android.com/topic/architecture?hl=ko&_gl=1*ee4yak*_up*MQ..*_ga*MTQwODM3NjUyMy4xNzI3NjEyMzEz*_ga_6HH9YJMN9M*MTcyNzYxMjMxMi4xLjAuMTcyNzYxMjMxMi4wLjAuNzk3MTIxNjY0

 

์•ฑ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ  |  Android Developers

์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. ์ด ๊ฐ€์ด๋“œ์—๋Š” ๊ณ ํ’ˆ์งˆ์˜ ๊ฐ•๋ ฅํ•œ

developer.android.com

 

  • ๋ชจ๋“ˆํ™”: ๊ฐ ๋ ˆ์ด์–ด๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๊ณ , ํŒ€์—์„œ ํ˜‘์—…ํ•˜๊ธฐ ์šฉ์ดํ•ด์ง„๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ: ๊ฐ ๋ ˆ์ด์–ด๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ํŠน์ • ๊ธฐ๋Šฅ์ด ์ˆ˜์ •๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
  • ํ™•์žฅ์„ฑ: ๋ ˆ์ด์–ด ๊ฐ„์˜ ์˜์กด์„ฑ์ด ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ: ๊ฐ ๋ ˆ์ด์–ด๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.

 

Google์˜ ์•ฑ์•„ํ‚คํ…์ณ์—์„œ๋Š” ‘domain layer๊ฐ€ data layer๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค’์ด๊ณ ,
๋ฐฅ์˜ ํด๋ฆฐ ์•„ํ‚คํ…์ณ๋Š” Domain layer๋Š” ์•„๋ฌด๋„ ๋ชฐ๋ผ์•ผ ํ•˜๊ณ ,Presentation layer, Data layer๊ฐ€ Domain layer์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

๊ทผ๋ฐ ๊ตฌ๊ธ€์˜ ์•ฑ ์•„ํ‚คํ…์ณ์—์„œ Domain๋ ˆ์ด์–ด๋Š” optional์ด๋‹ค. ๋ทฐ๋ชจ๋ธ์—์„œ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๊ด€ํ•˜๋‹ค.

 

 


::์ถœ์ฒ˜::

https://1-three.tistory.com/129

https://velog.io/@godmin66/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-%EC%A4%91-%EB%82%98%EC%99%94%EB%8D%98-%EC%A7%88%EB%AC%B8-%EB%AA%A9%EB%A1%9D

https://github.com/devSquad-study/2023-CS-Study/tree/main

https://github.com/4z7l/tech_interview.zip

https://github.com/VSFe/Tech-Interview?tab=readme-ov-file

https://github.com/WooVictory/Ready-For-Tech-Interview

https://github.com/gyoogle/tech-interview-for-developer

https://github.com/JaeYeopHan/Interview_Question_for_Beginner

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT