[Spring] 제어의 역전(IoC)와 의존성 주입(DI)

KUKJIN LEE's profile picture

KUKJIN LEE1개월 전 작성

제어의 역전 (IoC)란?

객체의 생성과 그 객체가 어떤 다른 객체와 협력할지를 개발자가 아니라 Spring 프레임워크가 관리합니다. 객체가 스스로 필요한 것을 만들지 않고, 외부에서 받아서 사용한다는 뜻입니다.

 

프론트 개발자에게 설명한다면?

부모 컴포넌트가 자식 컴포넌트에 props를 통해 데이터를 전달합니다. 자식 컴포넌트는 그 데이터를 스스로 만들지 않고, 외부로부터 받습니다. SpringIoC도 비슷합니다. 객체가 직접 다른 객체를 생성하지 않고, 외부에서 필요한 객체를 전달받습니다.

 

// React 예시
function ChildComponent({ data }) {  // 부모로부터 데이터 받음
    return <div>{data}</div>;
}

function ParentComponent() {
    return <ChildComponent data="Hello, Spring!" />;
}

 

객체가 직접 의존성을 관리하지 않고, 외부에서 필요한 객체를 주입받습니다.

전통적인 방식에서는 객체가 스스로 의존성을 관리했습니다. new Engine (); 하지만 IoC에서는 Car가 Engine을 직접 생성하는 대신, 외부에서 주입 받습니다.

 

public class Car {
    private Engine engine;

    public Car(Engine engine) {
        // this.engine = new Engine(); 직접 객체 생성
        this.engine = engine;  // 외부에서 의존성 주입
    }

    public void start() {
        engine.start();
    }
}

 

의존성 주입(DI)란?

객체가 필요로 하는 의존성을 외부에서 주입해 주는 방식입니다.

 

Spring 의존성 주입(DI) 방식

  1. 생성자 주입 (Constructor Injection): 객체가 생성될 때 의존성을 주입
    @Component
    public class Car {
        private Engine engine;
    
        // 생성자 주입
        @Autowired
        public Car(Engine engine) {
            this.engine = engine;
        }
    
        public void start() {
            engine.start();
        }
    }
  2. 필드 주입 (Field Injection): 코드가 간결해 보이지만, 테스트가 어려워질 수 있고, 객체 상태가 불명확해지는 문제가 존재하기 때문에 권장되는 방식은 아닙니다.

    @Component
    public class Car {
        @Autowired
        private Engine engine;  // 필드에 직접 주입
    
        public void start() {
            engine.start();
        }
    }

의존성 주입의 장점

객체가 직접 의존성을 관리하지 않기 때문에 코드의 결합도를 낮추고, 유연성을 높입니다. 객체 간 의존성을 쉽게 교체하거나 확장할 수 있습니다.

 

특히 Spring의 IoCDI는 객체의 생성과 관계 관리를 프레임워크가 대신해줌으로써, 객체의 생성과 관리를 신경 쓰지 않고 비즈니스 로직에 집중할 수 있습니다.

New Tech Posts