Programming/Spring

Spring (2) - IoC와 Container

코딩하는 포메라니안 2022. 4. 20. 15:17

1. IoC(Inversion of Control)이란?

직역하면 '제어의 역행'이라는 뜻으로, 어플리케이션 코드에서 객체를 제어하지 않고 컨테이너가 제어하는 것을 말한다. 우리가 설정만 해주면, 컨테이너가 알아서 객체를 생성, 삭제, 또 의존 관계를 맺어준다는 것이다.

우리가 설정한다는 것은 "이 객체는 컨테이너 너가 관리해!"하고 알려 주는 코드를  작성하는 것을 말한다.

 

장점

- 객체 간의 결합도를 낮출 수 있다.

(= 한 클래스를 수정해서 이와 관련된 다른 클래스도 반드시 수정해야하는 정도가 적다.) 

2022.04.20 - [웹프로그래밍/Spring] - Spring 기타(1) - 객체 간 결합도가 낮은 이유

 

Spring 기타(1) - 객체 간 결합도가 낮은 이유

Spring은 IoC를 통해, 객체 간의 결합도를 낮출 수 있다고 한다. 이번 글에서는 그 이유를 더 자세하게 살펴보려고 한다. 객체의 강한 결합부터 Spring에서 사용하는 약한 결합까지 차례로 작성했다.

yerinpy73.tistory.com

 

 

설정하는 방법

크게 3가지가 있으며 주로 1, 2번 방법을 섞어 사용한다.

1) xml 파일

2) @ : annotation

3) Java 파일

 

 

 

2. IoC 유형 (1) - Dependency Lookup

 

1. JNDI Lookup

Object에 lookup코드를 작성해서, 컨테이너가 lookup context를 통해 필요한 Resource나 Object를 얻는 방식이다. 예시는 아래의 글의 2번에서 getConnection() 메서드를 보면 된다.

 

2022.03.28 - [웹프로그래밍/Servlet & JSP] - [환경설정] Eclipse의 Web Project와 DB(MySQL) 연결하기2

 

[환경설정] Eclipse의 Web Project와 DB(MySQL) 연결하기2

*기본적인 세팅은 아래 글 참조 2022.03.26 - [웹프로그래밍/Servlet & JSP] - [환경설정] Eclipse의 Web Project와 DB(MySQL) 연결하기 [환경설정] Eclipse의 Web Project와 DB(MySQL) 연결하기 1. DB(MySQL)-con..

yerinpy73.tistory.com

 

 

 

3. IoC 유형 (2) - Dependency InJection

 

Object에 lookup코드를 작성하지 않고, 컨테이너가 직접 Object에 의존 관계를 설정할 수 있도록 하는 방식으로 

 

public class MyServiceImpl implements MyService{
    //1. field Injection
    @Autowired
    MyDao dao;
    
    //2. setter Injection
    @Autowired
    public void setDao(MyDao dao){
    	this.dao = dao;
    }
    
    //3. constructor Injection 
    //권장됨 - Nullpointer Error방지 가능
    //생성자가 1개만 있을 경우, @Autowired 생략 가능
    @Autowired
    public MyServiceImpl(MyDao dao){
    	this.dao = dao;
    }
}

 

 

 

 

4. Container란?

쉽게 생각하면, Spring 프로젝트의 관리자같은 역할을 한다. 객체를 생성하고 사용하고 소멸시키며 이 외에도 주요 기능들을 제공한다. 또한, 자주 쓰는 Factory패턴과 Singleton패턴도 직접 구현하지 않고 사용할 수 있다.

 

 

1. Container 기능

1. 객체 라이프사이클 관리 (생성, 사용, 소멸)

2. Dependency 객체 제공 (의존 관계 연결)

3. 어플리케이션 실행에 필요한 환경

 

 

2. IoC Container

객체 라이프 사이클을 제어하는 Container로 Spring의 Container는 IoC Container라고 하기도 한다.

Spring에서의 컨테이너 객체는 BeanFactory와 ApplicationContext가 있다. 

 

 

1) BeanFactory

Spring의 Container가 관리하는 객체를 "Bean"이라고 하는데, Container가 이 Bean들의 라이프사이클을 관리한다고 해서 BeanFactory라 붙여졌다.

 

2) Application Context

'Bean Factory + 추가 기능'한 것이다. 보통 BeanFactory보다 이를 확장한 ApplicationContext를 사용한다.

ApplicationContext를 구현한 객체는 아래와 같다.