기존에 만들어둔 SimpleHelloService
에서 다른 비지니스 로직이 추가된다면 HelloController
의 코드를 수정해야 합니다.
하지만 이것은 매우 좋지 않는 방법입니다.
수정사항이 생기면 어떤 오류가 발생할지 모르고, 유지보수하는데 시간을 빼앗기기 때문입니다.
인터페이스와 DI를 활용해 확장에 유연하게 설계할 수 있습니다.
보통 주입을 할때 생성자를 활용해서 주입을 합니다.
우선 인터페이스를 만들겠습니다.
public interface HelloService {
String sayHello(String name);
}
그리고 HelloController
에서 사용할 클래스를 주입을 받을 수 있게
코드를 변경하겠습니다.
주입받는 코드는 생성자를 통해 받을것이고
HelloService 인터페이스
를 활용하여 확장에 열려있는 형태
로 설계하였습니다.
public class HelloController {
// final은 처음 생성할때 꼭 필요하므로 생성자가 꼭! 있어야 합니다.
private final HelloService helloService;
public HelloController(HelloService helloService) {
this.helloService = helloService;
}
public String hello(String name){
// 컨트롤러의 중요한 역할인 유저의 요청사항을 검증하기
return helloService.sayHello(Objects.requireNonNull(name));
}
}
그리고 Bean으로 등록을 해주면 끝나게 됩니다.
...생략
applicationContext.registerBean(SimpleHelloService.class);
applicationContext.refresh(); // Bean을 만드는 명령어
...생략
어떻게 SimpleHelloSerivce를 빈으로 등록
하였는데 HelloController
에 HelloService
로 주입을 할 수 있을까?
그건 바로 스프링 컨테이너가 주입할 수 있는 Bean을 알아서 주입해주기 떄문입니다.
그럼 주입할 수 있는 타입이 여러가지라면??