Spring Framework

Spring Framework - IoC / DI - 기초

상상날개 2022. 6. 17. 15:54

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