[Spring] IoC 와 DI
IoC(Inversion of Control) 는 이를 Spring 컨테이너와 같은 프레임 워크로 주체를 넘기는 것을 의미한다.
Aug 22, 2024
1. IoC (Inversion of Control)
객체의 생성과 관리의 주체는 개발자이다.
IoC(Inversion of Control) 는 이를 Spring 컨테이너와 같은 프레임 워크로 주체를 넘기는 것을 의미한다.
따라서 이를 제어의 역전(IoC) 이라고 부른다.
1.1 @Component 와 IoC
Controller 나 Service 어노테이션의 내부를 살펴보면 다음과 같이
@Component
어노테이션이 붙어있는 것을 확인할 수 있다.

이는 Spring 컨테이너에 의해 관리되는
Bean
이 된다는 의미이다.즉, 개발자가
new
를 통해 생성하지 않고, Spring 컨테이너가 자동으로 객체를 생성하고 관리하게 된다.2. DI (Dependency Injection)
객체가 다른 객체에 의존성을 주입받는 방식이다.
Spring 에서는 다양한 방법의 DI 를 지원하는데
@Autowired
와 생성자 주입 방식의 차이를 알아보겠습니다.@Controller
public class UserController {
private UserRepository userRepository;
private HttpSession session;
@Autowired
public void test2(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void test1(HttpSession session) {
this.session = session;
}
}
@RequiredArgsConstructor //final 이 붙은 애들의 생성자를 만들어줌
@Controller
public class UserController {
private final UserRepository userRepository;
private final HttpSession session;
}
첫 번째 코드는
@Autowired
를 사용하여 의존성을 메서드 주입 방식으로 주입받고 있다.
이 방식에서는 메서드마다 @Autowired
어노테이션을 붙여야 하며, 의존성 주입이 필요한 필드마다 메서드를 추가해야 한다.
두 번째 코드는 Lombok의 @RequiredArgsConstructor
를 사용하여 final
필드를 포함하는 생성자를 자동으로 생성한다. 이 방식은 생성자 주입을 통해 모든 의존성을 한 번에 주입받을 수 있다.
2.1 Lombok의 @RequiredArgsConstructor
@RequiredArgsConstructor 는 Lombok에서 제공하는 어노테이션으로
final
필드를 포함하는 생성자를 자동으로 생성해 줍니다.final
키워드는 해당 필드가 상수처럼 사용된다는 의미입니다. 이 필드는 객체 생성 시 반드시 초기화되어야 하며, 이후에는 변경될 수 없다.
스프링 4.3부터는 Autowired의 사용하는 것 보다 생성자 주입을 사용하는 것을 권장하고 있다고 합니다.
생성자 주입이 권장되는 이유로는
불변성 보장, 테스트 용이성, 명시적 의존성, 순환 참조 방지 등이 있는데
RequiredArgsConstructor
사용을 통해 권장 사항을 따를 수 있습니다.Share article