스프링 핵심 개념 - Ioc
From JCFWiKi
Copyright © 2008 Daewoo Information Systems Co., Ltd. |
|
목차 |
[편집] IOC(Inversion of Control)의 의미
- 제어권의 역전(IOC): 객체의 생성에서부터 생명주기 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미
- 자바 기반의 어플리케이션 개발 초기에는 자바 객체를 생성하고 객체간의 의존관계를 연결시키는 등의 제어권이 개발자에게 있었다.
- 하지만 서블릿, EJB가 등장하면서 개발자들이 가지고 있던 제어권이 서블릿과 EJB를 관리하는 컨테이너에게 넘어가버리게 되었다.
[편집] IoC 컨테이너의 분류
- DL(Dependency lookup)
- 저장소에 저장되어 있는 빈(Bean)에 접근하기 위하여 개발자들이 컨테이너에서 제공하는 API 를 이용하여 사용하고자 하는 빈(Bean) 을 Lookup 하는 것
- DI (Dependency Injection)
- Dependency Injection은 Spring 프레임워크에서 지원하는 IoC의 형태이다.
- DI는 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해주는 것을 말한다.
- 개발자들은 빈 설정 파일(저장소 관리 파일)에 의존관계가 필요하다는 정보를 추가하면 된다.
- Spring 프레임워크는 Setter Injection, Constructor Injection, Method Injection의 세가지 유형으로 나타난다.
[편집] 의존성의 관리
[편집] 직접적인 의존성 관리
- 객체를 물리적으로 직접 생성하여, 의존성의 변경이 어려움.
public class BookController{ .. public void rentBook(string isbn){ BookDao dao = new BookJdbcDao(); dao.rentBook(); } }
[편집] 팩토리 패턴/룩업을 사용한 의존성 관리
- 인터페이스를 통해서 구체 클래스를 감출수 있다.
- 단, 팩토리 클래스에 대한 의존성은 존재한다.
public class BookController{ .. public void rentBook(string isbn){ BookDao dao = BookDaoFactory.getDao(); dao.rentBook(); } }
[편집] 의존성 삽입(DI)을 통한 의존성 관리
- 의존성이 외부 조립자를 통해 관리되며, 인터페이스를 통해서 구체 클래스를 감춤으로서, 의존성을 언제라도 변경할 수 있다.
- 의존성을 삽입해주는 조립자만 있으면, 쉽게 확장하고 재사용할 수 있다.
public class BookController{ private BookDao dao; public void rentBook(string isbn){ dao.rentBook(); } public void setDao(BookDao dao){..} }
[편집] 스프링의 경량 컨테이너
- 스프링은 Ioc 기법을 지원하는 경량 컨테이너를 제공한다.
- 경량 컨테이너라는 것은 특정 플랫폼에 종속되지 않고, 쉽게 테스트 할 수 있음을 의미한다.
- 자바 코딩으로 객체를 초기화하고, 의존관계를 연결시키는 일들을 스프링 Ioc 컨테이너가 자동으로 해준다.
- 객체의 생성과 객체의 물리적인 위치를 어플리케이션 로직에서 분리하고
- 객체간의 의존관계(종속성)를 연결시키는 일들을 컨테이너가 하기 때문에 유연성과 확장성이 높아지게 됨.
- 엔터프라이즈 서비스를 플랫폼에 독립적으로 운용할 수 있는 바탕이 된다.
- 스프링의 컨테이너를 통한 빈들간의 협업
public class ArticleService { private ArticleDao articleDao; private IFileDao fileDao; public void setArticleDao(ArticleDao dao) {this.articleDao = dao;} public void setFileDao(IFileDao fileDao) {this.fileDao = fileDao;} public void writeArticle(Article article){ articleDao.writeArticle(article); fileDao.writeFile(article.getAttach()); ... } }
- 스프링 프레임워크를 통해 인스턴스가 생성되어 Inject(삽입)되어 서로 메세지를 주고 받게 된다.
- 이와 같은 설정은 XML파일(Application Context XML)에 정의된다.
<bean id="articleService" class="jcf.showcase.article.service.ArticleService" > <property name="articleDao" ref="articleDao"/> <property name="fileDao" ref="fileDao"/> </bean> <bean id="articleDao" class="jcf.showcase.article.dao.ArticleDaoImple" /> <bean id="fileDao" class="jcf.file.dao.FileDaoImple" />
- 위 설정파일은 비지니스 계층과 persistence 계층의 구현 클래스를 담당하고있는 클래스(ArticleDao와 FileDaoImple)에 대한 생성과 의존관계를 관리한다.
- <bean/>엘리먼트를 이용하여 하나의 빈의 생성하고 이렇게 생성된 빈은 setter 메소드를 이용해서 다른 빈과 의존관계 형성이 가능하다.
- 위의 코드는 ArticleService클래스의 setFileDao() 메소드를 통해 FileDaoImple 인스턴스를 전달하게 된다.
[편집] 스프링의 다양한 IoC 방법
[편집] 생성자를 통한 의존성 관리
public class BookController{ private BookDao Dao; public BookController(BookDao dao){ this.dao = dao; } public void rentBook(Book book){ dao.rent(book); .. } } <bean id="bookController" class="store.ctl.BookController"> <constructor-arg> <ref bean="bookDao"> </constructor-arg> </bean> <bean id="bookDao" class="store.dao.BookJdbcDao" />
[편집] 생성자를 통한 변수값 설정 방법
<bean id="timeController" class="store.ctl.timeController"> <constructor-arg value="1000" /> </bean>
[편집] 리스트 타입의 값 설정 방법
public class PerController{ private List pets; public void setPets(List pets){this.pets = pets} } <bean id="petController" class="store.ctl.PetController"> <property name="pets"> <list> <value>cat</value> <value>dog</value> </list> </property> </bean>
분류: JCF 정기교육 | Spring | Spring IOC | IOC

