[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 ์ปจํ…์ŠคํŠธ์—๋Š” ํ•„์š”ํ•œ ์ƒ์„ฑ ํ•จ์ˆ˜๋“ค์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋์ด๋‹ค.

๊ทธ๋Ÿผ ์ž˜ ๋™์ž‘ํ•  ๊ฒƒ์ด๋‹ค.


์ฐธ์กฐ
https://uber-go.github.io/fx/get-started/