의존성 주입
의존성 주입을 위해서는 인터페이스에 대한 이해가 필요하므로 이전에 structs 섹션을 읽었다고 가정한다.
프로그래밍 커뮤니티에는 의존성 주입과 관련해서 많은 오해가 있다. 이 가이드는 당신에게 어떻게 아래의 항목들이 가능한지 알려줄 것이다.
- 프레임워크가 필요 하지 않다.
- 디자인을 지나치게 복잡하게 하지 않는다.
- 테스트를 용이하게 한다.
- 그것이 훌륭한 범용 함수를 작성하게 할 것이다.
Hello-world 장에서 했던 것처럼 누군가를 맞이하는 함수를 작성하고 싶지만 이번에는 실제 print를 테스트할 것이다.
요약하자면 다음은 그 함수의 모습이다.
func Greet(name string) {
fmt.Printf("Hello, %s", name)
}
그러나 이것을 어떻게 테스트할 수 있는가?
fmt.Printf
를 호출하면 stdout으로 인쇄된다. 이는 테스트 프레임 워크를 사용하여 캡처하기가 매우 어렵다.우리가 해야할 일은 print 하는 것의 의존성을 주입 (인자를 넘기는 것을 그냥 fancy 하게 표현한 것이다) 할 수 있도록 한다.
우리의 함수는 어디에서 또는 어떻게 print가 발생하는 지를 신경 쓸 필요가 없다. 그래서 우리는 구체적인 type보다는 interface type을 허용해야 한다.
그렇게 한다면, 우리가 제어하는 어떤 것으로 출력하도록 구현을 변경하여 테스트할 수 있다. "실생활"에서는 stdout에 쓰는 것을 주입한다.
fmt.Printf
의 소스 코드를 보면 연결하는 방법을 알 수 있다.// 쓰여진 바이트 수와 발생한 error를 반환합니다.
func Printf(format string, a ...interface{}) (n int, err error) {
return Fprintf(os.Stdout, format, a...)
}
흥미롭다! 내부적으로
Printf
는 os.Stdout
을 전달하는Fprintf