1. IOC
객체를 만드는 부분(생성자를 호출)을 직접호출하지 않고 분리를 해서 별도의 클래스 또는 객체의 메서드가 생성자를 호출해서 리턴하도록 구현하는 경우
다른 클래스의 객체를 만드는 역할을 수행하는 메서드를 소유한 클래스를 팩토리 클래스 라고 하며 이러한 형태의 디자인 패턴을 팩토리 메서드 패턴이라고 합니다.
프로젝트의 facotry 패키지에 DaoFactory 클래스 생성
package factory;
import db.*; // 사용자
public class DaoFactory {
static public GoodsDao create () {
return new GoodsDao();
}
}
프로젝트 Main 클래스의 main 메서드 수정
import db.*;
import factory.*;
public class Main {
public static void main(Strinbg[] args)
{
GoodsDao dao = DaoFactory.create();
GoodsDto good = new GoodsDto();
good.setCode("010");
good.setTitle("grapefruit");
good.setManufacture("japan");
good.setPrice("3000");
dao.insertGoods(good)
GoodsDto dto = dao.get("001");
System.out.println(dto);
}
}
일반적인 프로그램에서의 제어는 오브젝트를 생성하고 그 오브젝트를 이용해서 작업을 수행하는 형태입니다.
제어의 역전이란 앞에서의 코드처럼 직접 객체를 생성하지 않고 다른 곳에서 생성해준 객체를 가지고 작업을 수행하는 방식입니다.
Eclipse 기반의 톰캣 컨테이너를 사용하는 프로젝트에서 서블릿은 메인 메서드가 없고 우리가 직접 생성자를 호출한 적도 없는데 서블릿 객체의 메소드가 호출되어있는데는 서블릿에 대한 제어권한을 가진 컨테이너가 적절한 시점에
서블릿 크래스의 오브젝트를 생성하고 그 안의 메서드를 호출하는 형태로 동작하기 때문인데 이러한 방식을
제어의 역전이라고 한다.
프레임워크나 Connection Pool 을 이용한 데이터베이스 활용도 제어의 역전을 활용한 예로 객체 생성시 객체의 생성자를 직접 호출하지 않습니다.
스프링에서는 스프링이 제어권을 가지고 생성하는 관계를 설정하는 오브젝트를 Bean 이라고 합니다.
스프링 빈은 스프링 컨테이너가 생성과 관계설정, 사용등을 제어해주는 제어의 역전이 적용된 오브젝트를 가리키는 단어 입니다.
스프링에서 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트를 빈 팩토리(Bean Factory)라고 한다.
Bean Factory 인터페이스
--- bean 객체를 관리하고 각 bean 객체간의 의존 관계를 설정해주는 기능을 제공하는 가장 단순한 인터페이스로 이 인터페이스를 implements 한 클래스로는 XmlBeanFactory 클래스가 존재
--- 생성자의 Resource 인터페이스를 구현한 클래스의 객체를 대입해서 객체 생성
--- Resource 인터페이스를 구현한 클래스
--- --- FileSystemResource : 파일 시스템의 파일로부터 생성
--- --- InputStreamResource : InputStream 이용
--- --- ClassPathResource: 클래스 패스에서 읽어 나옵니다.
--- --- UrlResource : URL 에서 읽어옵니다.
--- --- ServletContextResource : 웹 애플리케이션의 루트 디렉토리에서 읽어 옵니다.
Resource 인터페이스를 implements 한 클래스의 객체 생성 후 getBean() 을 호출해서 설정된 bean 의 id를 넘겨주거나 여기에 추가로 리턴되는 클래스 이름을 넘겨서 bean 객체를 생성합니다.
BeanFactory 인터페이스만 구현한 클래스는 단순히 컨테이너 객체를 생성하고 DI를 처리해주는 기능만을 제공 합니다.
스프링에서 다양한 부가 기능(웹 개발, 메시지 처리...)을 사용하기 위해서 인데 이러한 기능사용시에는 ApplicationContext 인터페이스를 이용해야 한다.
ApplicationContext
--- BeanFactory 인터페이스를 상속한 인터페이스로 빈 객체 라이프 사이클, 파일과 같은 자원 처리 추상화, 메시지 지원 및 국제화 지원 , 이벤트 지원, xml 스키마 확장 등의 추가적인 기능을 제공하는 인터페이스
--- AnnotationConfigApplicationContext, GenericXmlApplicationContext 클래스가 ApplicationContext 인터페이스를 implements
WebApplicationContext
--- Web 프로젝트에서 사용가능 한 ApplicationContext 인터페이스
--- ClassPathXmlApplicationContext, FileSystemXmlApplicatonContext, XmlWebApplicationContext, AnnotationConfigWebApplicationContext, 클래스가 implements
--- 클래스를 이용하는 경우는 거의 없고 웹 애플리케이션에서 web.xml 파일의 설정을 통해 XmlWebApplicationContext 객체를 생성해서 사용하는 경우가 많음
--- --- --- --- --- Annotation 을 이용해서도 객체 생성이 가능한데 Factory 클래스 상단에 @Configuration 을 추가하고 Factory 메서드의 상단의 @Bean 을 추가한후 아래 클래스의 객체를 생성해서 getBean 을 호출 한다.
@@@@ Annotation 을 이용한 ApplicationContext 활용 bean 생성
프로젝트의 DaoFactory 클래스 변경
package factory;
import db.*;
import org.springfraemwork.context.annotation.*;
@Configuration
public class DaoFactory {
@bean
static public GoodsDao create()
{
return new GoodsDao();
}
}
// 해당 예제는 3.2.5 RELEASE 입니다. 후에 필요시 교체
Main 클래스 변경
package db;
import org.sprignframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args){
AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(DaoFactory.class);
GoodsDao dao = context.getBean("create",GoodsDao.class);
GoodsDto dto = dao.get("001");
System.out.println(dto);
context.close();
}
}
앞에 예제와 같이 객체를 생성했을 때의 장점은 오브젝트가 생성 시점과 전략을 다르게 가져갈 수 있도록 해주고 의존관계 자동설정 및 오브젝트에 대한 사후 처리 정보의 조합,
인터셉팅 등 오브젝트를 효과적으로 활용할 수 있도록 해주는 기능을 제공 한다.
--- ApplicationContext는 IoC 컨테이너면서도 Singleton을 저장하고 관리하는 Singleton 레지스트리이기도 합니다.
--- 특별한 설정을 하지 않으면 스프링에서 생성한 빈 오브젝트에서는 전부 Singleton 형태로 생성되고 매개변수가 없는 생성자(디폴트 생성자)를 이용해서 생성됩니다.
--- 싱글톤으로 생성하는 이유는 스프링이 구동되는 환경이 서버 환경일 가능성이 높기 때문입니다.
--- 클라이언트의 요청이 올 때마다 각 로직을 담당하는 오브젝트를 새로 만들게 되면 너무나 많은 오브젝트를 생성하게 되 어서성능이 저하되기 때문이다.
<<<( ( 해당 싱글톤 패턴 의 경우는 디자인 패턴 프로그래밍에서 나타나는 패턴이므로 C++ 에서도 사용이 가능하다 )
**** ** Singleton 패턴을 만드는 방법
--- 생성자를 private 으로 생성
--- 자신과 같은 타입의 static 필드를 선언
--- static 필드의 팩토리 메서드인 getInstance 메서드를 생성해서 앞에서 만든 static 필드에 메모리를 할당하고 리턴하는 코드를 작성
****** Singleton 패턴의 한계
--- 상속할 수 없습니다.
--- 테스트가 어렵습니다.
--- Singleton 은 항상 전역의 개념을 가지고 있으모 바람직하지 않을수 있다. (상황에 맞춰서 잘 사용해야 함)
p 1 - 26