오늘은 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 |