스프링을 공부하면서, 가장 먼저 만나는 개념은 의존성 주입이다.
의존성 주입이라는 것은 필요한 부품을, 해당 부품이 필요한 곳에 넣는 것이다.
일체형 코드와 부품형 코드
건전지를 포함한 장난감을 생각해보자.
일체형 장난감은 만들 때 건전지도 함께 만든다.
조립형 장난감은 따로 만든 건전지를 넣을 수 있도록 만든다.
만약, 건전지를 바꾸거나 수정할 일이 있을 때,
일체형 장난감은 장난감을 아예 고쳐야 하지만, 조립형 장난감은 단지 건전지를 빼서 바꾸면 된다.
Spring은 이러한 조립형 장난감의 형식을 통해 수정과 유지보수를 쉽게 만들어준다.
실제 코드로 가져오면, A가 장난감 객체, B가 건전지 객체라 할 때,
일체형 코드는
class A{ //장난감
private B b; //배터리
public A(){
b = new B(); //만들 때 내부에서 생성
}
}
조립형 코드는
class A{ //장난감
private B b; //배터리
public A(B b){
this.b =b; //외부 객체를 조립
}
}
이렇게 외부에서 만든 객체 B를 생성자(또는 setter)를 통해 A에 넣어주는 것을 '의존성 주입'이라고 한다.
(일체형 코드, 조립형 코드는 의미가 쉽게 다가오게 하기 위해 만든 말,,,)
생성자를 통한 주입과 Setter를 통한 주입
조립형 코드에서 외부 객체를 주입하는 방법은 두 가지가 있다.
1. 위 예시처럼 생성자를 통해 하는 방법
class A{
private B b;
public A(B b){
this.b =b;
}
}
2. Setter를 통해 주입하는 방법
class A{
private B b;
public void setB(B b){
this.b =b;
}
}
Spring에서의 의존성 주입
위 방법은 Spring과 관계없이 조립형 코드를 어떻게 구현할지에 대한 것이었다.
Spring은 이를 xml 혹은 어노테이션을 통해 편하게 조립할 수 있도록 만들었다.
(----조립방법 추가-----)
IoC 컨테이너(Inversion of Control)
Spring에서 컨테이너는 조립할 객체들을 만들어서 넣어놓는 곳이라고 생각하면 된다.
다만, 이를 IoC라고 부르는 건, 조립되어야할 작은 객체(건전지)를 큰 객체(장난감)보다 먼저 만드는데,
이러한 순서가 실제 실행했을 때의 순서와 반대이기 때문이다.
코드 실행 순서 : 큰 객체 실행 -> 작은 객체 실행
객체의 생성 순서 : 작은 객체 생성 -> 큰 객체 생성
ApplicationContext
Spring에서 ApplicationContext는 IoC컨테이너를 표현하며, 의존성 주입을 위한 객체를 생성, 설정, 조립하는 역할을 한다.
IoC컨테이너가 추상적인 개념이라면 ApplicationContext는 이를 구체화한 인터페이스라고 생각하면 될 것 같다.
위에서 이야기한 의존성 주입의 역할도 ApplicationContext가 맡고 있다!
때문에 xml이나 java어노테이션으로 생성하고 조립한 객체들은 GenericApplicationContext의 getBean과 같은 메서드로 접근할 수 있다.
'Spring' 카테고리의 다른 글
| Spring - 의존성주입 방법의 비교(생성자 주입, Setter주입, field주입) (0) | 2020.06.11 |
|---|---|
| SpringSecurity - jdbc를 이용한 인증/권한 처리 (0) | 2020.05.12 |
| SpringSecurity - 서블릿 기반 구조 (0) | 2020.05.12 |
| Spring - ServletContext와 RootContext (0) | 2020.05.08 |
| Spring - 관점 지향 프로그래밍(AOP) (0) | 2020.05.05 |