DI (Dependency Injection)

Sol's·2023년 5월 24일
0

기존에 만들어둔 SimpleHelloService에서 다른 비지니스 로직이 추가된다면 HelloController의 코드를 수정해야 합니다.
하지만 이것은 매우 좋지 않는 방법입니다.
수정사항이 생기면 어떤 오류가 발생할지 모르고, 유지보수하는데 시간을 빼앗기기 때문입니다.

인터페이스와 DI를 활용해 확장에 유연하게 설계할 수 있습니다.
보통 주입을 할때 생성자를 활용해서 주입을 합니다.

인터페이스를 만들고 Spring Container를 활용해 확장해보기

우선 인터페이스를 만들겠습니다.

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을 만드는 명령어

...생략

DI하는 과정

어떻게 SimpleHelloSerivce를 빈으로 등록하였는데 HelloControllerHelloService로 주입을 할 수 있을까?

그건 바로 스프링 컨테이너가 주입할 수 있는 Bean을 알아서 주입해주기 떄문입니다.
그럼 주입할 수 있는 타입이 여러가지라면??

profile
배우고, 생각하고, 행동해라

0개의 댓글