본문 바로가기
OOP

Spring 의 IoC 와 DI

by Ahngyuho 2025. 2. 4.

오늘은 Spring 에서 사용되는 IoC 와 DI 개념에 대해서 공부한 것을 정리해 보려고 합니다.

 

IoC 란?

IoC는 Inversion of Control의 약자이고, 한국말로 번역하면 제어의 역전이 됩니다. 

쉽게 말하면 여기서 제어란 객체를 생성하고 관리하는 것을 의미합니다. 이 제어를 개발자가 아닌 프레임워크가 하기 때문에 이것을 보고 역전이 되었다라고 표현하는 것입니다.

즉 제어의 역전은 객체를 생성하고 관리하는 것이 개발자가 아닌 프레임워크가 하게 되는 것을 의미합니다.

 

스프링 같은 프레임워크 없이 개발을 하는 경우, 개발자가 객체를 생성하고 관리하게 됩니다.

public class Test02Controller {
    private final Test02Service test02Service;
    public Test02Controller() {
        this.test02Service = new Test02Service();
    }
}


public class Test02Service {
    private final Test02Repository test02Repository;
    public Test02Service() {
        this.test02Repository = new Test02Repository();
    }
}



public class Test02Repository {
}

 

하지만 위에 방식처럼 개발자가 직접 new 키워드를 이용해서 객체를 생성하게 되면, 두 객체간에 강하게 결합됩니다. 이렇게 되면 Service 의 구현부가 바뀌게 되면 Service 를 의존하는 Controller 도 코드를 변경하게 될 수 있는 가능성이 존재하기 때문에 유지보수 하기 어려운 코드를 만들 수 있습니다. 

 

결국 근본적인 문제는 객체의 생성 및 관리가 핵심 애플리케이션 코드에 포함되어 있는 것이었습니다.

개발자는 사용자의 요구사항을 만족시키기 위한 코드를 작성하면 되는데, 그렇게 되면 사실 객체의 생성 및 관리는 개발자가 신경써야 하는 문제는 아닌 것입니다. 그래서 이 객체 생성 및 관리 코드를 실제 개발 코드에서 완전히 분리하기 위한 시도가 생겨났고, 그 중 하나가 바로 IoC 입니다!

 

Spring IoC 는 Spring 이 제공하는 객체 생성 및 관리를 의미합니다.

 

그렇다면 DI 는 무엇일까요?

DI 란

DI는 Dependency Injection 의 약자로 한국어로 번역하면 의존성 주입 입니다.

 

DI 를 통해 IoC 로 관리되는 객체들을 개발자가 작성하는 코드 외부로부터 주입받을 수 있게 해주는 것이 DI 입니다.

즉 DI 는 IoC 로 만들어진 객체들을 받아오게 할 수 있는 방법 이라고 생각하면 됩니다.

 

DI의 특징은 객체를 외부로 부터 받아온다는 것입니다.

 

Spring DI 는 총 4가지의 방식이 존재합니다.

  • 생성자 주입
  • Autowired(필드 주입)
  • setter 주입
  • 매개변수 주입

생성자 주입이 가장 추천되는 방식인데 그 이유는 의존 대상 객체를 final 멤버변수로 선언하고 이 변수를 생성자를 통해 주입 받게되면 불변성을 얻을 수 있기 때문입니다.

 

또 하나의 장점은 Mocking 시 생성자로 의존성을 받았기 때문에 쉽게 Mock 객체로 대신 주입할 수 있습니다. -> 테스트 용이성

 

실제 IoC 와 생성자 주입 DI 를 적용한 코드를 작성해 보았습니다.

 

@Controller
public class Test02Controller {
    private final Test02Service test02Service;
    public Test02Controller(Test02Service test02Service) {
        this.test02Service = test02Service;
    }
}

@Service
public class Test02Service {
    private final Test02Repository test02Repository;
    public Test02Service(Test02Repository test02Repository) {
        this.test02Repository = test02Repository;
    }
}

@Repository
public class Test02Repository {
}

 

정리

  • IoC 는 객체 생성 및 관리를 프레임워크가 한다는 것을 의미
  • DI 는 IoC를 구체적으로 어떻게 사용할 것인지에 대한 방법 중 하나이고, Spring DI 는 개발자 코드 외부에서 객체를 주입해준다. 
  • Spring DI 는 총 4가지로 Setter 주입, 매개변수 주입, 필드 주입, 생성자 주입이 있고 생성자 주입은 테스트 용이성, 불변성 등 여러 장점이 있어서 가장 추천됨

 

 

'OOP' 카테고리의 다른 글

DIP(Dependency Inversion Principle) 의존성 역전 원칙  (0) 2025.02.15
MVC 패턴  (1) 2025.01.08
USE CASE  (1) 2024.12.02