[ 최종 수정일 : 2023년 09월 28일 ]

 

 

컨트롤러는 서비스의 상태가 변경될 경우 영향을 받으며, 이를 "컨트롤러는 서비스에 의존한다"라고 표현할 수 있습니다.

 

 

 

Controller와 Service의 직접 관계


 여기서 문제는 서비스의 상태가 변경될 때마다, 컨트롤러의 코드를 변경해야 한다는 비효율성이 발생합니다.

이러한 문제를 해결하기 위해 컨트롤러와 서비스 사이에 하나의 인터페이스를 두어 서비스가 인터페이스를 구현하도록 합니다.

즉, 이 인터페이스를 통해 서비스의 상태 변경사항에 대해 컨트롤로는 영향을 받지 않으며 느슨한 관계가 형성됩니다.

 

 

 

Dependency Injection(의존성 주입)


 인터페이스를 사용하면 코드의 유지보수성은 비약적으로 좋아지지만,  컨트롤러와 서비스의 관계가 어떤 클래스의 객체로 인해 관계가 형성되었는지가 모호해집니다.

 때문에 이를 정의해주는 과정을 의존성 주입(Dependency Injection)이라고 합니다.

 여기서 주입이란 각 서비스의 레퍼런스를 컨트롤러에 넘겨주는 작업을 의미하며 생성자의 파라미터, Facotry 메서드, 프로퍼티를 통한 Setter 등 다양한 방법으로 의존성 주입을 할 수 있습니다.

 

 

 

 

스프링 컨테이너(Assembler)


 컨트롤러가 각 서비스에 의존할 때, new 연산자로 새롭게 객체를 생성하는 것이 아닌 외부에서 객체를 생성하여 컨트롤러에 주입을 해주며, 이 작업을 해주는 것이 스프링 컨테이너라고 합니다.

 결국 스프링 컨테이너 또한 DI Container의 한 종류이며 Google의 Guice, Dagger 등도 DI Container의 한 종류라고 할 수 있습니다. 그래서 우리가 스프링 컨테이너를 부를 때 Spring DI Container라고 부르는 것 또한 같은 이유입니다.

 

 

 

 

'Spring boot > Spring boot' 카테고리의 다른 글

@Bean, @Component  (0) 2023.10.08
Spring MVC Structure  (0) 2023.10.05
스프링 부트 기본 환경 설정  (0) 2023.09.27
스프링 부트와 컨테이너리스  (0) 2023.09.24

+ Recent posts