
스프링의 3대 기반 기술 중에 IoC/DI 라는 것이 있다.
IoC가 뭔지 감이 안잡힌다면 한번 직접 IoC컨테이너를 만들어보자!
이 글에서는 자바의 팩토리라는 디자인패턴으로 IoC 를 적용한 아주 간단한 예제를 만들어 볼 것이다.
Inversion of Control, 해석하면 제어의 역전이다.
무엇을 제어하는가? -> 오브젝트의 생성, 관계설정 방법
누가 제어하는가? -> 제어만을 담당하는 오브젝트 (제 3자)
만들 클래스와 인터페이스는 크게 4개이다.
1. Factory -> 오브젝트의 생성과 관계설정을 담당한다.
2. Painter -> Shape 인터페이스의 구현체를 주입받는다.
3. Shape 인터페이스 -> 3개의 구현체가 있다.
4. Client -> Factory 에 Painter 오브젝트를 달라고 요청한다.
그림으로 표현하면 이렇다.
Factory 클래스
//오브젝트의 생성과 관계설정를 총괄한다. (제어를 담당)
public class Factory {
public Painter painter(){
// DI
return new Painter(shape());
}
public Shape shape(){
return new Rectangle();
}
}
Painter 클래스
//Painter 는 어떤 Shape의 구현체를 주입받을건지 모른다.
public class Painter {
private Shape shape;
public Painter(Shape shape){
this.shape = shape;
}
public void draw(){
System.out.println( shape.shape() + "을 그립니다.....");
}
}
Shape 인터페이스
public interface Shape {
//Rectangle 은 "네모"
//Triangle 은 "세모"
//Circle은 "동그라미"
//위의 구현체들은 글이 너무 길어지기 때문에 생략
String shape();
}
Client(IoCTest) 테스트 클래스
//제어를 총괄하는 Factory 에게 필요한 오브젝트를 달라고 하면
//Factory가 알아서 관계설정, 생성까지 해준다.
//따라서 Client 는 설정에 대한 정보를 알 필요가 없이
//갖다 쓰기만 하면 된다.
//제어가 역전된 것이다.
public class IoCTest {
@Test
public void IoC(){
Factory factory = new Factory();
Painter painter = factory.painter();
painter.draw(); //결과 : 네모을 그립니다.....
}
}
이제 IoC가 느껴지는가
사용되고 사용하는 클래스는
관계 설정이나 오브젝트 생성 방식에 대한 정보를 아무것도 모른다.
제 3자인 Factory가 그 책임을 담당하고 있다.