[Go] DI: wire

wire๋Š” ๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  DI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

fx ๊ฐ™์€ ๊ธฐ์กด์˜ DI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋Ÿฐํƒ€์ž„ ๋ฆฌํ”Œ๋ ‰์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ DI๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๋ฉด, ์ด๊ฑด codegen ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋˜๋„๋ก ์ปดํŒŒ์ผํƒ€์ž„์— ์ฒ˜๋ฆฌํ•˜๋Š” ์Šคํƒ€์ผ์ด๋‹ค.

๋Ÿฐํƒ€์ž„ ์ฒ˜๋ฆฌ๊ฐ€ ๋น„๊ต์  ์ ์–ด ์„ฑ๋Šฅ์ ์œผ๋กœ๋„ ์ข€ ๋‚ซ๊ณ , ์ข…์†์„ฑ ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผํƒ€์ž„์— ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒŒ ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด๊ธฐ๋„ ํ•˜๋‹ค.




์„ค์น˜

์ด๊ฑด codegen ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ๋ ค์„œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ „์šฉ CLI ๋„๊ตฌ๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค.

go install github.com/google/wire/cmd/wire@latest

์ ๋‹นํžˆ ๊น”์•„์„œ, ์‹คํ–‰์ด ๋˜๋ฉด ๋œ ๊ฒƒ์ด๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํ•„์š”ํ•˜๋‹ค.
์ผ์ข…์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์„ค์ •์„ ํ•˜๋Š”๋ฐ ์“ด๋‹ค.

go get github.com/google/wire




์˜ˆ์ œ์ฝ”๋“œ

์ž, ๋จผ์ € ์˜ˆ์ œ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ•ด๋ณด๊ฒ ๋‹ค.
์ตœ์ƒ์œ„ ๋ ˆ์ด์–ด์ธ UserService, ๊ทธ๋ฆฌ๊ณ  Repository 2๊ฐœ, Adapter 1๊ฐœ๋‹ค. ๋‹ค ๊ณ„์ธต์ ์œผ๋กœ ์ข…์† ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด๊ฑธ DI ์—†์ด ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•ด์ง€๊ณ , ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

wire๋ฅผ ํ†ตํ•ด ์ด๊ฑธ ์ข€ ๋งค๋„๋Ÿฝ๊ฒŒ ํ’€์–ด๋ณด์ž.




wire ๊ธฐ๋ณธ ์„ธํŒ…

๋จผ์ € wire.go๋ผ๋Š” ์ด๋ฆ„์˜ ํŠน์ˆ˜ํ•œ ์„ค์ •ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
์ด๊ฑด ๋”ฑ codegen์šฉ์ด๊ณ , ์‹ค์ œ ์ปดํŒŒ์ผ ๋Œ€์ƒ์—๋Š” ์†ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ์—์„œ ์ œ์™ธ๋˜๋„๋ก ์„ค์ •ํ•ด์ค€๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํƒ€์ž…์œผ๋กœ ์‚ผ๊ณ , ๋นˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์–ด์ฐจํ”ผ ํƒ€์ž…๋งŒ ํ•„์š”ํ•˜๋‹ค.
๊ทธ๋ฆฌ๊ณ  wire.Build ๋‚ด์— ๋“ค์–ด๊ฐ€๋Š” ์ƒ์„ฑ ํ•จ์ˆ˜๋“ค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…๊ณผ ๋ฐ˜ํ™˜ํƒ€์ž…์„ ๋ถ„์„ํ•ด์„œ DI ์‚ฌ์ดํด ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ € ์ƒํƒœ์—์„œ wire CLI๋กœ, wire.go๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐ์–ด ๋Œ๋ ค์ฃผ๋ฉด

wire_gen์ด๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ๊ธด๋‹ค.

์ด๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฐ๊ณผ๋ฌผ์ด๋‹ค.

๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์ ์ ˆํžˆ ์“ฐ๋ฉด ๋œ๋‹ค.

wire์˜ codegen ๋ฐฉ์‹์„ ์‚ฌ์šฉํ• ๋•Œ์˜ ์žฅ์ ์€, ์„ฑ๋Šฅ๋„ ์„ฑ๋Šฅ์ด์ง€๋งŒ DI ๋ˆ„๋ฝ์„ ๋” ๋น ๋ฅด๊ฒŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํฌ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ €๊ธฐ์„œ ํ•„์ˆ˜์ ์ธ DatabaseAdapter์˜ ์ƒ์„ฑ์ด ๋ˆ„๋ฝ๋œ๋‹ค๋ฉด

wire๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ์ฆ‰์‹œ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ๋‹ค.

๋˜ ๋ฏธ์‚ฌ์šฉ ์ข…์†์„ฑ์— ๋Œ€ํ•ด์„œ๋„ ๋ฏผ๊ฐํ•˜๊ฒŒ ๊ฐ์ง€ํ•œ๋‹ค.

์ด๊ฒƒ๋„ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ๋‚˜ ์‚ฌ์šฉ๋ฒ•์€ ์ด ์ •๋„๋‹ค.


์‹ฌํ™” ๊ธฐ๋Šฅ์€ ๋ณ„๋„ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://github.com/google/wire/blob/main/docs/guide.md#advanced-features



์ฐธ์กฐ
https://github.com/google/wire
https://github.com/google/wire/blob/main/_tutorial/README.md
https://github.com/google/wire/blob/main/docs/guide.md#advanced-features