[Spring] IoC 컨테이너 직접 만들어보기!

charco·2021년 7월 26일
0

재미코딩

목록 보기
9/10

스프링의 3대 기반 기술 중에 IoC/DI 라는 것이 있다.
IoC가 뭔지 감이 안잡힌다면 한번 직접 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가 그 책임을 담당하고 있다.

profile
아직 배우는 중입니다

0개의 댓글