- Published on
스프링 프레임워크 첫걸음 - 3장 : 스프링 프레임워크 핵심 기능
- Authors
- Name
- 손예지(Liv)
지난 시간에 이어 이번시간 부터는 본격적으로 스프링 프레임워크에 대해서 알아봅니다. 3장에서는 스프링 프레임워크의 핵심기능인 의존성 주입과 관점 지향 프로그래밍에 대해서 다루고 있습니다.
1. 의존성과 DI 컨테이너
의존성 주입에 대해서 다루기 전에 자바의 의존성에 대해서 먼저 이해할 필요가 있습니다. 의존에는 클래스 의존(구현 의존) 과 인터페이스 의존 두가지 유형이 있습니다.
클래스의 의존성은 아래 예시를 통해 쉽게 이해할 수 있습니다.
A 클래스에서 new 키워드를 사용해 인스턴스를 생성합니다. 그리고 인스턴스에서 클래스 B의 methodX 메서드를 호출합니다.
aMethod(){
B b = new B();
b.methodX();
}
이때 클래스 A에서 클래스 B가 아닌 클래스 C의 cMethod를 호출하도록 변경이 필요한 경우, 아래와 같이 클래스 A의 수정이 필요합니다.
aMethod(){
C c = new C();
c.methodY();
}
동일한 예시로 인터페이스 의존에 대해서 살펴보겠습니다. A 클래스에서 methodX 메서드를 호출할때 인터페이스로 추상화된 I를 사용한다고 해보겠습니다.
aMethod(){
I i = new B();
i.methodX();
}
만약, A클래스에서 B클래스가 아닌 C 클래스의 methodX 메서드를 호출해야한다면 어떻게 수정해야 할까요? 인터페이스 의존성을 활용한다면 B 클래스가 아닌 C 클래스의 인스턴스를 생성하도록 한 곳만 변경해 주면 됩니다.
aMethod(){
I i = new C();
i.methodX();
}
인터페이스 의존은 변수의 이름과 메서드 명을 변경할 필요 없이 수정할 수 있기 때문에 변경에 더 용이합니다.
이 부분을 스프링의 DI 컨테이너를 사용해서 구현한다면 어떻게 구현할 수 있을까요? 스프링 프레임워크는 new 키워드를 사용하지 않고 구현한 클래스를 인스턴스로 만들어주는 기능을 제공합니다. 클래스 의존성과 인터페이스 의존성을 사용했을때는 각각 세 부분, 한 부분의 수정이 필요했었는데, DI 컨테이너를 사용하면 정적인 클래스 의존관계를 수정하지 않고 동적인 객체 인스턴스의 의존관계를 변경할 수 있습니다.
저자는 아래 다섯가지 규칙을 통해 DI 컨테이너를 사용할 것을 제안합니다.
- 인터페이스를 이용하여 의존성을 만든다.
- 인스턴스를 명시적으로 생성하지 않는다.
- 어노테이션을 클래스에 부여한다.
- 스프링 프레임워크에서 인스턴스를 생성한다.
- 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다.
정리
의존성에 대해서 살펴보았는데, 어디까지가 자바의 영역이고 어느 부분이 스프링이 제공해주는 영역인지 헷갈릴 때가 있었는데, 자바에서 해주던 역할을 어노테이션이 대체할 수 있고 동일한 기능을 제공하지만 더 편리하게 사용할 수 있다는 것을 알게되었습니다.
참고자료:
스프링프레임워크 첫걸음, 후루네스 키노시타 마사아키