IoC / DI

hellonayeon·2021년 10월 26일
2
post-thumbnail

스프링 정의

  • Java 애플리케이션 개발을 위한 포괄적인 인프라 지원을 제공하는 Java 플랫폼
    └── 스프링이 인프라를 처리하므로 개발자는 애플리케이션 개발(비즈니스 로직)에 집중 가능

  • 백엔드 오픈소스 프레임워크


  Inversion of Control  

제어의 역전은 개체 또는 프로그램 부분의 제어를 컨테이너 또는 프레임워크로 이전하는 기능

기존의 프로그래밍은 개발자가 코드 상에서 라이브러리 를 직접 호출하고 작성한 코드의 흐름대로 프로그램이 작동한다. 하지만 스프링을 사용하면 의존성 주입 에 의해 프레임워크 가 개발자의 코드를 호출하는 형태가 된다.

  Dependency Injection  

의존성 주입은 프레임워크가 객체를 생성해서 의존 관계에 있는 객체에 대입해주는 기능

객체의 의존 관계 는 한 객체에서 다른 객체를 참조하는 관계를 의미한다. 아래의 코드에서 ParkingLot 객체는 Car 객체에 의존하고 있으며, ParkingLot 이 직접 Car 객체의 생성을 관리하고 있다.

class ParkingLot {
    private Car car;
    
    public ParkingLot() {
        this.car = new Venz();
    }
}

interface Car {}

class Venz implements Car {}

class Lamborghini implements Car {}

이러한 구조에는 한 가지 문제점이 있는데, 바로 두 객체가 강한 결합 을 이루고 있다는 점이다. 만약 주차장에 있는 차가 Venz 가 아니라 Lamborghini 라면 ParkingLot 클래스를 직접적으로 수정해줘야한다.

class ParkingLot {
    prviate Car car;
    
    public ParkingLot() {
        this.car = new Lamborghini();
    }
}
...

변경사항이 있을 때마다 코드를 일일이 수정하는건 너무나 번거로운 일이다😫 따라서 내부에서 직접 new 연산자를 통해 객체를 생성하는 방법보다는 외부에서 객체를 생성한 후 주입해주는 방법을 사용함으로써 두 객체를 따로 관리할 수 있다. 생성자Setter 를 이용해서 외부로부터 객체를 주입받는 방법이다.

class ParkingLot {
    private Car car;
    
    // Constructor
    public ParkingLot(Car car) {
       this.car = car;
    }
    
    // Setter
    public void setCar(Car car) {
       this.car = car;
        
    }


public class Main {
    public static void main(String[] args) {
       Car car = new Venz();
       
       // 생성자를 이용한 객체 주입
       ParkingLot parkingLot = new ParkingLot(car);
       
       // Setter를 이용한 객체 주입
       parkingLot.set(car);
    }
       
}

이로써 ParkingLot 객체와 Car 객체를 분리해서 관리할 수 있게 됐지만, 외부에서 주입하더라도 개발자가 객체를 직접 생성해야함에는 변함이 없으며 Car 객체를 Venz 에서 Lamborghini 객체로 변경하고 싶을때 수작업으로 변경해줘야하 하는 사실도 여전하다!

스프링 프레임워크를 사용하면 Dependency Injection 기능에 의해 객체들의 관계를 느슨한 결합 형태로 관리할 수 있다. 개발자가 직접 객체를 생성하지 않고 스프링 설정 파일에 객체 정보를 기술함으로써 스프링이 객체를 생성해주고 의존 관계가 있는 곳에 주입해준다.


참고 문서

📌 Spring Framework Reference Documentation

📌 Spring Dependency Injection

📌 Intro to Inversion of Control and Dependency Injection with Spring

📌 gillog. "[Spring] DI, IoC 정리", 기록보단 길록을, 31 Oct. 2020.

0개의 댓글