■ Ioc(Inversion of Control) 개념
- 객체의 생성에서부터 생명주기의 관리까지 모든 객체에 대한 제어권이 개발 코드에서 컨테이너로 바뀌었다는 것을 의미
- 인스턴스의 생명주기를 컨테이너가 한다.
- 순제어 : 개발자가 A 객체 인제 B 객체인지를 Control 한다.
(A객체를 사용하고 싶으면 new A 객체 생성)
- 역제어 : 객체 생성의 주도권을 BeanFactory가 가져간다
-> Spring Framework에서 제공하는 모든 모듈들은 Spring Core 위에서 동작하는데
이 Spring Core가 바로 IoC 컨테이너 기능을 제공한다.
■ 결합도와 유지 보수성
1. 결합도
- 소프트웨어 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지를 나타내는 말이다.
- TVUser는 SamsungTV와 LgTv 객체를 이용하여 로직을 처리 이 때 객체들이 직접 결합되어 있을 경우
TV객체를 다른 객체로 변경하고자 한다면 TVUser 쪽에서 많은 코드를 수정해야한다.
--> 기존 소스들이 수정 후 영향을 끼치므로 유지보수의 어려움 발생
2. 결합도 낮추는 방법
2-1) 다형성을 이용한 결합도 낮추기
- 객체지향의 기본 개념인 다형성(Polymorphism)을 이용할 수 있다.
위와 같이 형 변환을 이용하여 객체를 참조하게 되면 다른 TV 객체로 변경하고자 할 때
참조하는 객체만 변경하면 되므로 쉽게 객체를 교체할 수 있다.
단, 객체를 이용하기 위해 생성할 때 발생하는 결합은 없어지지 않는다는 단점이 존재한다.
2-2) Factory 패턴을 이용한 결합도 낮추기
(팩토리 패턴은 참조)
BeanFactory를 이용하면 직접적인 객체 생성코드를 작성하지 않기 때문에 생성결합 문제를 해결가능하다.
이 Factory 패턴이 컨테이너에 적용되어 있다.
■ Spring IoC 컨테이너
1. Spring 컨테이너의 종류
-Spring IoC 컨테이너는 BeanFactory와 BeanFactory를 상속한 ApplicationContext 두 가지 유형의 컨테이너를 제공한다.
컨테이너 | 기능 |
BeanFactory |
|
ApplicationContext |
|
cf) lazy-loading과 pre-loading
pre-loading | lazy-loading |
Container가 구동될 때 객체를 생성 ↓ lazy-loading 보다 빠르다 | Client각 호출할 때 객체를 생성 ↓ pre-loading에 비해 속도가 느리다 |
2. Bean Factory
- Spring 프레임워크도 POJO 객체들을 관리하기 위하여 XML 파일 형태의 저장소를 가진다.
- Spring에서 Spring 컨테이너를 위한 XML 설정 파일 작성은 아래와 같다.
Spring 컨테이너에 해당하는 BeanFactory 객체로부터 getBean()이라는 메소드를 사용하여 사용하고자하는
Bean객체를 찾아서 이용할 수 있다.
Spring 컨테이너를 구동하여 Bean 객체를 찾아서 사용하는 TVUser프로그램을 수정하면 아래와 같다.
TVUser.java
Spring 프레임워크는 아래 그림과 같이 기본적으로 어플리케이션의 비즈니스 서비스를 구동시키고 관리하는 Spring 컨테이너와
이러한 컨테이너에 의해 관리되는 Bean으로 구성된다.
Spring 프레임워크에서 Bean은 Spring IoC 컨테이너에 의해 관리된다.
Spring 컨테이너란 Spring 프레임워크에서 컨테이너 기능을 제공하는 클래스를 의미하는데
Spring 컨테이너는 Spring 프레임워크의 초기화 역할을 담당한다.
결과적으로 Spring 컨테이너는 XML 파일에 등록된 Bean들의 Life Cycle 관리, Dependency 관리를 담당함으로 Sping IoC 기능도 제공한다.
3)ApplicationContext
-spring 프레임워크가 제공하는 Applicaiton 구현 클래스는 다음과 같다.
구현 클래스 |
기능 |
XmlWebApplicationContext |
웹 기반의 Spring 어플리케이션을 개발할 때 사용 |
FileSystemXmlApplicationContext |
파일 시스템에 위치한 XML 설정 파일을 로딩하여 구동되는 ApplicationContext(절대경로) |
ClassPathXmlApplicationContext |
클래스 패스에 위치한 XML 설정 파일을 로딩하여 구동되는 ApplicationContext |
'Backend > Spring' 카테고리의 다른 글
[JPA] N+1 문제 (0) | 2022.02.28 |
---|---|
JPA 즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)? (0) | 2022.02.24 |
JPA 프록시란? (0) | 2022.02.24 |
영속성 컨텍스트란? (0) | 2022.02.22 |
Spring Data JPA 란? (0) | 2022.02.20 |