[Spring] IoC 와 DI

IoC(Inversion of Control) 는 이를 Spring 컨테이너와 같은 프레임 워크로 주체를 넘기는 것을 의미한다.
HootJem's avatar
Aug 22, 2024
[Spring] IoC 와 DI

1. IoC (Inversion of Control)

객체의 생성과 관리의 주체는 개발자이다. IoC(Inversion of Control) 는 이를 Spring 컨테이너와 같은 프레임 워크로 주체를 넘기는 것을 의미한다. 따라서 이를 제어의 역전(IoC) 이라고 부른다.

1.1 @Component 와 IoC

Controller 나 Service 어노테이션의 내부를 살펴보면 다음과 같이 @Component 어노테이션이 붙어있는 것을 확인할 수 있다.
notion image
notion image
이는 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

[HootJem] 개발 기록 블로그