[Go] fx: DI ๋๊ตฌ
fx๋ uber์์ ์คํ์์ค๋ก ์ ๊ณตํ๋ ์์กด์ฑ ์ฃผ์ (DI: Dependency Injection) ๋๊ตฌ๋ค.
์ค์น
์ค์น๋ ๊ฐ๋จํ๋ค. ํ๋๋ง ๊น์์ฃผ๋ฉด ๋๋ค.
go get go.uber.org/fx@v1

๊ธฐ๋ณธ๊ตฌ์กฐ
fx๋ฅผ ์ฐ๋ ค๋ฉด ์ง์ ์ ๋จ๊ณ์์๋ถํฐ fx๋ก ๋ํ์ ํด์ค์ผ ํ๋ค.

package main
import "go.uber.org/fx"
func main() {
fx.New().Run()
}
fx ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค์์, ์คํ์ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ๋ก๊ทธ๋ ๋จ๊ณ
์คํ์ด ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๋๋ก๋ ์๋ฌด๊ฒ๋ ๋์ง ์๋๋ค.
์๋ฌด๊ฒ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Invoke
Invoke๋ ์ค์ ๋ก ์คํ๋ ๋ก์ง์ ๋ํ ๋ถ๋ถ์ด๋ค.
๋ผ์ดํ์ฌ์ดํด ๊ฐ์ ํ๋ ์ ๋ฌ๋ฐ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ , ๊ฑฐ๊ธฐ์ ์คํ๋ ๋ก์ง์ ์ง์ด๋ฃ์ผ๋ฉด ๋๋ค.
์ฌ๊ธฐ์๋ ๋ก๊ทธ๋ง ์ฐ๊ณ ๋ง์์ง๋ง, ๋ณดํต์ ๋ฃจํ๋ฅผ ๋๋ฆฌ๋ฉด์ ํด๋ง์ ํ๊ฑฐ๋ ์๋ฒ๋ฅผ ๋์ฐ๊ฑฐ๋ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์คํํ๋ฉด
์คํ์ด ๋ ๊ฒ์ด๋ค.
Invoke: ๋์์ฑ
Invoke์๋ ์ฌ๋ฌ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
ํ์ง๋ง ๊ทธ๊ฒ ๋ณ๋๋ก ๋์์ ๋๋ค๋ ๋ง์ ์๋๋ค.
Invoke๋ ์์ ํ ๋๊ธฐ์ ์ผ๋ก ํ๋์ฉ๋ง ์คํ๋๋ฉฐ, ์ธ์๋ก ์ ๋ฌ๋ ์์๋๋ก ๋์ํ๋ค.
๊ทธ๋์ ์์ ์ฝ๋๋ ๋๋ค ๋ฌดํ๋ฃจํ๋ฅผ ๋๊ธฐ ๋๋ฌธ์, ๋จผ์ ๋จผ๋ฌ๋ ํ๋ก์ธ์ค Hello๋ง ๋์์ด ์คํ๋๋ค.
๊ทธ๋์ ๋น๋๊ธฐ์ ์ธ ๋ฌด์ธ๊ฐ๋ฅผ ํ์๋ก ํ๋ค๋ฉด ๊ณ ๋ฃจํด์ ๋๋ฆฌ๊ฑฐ๋ ํด์ผ ํ๊ณ ,
๊ทธ๋ฐ๊ฒ ํ์ํ๊ฒ ์๋๋ผ๋ฉด ๋ฌดํ๋ฃจํ๊ฐ ์กด์ฌํ๋ ์ต์ข
ํ๋ก์ธ์ค๋ฅผ ๋งจ ๋ค๋ก ๋นผ๊ณ ๊ทธ ์์ ์์ ์ฌ์ ์์
๋ค์ ๋ถ๋ฆฌํ๋ฉด ์ ์ ํ ๊ฒ์ด๋ค.
Provide
Invoke๊ฐ ๊ฐ๊ฐ์ ๋ ๋ฆฝ๋ ํ๋ก์ธ์ค๋ผ๋ฉด, Provide๋ ๋ชจ๋ํ ๋จ์๋ผ๊ณ ํ ์ ์๋ค. ์ด๊ฒ ํต์ฌ์ด๋ค.
๊ฐ๋ น, ์์ Hello Invoke์ ๊ฒฝ์ฐ์๋, ๋ก๊ทธ๋ฅผ ์ฐ๋ ๋ถ๋ถ์ด ๋น์ฆ๋์ค ๋ก์ง์ด๋ผ๊ณ ํ๋ค๋ฉด ๊ทธ๊ฑธ ๋ถ๋ฆฌํ๋๊ฒ ๋ชจ๋ํ ์ธก๋ฉด์์ ์ข์ ์ ์๋ค.
๊ทธ๊ฑธ ๋จผ์ ๋ณ๋์ ํ์ ์ผ๋ก ๋ถ๋ฆฌํด์ ๊ตฌํํ๊ณ

