공부 기록장
[SPRING] 스프링이란? (2) 본문
이번 포스팅에서는 스프링에서 중요한 개념 중 하나인 loC과 DI에 대해 다뤄보려고 한다.
먼저 loC란,
Inversion of Control, 즉 제어의 역행을 뜻한다.
조금 풀어서 얘기하자면, 기존에는 필요한 위치에서 개발자가 필요한 객체 생성 로직을 구현했다면, 객체 생성을 컨테이너에게 위임해서 처리하는 방식이다.
스프링에서는
인터페이스를 호출해서 사용하기 때문에 구현 클래스 교체가 용이하다.
컨트롤러에서 각 서비스를 이용할 때, 인터페이스 객체를 불러서 사용하므로 클래스 내용이 변경되어도 따로 변경해주어야 할 것이 없다.
또, factory를 호출해서 팩토리가 구현 클래스를 생성하므로 인터페이스 변경시 팩토리만 수정하면 된다.
따라서 service를 이용하는 쪽에서는 인터페이스만 알고 있으면 어떤 구현체가 어떻게 생성되는지에 대해서는 알 필요가 없다. 이 팩토리 패턴이 적용된 것이 컨테이너의 기능이며, 컨테이너의 기능을 제공해주고자 하는 것이 IoC 모듈이다.
마지막으로, 스프링 컨테이너가 Assembler역할을 해, 각 서비스의 라이프 사이클을 관리해준다.
이 유형 그림에서도 볼 수 있듯,
DI는 Dependency Injection 의 약자로 의존성 주입을 뜻하며, IoC의 구현 방법중 하나이다.
DI는 object에 lookup 코드를 사용하지 않고 컨테이너가 직접 의존 구조를 object에 설정 할 수 있도록 지정해 주는 방식이다. object가 컨테이너의 존재 여부를 알 필요가 없고, lookup 관련 코드들이 object에서 사라진다.
또, setter injection과 constructor injection이 가능해진다.
그렇다면 container란,
객체의 생성과 사용, 소멸에 해당하는 라이프 사이클을 담당하며, 라이프 사이클을 기본으로 어플리케이션 사용에 필요한 주요 기능을 제공해 주는 것이다.
컨테이너를 사용하면 비즈니스 로직 외에 부가적인 기능들에 대해서는 독립적으로 관리 할 수 있고, 서비스 look up이나 configuration에 대한 일관성을 갖게 해준다. 또, 서비스 객체를 사용하기 위해 factory나 singleton 패턴을 직접 구현하지 않아도 알아서 만들어 주기 때문에 편리하다.
컨테이너의 주요 기능에는
- 라이프사이클 관리
- dependency 객체 제공
- thread 관리
- 기타 애플리케이션 실행 등이 있다.
사실 컨테이너라고 하면 생소하게 느껴질 수도 있는데, 지난번 서블릿 실습 때 사용했던 톰캣이 컨테이너의 한 종류이다. 서블릿 컨테이너라고도 하고 서블릿을 실행하는 엔진이라고도 부른다고 한다.
통합적으로 그냥 WAS로 통하는 것 도 같다.
Spring DI Container
스프링에서는 Spring DI Container가 관리하는 객체를 빈(bean)이라고 하고, 이 빈들의 생명주기를 관리하는 의미로 빈 팩토리(Bean Factory) 라고 한다.
Bean Factory에 여러 가지 컨테이너 기능들을 추가하면 ApplicationContext라고 한다.
BeanFactory에서는 Bean 등록, 생성, 조회, 반환, 관리 등의 역할을 한다. 하지만 일반적으로는 이를 확장한 ApplicationContext를 사용한다. ApplicationContext는 BeanFactory에서 하는 일에 추가로 Spring의 각종 부가 서비스를 제공한다.
'웹 > Backend' 카테고리의 다른 글
[SPRING] Spring MVC (0) | 2021.05.15 |
---|---|
[SPRING] DI (의존성 주입) (0) | 2021.05.14 |
[SPRING] 스프링이란? (1) (0) | 2021.04.27 |
[Backend] MVC 패턴 (0) | 2021.04.05 |
JSP 정리 (0) | 2021.04.04 |