Spring Framework - IoC / DI - 기초
1. IoC(Inversion of Control) / DI(Dependency Injection)
1) 반전 제어 (IoC)
- Library는 애플리케이션 흐름의 주도권이 개발자... Framework은 애플리케이션 흐름의 주도권이 Framework
- 애플리케이션 흐름의 주도권이 뒤바뀌는 기술
- Java 콘솔 애플리케이션의 일반적인 제어권을 아래 코드에 따라 순서대로 진행하여 보면...
- 프로세스의 진행을 위해서 main() 메서드가 있어야 한다
- main() 메서드가 호출되면 System 클래스를 통해서 static 멤버 변수인 out의 println()을 호출한다
- 일반적인 애플리케이션 제어 흐름은 개발자가 작성한 코드를 순차적으로 실행하는 것이다
public class Ioc {
public static void main(String[] args) {
System.out.println("Hello IoC!");
}
}
- Java 웹 애플리케이션에서 IoC가 적용되는 경우 (반전 제어)
- 별도의 main( ) 메서드가 존재하지 않는다
- main( ) 메서드와 같이 애플리케이션이 시작되는 지점을 엔트리 포인트(Entry point)라고 한다
- main( ) 메서드 대신 서블릿 컨테이너 내의 서블릿 로직이 서블릿을 직접 실행 시킨다
- 서블릿 로직은 service( ) 메서드이다
- 웹 애플리케이션은 서블릿 컨테이너가 서블릿을 제어하므로 제어 흐름은 서블릿 컨테이너에 있다
2. DI(Dependency Injection)
- Dependency(의존하는, 종속되는) 와 Injection(주입) 의 합성 의미로 보면 의존성 주입의 의미이다
- IoC 개념을 구체화시킨 내용이다
- 아래 그림에서 A클래스는 B클래스의 기능을 사용하고 있다
- A클래스는 B클래스에 의존한다
- A클래스의 프로그래밍 로직의 완성을 위하여 B클래스에게 의지한다
- 클래스 다이어그램 작성을 자주 해 보는 것이 도움이 된다
※ 클래스 다이어그램 도구 링크 : https://online.visual-paradigm.com/diagrams/features/
Online Drawing Software
Diagram Templates Templates of UML, Flowchart, BPMN, ER diagrams, DFD, Mind Map and more.
online.visual-paradigm.com
1) 클래스 간 의존 관계 성립
- 아래 그림을 참조
2) 의존성 주입
- 클래스 간 의존 관계에서는 new 키워드를 사용하여 객체를 직접 생성했다
- 의존성 주입에서는 외부의 객체를 전달받아 생성자의 파라미터로 주입한다
!!! 클래스의 생성자로 객체를 전달 받는 코드가 있다면
▶ 객체를 외부에서 주입 받고 있으며, 의존성 주입이 이루어 지고 있다!!!
3) 의존성 주입의 필요성
- 일반적으로 Java에서 new 키워드를 사용해서 객체를 생성한다
- Reflection이라는 기법을 이용해서 Runtime시에 객체를 동적으로 생성할 수 있는 방법도 있다
- Stub과 같은 코드를 작성할 경우 new 키워드로 작성하면 내부에서 연동되어 작동하는 클래스명을 모두 고쳐야 한다
- new 키워드를 사용하여 의존 객체를 생성하면 클래스 간의 결합이 강하다고 한다 (Tight Coupling)
- 강한 결합이 있으면 향후 수정, 보완하기가 어렵다
4) 의존성 주입의 방향성
- 의존성 주입은 느슨한 결합이 좋다 (Loose Coupling)
- 느슨한 결합의 대표적인 방법은 인터페이스(Interface)를 사용하는 것이다
- A클래스가 B클래스에 의존하고 있을 경우 B클래스의 구현체가 어떻게 생성되었는지는 중요하지 않다
- A클래스는 의존하고 목적의 결과만 확인할 수 있으면 된다
- 아래 그림에서 CafeClient 클래스에는 new 키워드로 MenuServiceStub 객체를 생성하고 있다
- MenuServiceStub 객체는 MenuService 인터페이스에 할당된다
- 인터페이스 타입의 변수에 구현 객체를 할당하는 것을 업캐스팅(Upcasting)이라고 한다 - 아래 그림은 업캐스팅에 의한 느슨한 결합을 보여준다
5) Spring 기반 의존성 주입
- 기존의 new 키워드를 사용하여 객체를 생성하는 코드를 Spring에서 변경하여 보자
※ 참조 링크
▶ 객체지향 설계 : https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)
SOLID (객체 지향 설계) - 위키백과, 우리 모두의 백과사전
ko.wikipedia.org
▶ 다이어그램 설계 : https://online.visual-paradigm.com/diagrams/templates/class-diagram/
Class Diagram Templates
Class Diagram Templates by Visual Paradigm A class diagram is one of the most widely used UML diagram types. As a type of static structure diagram, class diagram describes the structure of an object-oriented system by showing the system's classes, their at
online.visual-paradigm.com