(+) Application Layer - DI

get_it ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด์„œ ์†์‰ฝ๊ฒŒ DI ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. DI ๊ตฌํ˜„์— ์žˆ์–ด์„œ get_it ํŒจํ‚ค์ง€ ๋ง๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋„ ๋งŽ์ด๋“ค ์“ฐ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ด๊ฒŒ ๊ฐ€์žฅ ๋ณดํŽธ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์•Œ๊ณ  ์žˆ๋‹ค.

registerSingleton vs registerLazySingleton

final locator = GetIt.instance;

Future<void> init() async {
  locator.registerSingleton<T>(T instance);
  
  /// registers a type as Singleton by passing an [instance] of that type
  /// that will be returned on each call of [get] on that type
final locator = GetIt.instance;

Future<void> init() async {
  locator.registerLazySingleton<T>(FactoryFunc<T> func);
  
  /// registers a type as Singleton by passing a factory function that will be called
  /// on the first call of [get] on that type  

๊ฐ•์˜์—์„œ๋Š” registerLazySingleton ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ์ด ์™ธ์— ๋‹ค๋ฅธ ์œ ํˆฌ๋ธŒ ๊ฐ•์˜arrow-up-right ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ registerLazySingleton ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

registerLazySingleton ๋Š” ๋ง ๊ทธ๋ž˜๋„ lazy ํ•˜๊ฒŒ register ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ธ๋ฐ ์œ„ ์„ค๋ช…์—๋„ ์“ฐ์—ฌ์žˆ๋“ฏ์ด register ํ•˜๋Š” ๋Œ€์ƒ ์ž์ฒด๊ฐ€ registerLazySingleton ์—์„œ๋Š” instance ๊ฐ€ ์•„๋‹ˆ๋ผ factory function ์ด๋‹ค. ๋น„์Šทํ•œ ์˜ˆ๋กœ JPA ์—์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์ฒซ๋ฒˆ์งธ call ๋•Œ ๋น„๋กœ์†Œ ์‹ค์ œ instance ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” chat gpt ์—์„œ ์ฐจ์ด๋ฅผ ๋ฌผ์—ˆ์„๋•Œ ๋‚˜์˜จ ์„ค๋ช…์ด๋‹ค.

get_it ํŒจํ‚ค์ง€๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€์—์„œ๋Š” singleton๊ณผ lazySingleton ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋“ฑ๋ก ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

singleton์€ ์ฒ˜์Œ ์‚ฌ์šฉ๋  ๋•Œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ดํ›„์—๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋“ฑ๋ก ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. get_it ํŒจํ‚ค์ง€์—์„œ registerSingleton ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

azySingleton์€ ์ฒ˜์Œ ์‚ฌ์šฉ๋  ๋•Œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ดํ›„์—๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋“ฑ๋ก ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. singleton๊ณผ์˜ ์ฐจ์ด์ ์€ ์ฒ˜์Œ ์‚ฌ์šฉ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. get_it ํŒจํ‚ค์ง€์—์„œ registerLazySingleton ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ•์˜๋‚ด DI ์‚ฌ์šฉ ์˜ˆ์ œ

๊ฐ•์˜์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

initAppModule ์—์„œ application layer ์˜ di๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ , ๋กœ๊ทธ์ธ view ์—์„œ ํ•„์š”ํ•œ usecase, viewModel ์€ initLoginModule ์—์„œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด resetModules ์—์„œ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด์„œ๋„ route ์—์„œ๋„ ๋”ฐ๋กœ ๋˜ ๋„ฃ์–ด์ฃผ๊ณ  ์žˆ๋‹ค.

registerFactory

๊ทธ๋ฆฌ๊ณ  usecase, viewModel ์˜ di ์ฒ˜๋ฆฌ์™€ application layer ์—์„œ์˜ di ์ฒ˜๋ฆฌ ์‚ฌ์ด์— ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋ผ ํ•œ๋‹ค๋ฉด registerFactory() ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

registers a type so that a new instance will be created on each call of [get] on that type ์„ค๋ช…๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ Factory ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ๊ฐ•์˜์—์„œ ์‚ฌ์šฉ๋œ usecase, viewModel ์— ๋Œ€ํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹์ด๋‹ค. ๊ฐ•์˜์—์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ์ด ๋ถ€๋ถ„์„ ์™œ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€๋ฅผ ์„ค๋ช…์„ ํ•ด์ฃผ์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ usecase, viewModel ์— ๋Œ€ํ•ด์„œ registerLazySingleton ๊ณผ registerFactory ๋ฅผ ์‚ฌ์šฉํ–ˆ์„๋•Œ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ ๋˜๋Š”๊ฐ€๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ผ๋‹จ registerLazySingleton ์˜ ๊ฒฝ์šฐ ๊ณ„์† ์ผ๋˜ ๊ฒƒ์„ ์žฌํ™œ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๊ณ  registerFactory ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์“ธ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

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

๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ DI ์‚ฌ์šฉ ํ˜•ํƒœ

์•„์ง ํ”„๋กœ์ ํŠธ๊ฐ€ ์™„์„ฑ ๋‹จ๊ณ„๊ฐ€ ์•„๋‹ˆ๊ณ  ์ดˆ๊ธฐ ๊ตฌํ˜„ ๋‹จ๊ณ„๋ผ์„œ ์ฝ”๋“œ ์–‘์ด ๋งŽ์ง€ ์•Š์€๋ฐ ์–ด๋А ์ •๋„ ํ‹€์ด ์žกํ˜€์žˆ์–ด์„œ ์ผ๋‹จ ์ฝ”๋“œ๋ฅผ ๋‚จ๊ธด๋‹ค. ๊ฐ•์˜์—์„œ๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค init ์‹œํ‚จ ๋ฐ˜๋ฉด์— ๋‚˜๋Š” ์ €๋ ‡๊ฒŒ ์ผ๋‹จ private method ๋กœ ๋ถ„๋ฅ˜๋ฅผ ํ•ด๋‘” ๋’ค ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ(prepareDependencies()) ์— ๋ชจ๋‘ ๋„ฃ์–ด๋‘๊ณ  ์ด๋ฅผ ์•ฑ ์‹คํ–‰์‹œ ๋ฐ”๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

Last updated