Spring을 공부하다 보니 DI(Dependency Injection)이라는 부분이 정말 너무 이해가 되지 않았다.

그리고 더욱 슬픈 건 UML조차도 이해가 되지 않았다. 

 

그래서 직접 공부 후 JAVA 예제, Intellij의 Diagram기능을 활용해서 UML로도 분석한 기록을 남긴다.

 

◆ 예제 코드

public interface Service {
    void sendMessage(String message, String recipient);
}

 

> 서비스 인터페이스를 생성한다

 

public class FakeService implements Service {
    @Override
    public void sendMessage(String message, String recipient) {
        System.out.println("Fake send message " + recipient + " to " + message);
    }
}

 

public class RealService implements Service{
    @Override
    public void sendMessage(String message, String recipient) {
        System.out.println("Real send message " + recipient + " to " + message);
    }
}

 

> Service를 Impl (implements)하는 클래스 2개를 구현한다 (FakeService, RealService)

 

public class MessageSender {
    private final Service service;

    public MessageSender(Service service) {
        this.service = service;
    }

    public void send(String message, String recipient){
        service.sendMessage(message, recipient);
    }
}

 

> 그리고 이 서비스들을 주입받아 사용하는 클래스 MessageSender를 구현한다

> 여기서 Service 인터페이스를 활용(다형성) 주입받은 sendMessage를 사용할 수 있게 한다

 

public class main {
    public static void main(String[] args){
        MessageSender messageSender = new MessageSender(new RealService());
        messageSender.send("helloWorld Java", "hihihihi@email.com");

        MessageSender fakeSender = new MessageSender(new FakeService());
        fakeSender.send("helloWorld Java", "hihihihi@email.com");
    }
}

 

> Messeage Sender에 각 서비스들을 주입하니 주입한 구현정보들이 출력되는 것을 알 수 있었다.

> 실행 후 콘솔은 아래와 같다.

 

< console >

Real send message hihihihi@email.com to helloWorld Java
Fake send message hihihihi@email.com to helloWorld Java

 

 UML ( Feat. Intelli J Ultimate )

 

> main은 MessageSender를 통해 주입받은 객체를 활용하는 것을 알 수 있다. 

> MessageSender는 service라는 interface의 다형성을 주입받아 활용된다는 것을 알 수 있다.

> 이렇게 UML로 다시한번 그려서보니 더욱더 이해가 잘되는것같다.

 

[끝]

+ Recent posts