[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