DI, IoC에 대해 설명해주세요.
IoC(Inversion of Control)는 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부(프레임워크)에서 결정되는 디자인 패턴을 의미합니다. 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 합니다.
DI(Dependency Injection)는 IoC의 일종으로, 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식입니다. 의존성 주입 방법에는 생성자 주입, 필드 주입, setter 주입 이렇게 3가지가 있습니다. Spring에서 가장 권장하는 의존성 주입 방법은 생성자를 통한 주입 방법입니다. 그 이유는 순환 참조를 방지하고, 불변성을 가지며 테스트에 용이하기 때문입니다.
스프링에서는 스프링 컨테이너(IoC 컨테이너)가 객체의 생명주기를 관리하며, 이때 생성된 객체를 Bean이라고 합니다. 이 Bean들은 의존성 주입을 통해 생성되어 싱글톤 패턴으로 관리됩니다. 이를 통해 개발자들은 비즈니스 로직에 집중할 수 있습니다.