Dependency Injection
단일 책임 원칙과 의존성 역전 원칙을 지키기 위해 도입된 개념입니다. 의존성 주입으로 더욱 알려져 있습니다. 대부분의 객체는 다른 객체를 의존하게 됩니다. 이 때, 의존성을 외부에서 주입하는 것을 의미하게 됩니다.
간단한 예시
아래와 같은 Class Diagram이 가정해보겠습니다. MessagePrinter는 MessageService를 통해 메시지를 수신할 수 있습니다.
classDiagram
class MessageService {
<<interface>>
+String getMessage()
}
class HelloWorldMessageService {
+String getMessage()
}
class MessagePrinter {
-MessageService service
+MessagePrinter(MessageService service)
+void printMessage()
}
MessageService <|-- HelloWorldMessageService
MessagePrinter *-- MessageService
// MessageService의 역할을 인터페이스로 표현
public interface MessageService {
String getMessage();
}
// MessageService의 구현체
public class HelloWorldMessageService implements MessageService {
@Override
public String getMessage() {
return "Hello, World!";
}
}
public class MessagePrinter {
private MessageService service;
// 생성자를 통해 의존성을 주입받음
public MessagePrinter(MessageService service) {
this.service = service;
}
public void printMessage() {
System.out.println(service.getMessage());
}
}
위와 같이 구성함으로써, MessagePrinter는 MessageService 라는 역할에만 의존할 수 있고, 구현체가 어떻게 변경되더라도 동일한 동작을 수행함을 예상할 수 있습니다.
Spring Framework
Spring Framework 에서는 의존성 주입 기능을 제공합니다. Spring 에서는 실행 시점에 Spring Container를 만들어 필요한 Bean들을 등록하고 관리합니다. 등록된 Bean 들을 기반으로 의존성 주입을 가능하게 합니다.