๊ทธ๊ฑธ ํฌ์ธํฐ๋ก ๋ฐํํ๋ ์์ฑ ํจ์๋ฅผ ํ๋ ๊ตฌํํ๋ค.

๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑธ fx.Provide๋ฅผ ํตํด ํ๋ก๋ฐ์ด๋๋ก ๋ฑ๋กํ๋ค.
๊ทธ๋ฌ๋ฉด ์ HelloProcessor๋ผ๋ ๊ฐ์ฒด๋ fx์ ์ปจํ
์คํธ ๋ด์์๋ ์ธ์ ๋ DI๋ก ์ฃผ์
๋ ์ ์๋ค.
์ด๊ฒ ๋ฌด์จ ์๋ฆฐ๊ฐ ํ๋ฉด์
์ด๋ ๊ฒ ๋ค๋ฅธ Provide ํจ์๋ Invoke ํจ์์ ํ๋ผ๋ฏธํฐ์ ์ ์๋ฅผ ํด๋๋ฉด fx ์ปจํ
์คํธ๊ฐ ๋ค๊ณ ์๋ Provider๋ค์ ์๋์ผ๋ก ์ฃผ์
ํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ฐ๊ฑธ DI๋ผ๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์คํํ๋ฉด
์ ๋์ํ ๊ฒ์ด๋ค.
์๋ฒ ๊ตฌ์ฑํ๊ธฐ (with echo)
echo์์ fx๋ฅผ ํ์ฉํด์ ๋ ์ด์ด๋ฅผ ๋ถ๋ฆฌํ๊ณ DI๋ฅผ ์ ์ฉํ๋ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ๋ค.
echo ์ด์ธ์ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ค๋ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ์ ์์ ๊ฒ์ด๋ค.
์ผ๋จ ์๋น์ค ๋ ์ด์ด์ ์ปจํธ๋กค๋ฌ ๋ ์ด์ด๋ง ์ถ๊ฐํ๊ฒ ๋ค๊ณ ๊ฐ์ ํ๋ค. ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ ๋ฒ๋ ์๋น์ค์ ๋ณ ์ฐจ์ด๊ฐ ์์ ๊ฒ์ด๋ค.
์๋์ ๊ฐ์ด ์๋น์ค์ ๋ํ ์ธํฐํ์ด์ค์ ๊ทธ ๊ตฌํ์ฒด๋ฅผ ๊ตฌํํ๋ค.
๋ณ๋ก ํน๋ณํ ๊ฒ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ Provide์ ์ ๊ณตํ ์์ฑ ํจ์๋ ํ๋ ๋ง๋ค์ด์ค๋ค. ์ถ์ํ๋ฅผ ์ํด์ ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ์์ฑ ํจ์๋ ์ธํฐํ์ด์ค๋ก ๋ฐ์ฑํด์ ๋ฐํํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ปจํธ๋กค๋ฌ๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๊ตฌํํ๋ค.
์ปจํธ๋กค๋ฌ๋ ์๋น์ค๋ฅผ ์ข
์์ฑ์ผ๋ก ๊ฐ์ง๋๋ฐ, ์์ฑ ํจ์์์ DI๋ ์๋น์ค ๊ฐ์ฒด๋ฅผ ๋ฐ์์์ ์ธํฐํ์ด์ค๋ก ๋ค๊ณ ์๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ตฌ์ฑ์ด ๋์ด์๊ณ , DI๋ฅผ ํตํด ๋ชจ๋๋ค์ด ์ฃผ์
๋๊ธฐ ๋๋ฌธ์, ํ
์คํธ ๋ฑ์ ์ํด์ fx context์ ์ฃผ์
ํ๋ ๊ฐ์ฒด๋ง Real์์ Fake ๋ฒ์ ์ผ๋ก ๊ต์ฒดํด์ ์ฌ์ฉํด๋ ์์ ํ๊ฒ ๋์ํ๊ฒ ๋ง๋ค ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ์ธ ์ง์ ์ ์์๋ ์ปจํธ๋กค๋ฌ๋ฅผ DI๋ฐ์์ ๋ผ์ฐํ ์ ํด์ค๋ค.
์ปจํธ๋กค๋ฌ๋ ์๋น์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ถ์ํ๊ฐ ๋์ด์๋ค.
๊ทธ๋ฆฌ๊ณ fx ์ปจํ ์คํธ์๋ ํ์ํ ์์ฑ ํจ์๋ค์ ๋ฃ์ด์ฃผ๋ฉด ๋์ด๋ค.

๊ทธ๋ผ ์ ๋์ํ ๊ฒ์ด๋ค.

