우리나라는 왜 Java를 사용할까? Java 중에서도 왜 Spring 프레임워크를 사용할까? 단지 선점효과일까? 하지만 그렇게 생각한다 해도 개발에 있어 효율적이지 않다면 선점이 되지도 않았을테다. 그렇다면 Spring을 사용함으로써 얻는 이점이 무엇이길래 Spring을 사용할까?
나는 궁금해졌다. 그리고 확인해 보고싶었다. 그래서 나는 인프런에서 스프링 기본 강의를 결제해서 들어 보았고 사람들이 많이 사용하는 이유를 어렴풋이라도 이해할 수 있었다. Spring을 공부하고 사용한다면 가장 처음 배우고 가장 강조되는 개념인 DI(Dependency Injection), 의존성 주입. 어떠한 언어를 사용한다 해도 꼭 필요한 기술인 듯 했다. 프로젝트를 위해, 그리고 개발자를 위해.
DI(Dependency Injection)
그렇다면 DI는 뭘까? 위에도 언급했듯 해석해 보면 의존성 주입이라고 한다.
차근차근 들어가 보자. 의존성이란 뭘까?
의존성은 어떤 하나의 모듈에서 다른 모듈을 불러다 사용하는 것을 생각하면 되겠다.
간략한 예시를 들어보자면
예시
package main
import "monkey/a"
func main() {
t := a.GetAtest()
t.SayTest()
}
이 코드에서 메인 패키지는 a패키지와 의존 관계에 있다고 말할 수 있다.
DI는 이 의존 관계에 있는 리소스를 추상화하는 코딩 방식이다. 의존성이 추상화됐으므로 리소스를 변경할 때에 해당 리소스를 사용하는 객체 측의 코드는 크게 변경할 필요가 없다. DI를 잘 모른다면 이부분이 와닿지 않을 가능성이 100%다. 나 역시 아직 이해를 했다고 말 할수 있을지 의문이 든다. 어쩌겠는가 계속해서 공부해야지!
그렇다면 DI를 적용한 코드는 어떤 모습을 하고 있을까?
간단히 예시를 만들어 보겠다.
package main
import "fmt"
type printer interface {
sayHello()
}
func hello(obj printer) {
obj.sayHello()
}
type a struct{}
type b struct{}
func (ao a) sayHello() {
fmt.Println("a 객체는 이런일을 하지")
}
func (bo b) sayHello() {
fmt.Println("b 객체는 이런일을 하지")
}
func main() {
var aObject a
hello(aObject)
var bObject b
hello(bObject)
}
코드 순서대로 설명해 보겠다.
- 인터페이스 printer는 hello라는 함수를 가지고 있다.
- hello 함수는 printer 인터페이스를 매개변수로 받고 printer가 가진 sayHello함수를 호출한다.
- 구조체 a와 b를 만들어 주었으며 각각의 sayHello 함수를 만들어 주었다.(Go는 덕타입 언어라 이렇듯 인터페이스가 가진 메소드를 지정해 준다면 그 인터페이스로써의 역할을 할 수 있다.)
- main 함수에 각각의 객체를 초기화하고 hello 함수에 매개변수로 넣어보겠다.
결과
hello 함수에 매개변수로 준 객체에 따라 결과물이 달라지는 것을 볼 수 있다.
DI를 사용한 코딩 방식의 장점
그렇다면 DI를 사용한 코딩 방식의 장점은 무엇이 있을까?
- 의존성을 추상적이거나 일반적인 방법으로 표현함으로써 작업을 진행함으로써 알아야 할 지식을 줄여준다.
- 의존성으로부터 격리시켜 테스트 코드 작성을 가능하도록 한다.
- 코드를 확장하거나 변경할 때 영향을 최소화한다.
마무리
DI는 시리즈로 포스팅할 계획이다. 장점에 대해서 하나하나 깊이있게 파헤쳐 봐야지.
DI는 Spring에서만 사용할 수 있는 기술이 아니다. 또한 효율적인 코드를 작성하기 위해선 꼭 필요한 기술이다. 하지만 나는 그것이 무엇인지도 모르고 Spring에서만 사용하는 기술로 생각하였다. 제대로된 프로젝트 경험이 이래서 중요한가보다.
'Study > Go' 카테고리의 다른 글
[Go] 고루틴(GoRoutine) 심화(2) - 클로저 함수, 메모리 (0) | 2022.04.28 |
---|---|
[Go] 고루틴(GoRoutine) 심화(1) - 합류지점 (0) | 2022.04.16 |
[Go] Go의 메모리 할당 (0) | 2022.04.08 |
[Go] Heap 자료구조를 사용하는 우선순위 큐 (Priority Queue) (0) | 2021.10.04 |
[Go] 클로저(Closure)를 활용하여 생성기(generator) 제작 (0) | 2021.10.02 |