안녕하세요. 말랑고양입니다. 오랜만에 스프링프레임워크에 대해서 정리를 해보려합니다.
눈으로 그대로 읽으면 되도록 포스팅을 할 계획이고, 궁금한 것이 있다면 댓글남겨주세요. 감사합니다.
"스프링은 거대한 컨테이너임과 동시에 IoC / DI 를 기반으로 하고있는 거룩한 존재이며 서비스 추상화를 통해 삼위일체로 분리되는 3단 변신로봇이다." 토비의 스프링 中
토비의 스프링에서 나왔던 부분입니다. 의미심장한 의미 같으니 함께 해석을 해봅시다.
해석에 앞서서 등장하는 용어들을 정확하게 이해하고 있어야하니 함께 정리하는 시간을 가져봅시다.
컨테이너?
인스턴스의 생명주기를 관리하는 것입니다.
인스턴스의 생명주기란?
인스턴스의 생성, 실행, 소멸되는 과정을 뜻합니다. 생명주기는 라이프사이클이라고도 자주 표현됩니다.
인스턴스란?
클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미합니다.
이해를 돕기 위해서, 클래스를 통해서 만들어진 제품. new 해서 생성된 것이라고 표현해봅니다.
Calculator c1 = new Calculator();
c1에 담긴 것이 인스턴스입니다. c1은 인스턴스 변수이고, 우리는 c1을 통해서 인스턴스를 제어할 수 있습니다.
잠깐, IoC와 DI라는 생소한 용어들이 등장하였습니다.
IoC와 DI에 대해서 짚고 넘어가겠습니다.
IoC란?
Inversion of Controller의 약자로 제어의 역전이라고 정확하게 번역됩니다. 본래 프로그램의 흐름은 개발자가 제어하곤 하였습니다. 그런데, 기술이 발전하다보니 개발자가 프로그램의 흐름을 제어하는 것이 아니라 프로그램이 프로그램의 흐름을 제어한다고 합니다. 그래서, 제어의 역전(IoC)이라는 표현이 사용하는 것입니다.
인공지능 로봇 : 앞으로 우리가 인간들을 제어하겠습니다. 큐큐.
DI란?
Dependency injection의 약자로 의존성 주입이라는 뜻입니다.
DI 클래스 사이의 의존 관계를 빈(Bean)설정 정보를 바탕으로 컨테니어가 자동으로 연결해주는 것을 말합니다.
의존 관계가 외부 설정파일에 의해서 정의되게 하는 디자인 패턴입니다.
빈(Bean)?
자바 객체입니다. 스프링 컨테이너가 자바 객체를 만들면 이 객체를 스프링 빈이라고 부릅니다.
의존 관계?
중요한 용어가 등장했습니다. 의존 관계는 다른 개체의 변화가 발생했을 때 자신에 영향을 받는 개체 사이의 관계입니다.
쉽게 표현하자면, 얽혀있는 것입니다. 소스코드가 얽혀있어서, 하나 바꾸면 다른 것도 바꿔야 되는 관계입니다.
reference : http://endorphin0710.tistory.com/93
다시 DI에 대해 정리하여합니다.
이해를 돕기위해 예시를 작성해봅니다.
DI가 적용이 안 된 예시?
개발자가 직접 인스턴스를 생성하는 경우를 의미합니다.
Class A{
}
class B{
A a = new A();
}
다음으로는 DI가 적용된 예시?
Spring에서 DI가 적용된 예를 작성해봅니다.
@Component
class A{
}
@Component
class B{
@Autowired
A a;
}
DI가 적용된 것과 적용되지 않은 것의 차이는 바로 생성자(new)가 있는가의 차이입니다. 인스턴스를 만드는 주체가 둘의 차이점이 되겠습니다. 원래 인스턴스는 개발자가 생성해야하는데, 그것이 아닌 스프링 컨테이너가 자동으로 생성하는 모습을 보여주고 있습니다. 약속된 스프링 어노테이션을 사용하면 스프링 컨테이너가 자동으로 처리해주므로 초보 개발자도 쉽게 인스턴스를 생성할 수 있게 되는 것이죠.
스프링 어노테이션?
스프링 프레임워크에서 사용되는 @를 이용한 주석
@Component
@Required
@Autowired
@Qualifier
.. 등이 있습니다.
스프링(IoC/DI) 컨테이너?
Spring Container는 Bean들의 생명주기를 관리합니다. 종류로는 Bean Factory, ApplicationContext가 있습니다.
BeanFactory란?
IoC/DI에 대한 기본적인 기능을 가지고 있습니다.
ApplicationContext란?
BeanFactory의 모든 기능을 가지고 있고, 트랜잭션, AOP등의 처리를 할 수 있습니다. 보통 ApplicationContext를 사용하게 됩니다.
마지막으로 서비스 추상화란?
하위 시스템의 공통점을 뽑아내는 것을 뜻합니다.