프로그램의 흐름을 개발자가 아닌 프레임워크가 주도한다.
객체의 생성부터 생명주기 관리를 컨테이너가 도맡아서 한다.
즉, 제어권이 컨테이너에게 넘어간다고 해서 제어의 역전이라고 한다.
객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입(의존성 주입) 시키는 방식이다.
이를 통해 모듈 간의 결합도가 낮아지고 유연성이 높아진다.
의존성을 입력받는 setter 메서드를 만들고 이를 통해 의존성을 주입한다.
@Component
public class ArticleController {
private ArticleService articleService;
public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}
}
필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입한다.
@Component
public class ArticleController {
private ArticleService articleService;
public ArticleController(ArticleService articleService) {
this.articleService = articleService;
}
}
롬복의 @RequiredArgsConstructor
를 사용하면 private final
키워드가 붙은 필드들을 가지고 생성자를 자동으로 생성해줘서 생성자 코드를 생략할 수 있다.
@Component
@RequiredArgsConstructor
public class ArticleController {
private final ArticleService articleService;
}
의존성을 주입할 변수에 @Autowired
를 붙인다.
@Component
public class ArticleController {
@Autowired
private ArticleService articleService;
}
💡 권장하는 방법은 생성자 주입이다.