의존성 역전 Dependency Injection ( Spring IoC / DI Container )
의존관계란 무엇인가? HelloController는 SimpleHelloService 클래스가 변경되면 영향을 받습니다. 기능이 변경된다던지 메소드가 변경된다던지 할 경우 또는 다른 종류의 클래스 변경되면 HelloController는 영향을 받습니다. 런타임시에 동작하는 기능상에 영향을 주기도 하고 어떤 경우는 소스코드를 고쳐야지만 컴파일되고 동작할 수 있는 정도의 수준의 영향을 받기도 합니다.
HelloController가 뭔가 다른 클래스 다른 오브젝트 기능을 사용하게 되면 헬로 컨트롤러는 그 클래스에 의존하고 있다. 이야기할 수 있습니다.
다만 의존관계의 문제점은 HelloController는 SimpleHelloService를 의존하다 ComplexHelloService로 변경해야할때 코드를 고쳐야하는 부담이 발생합니다.
이러한 문제점을 해소하기위해 자바에서 가장 많이 쓰이는 소프트웨어 원칙은 HelloService 인터페이스만 의존하도록 하도록 구성하는 방법입니다. 그리고 인터페이스를 구현한 클래스들을 만들어둡니다. 이렇게 구성하면 HelloController는 HelloService 인터페이스를 구현한 클래스를 아무리 많이 만들어도 HelloController는 코드를 수정할 필요가 없어집니다. 그 이유는 HelloController는 특정 클래스에 의존하지 않기 때문입니다. 다만 완전히 문제를 해소한건 아닙니다. 소스 코드 레벨에서는 의존을 하고 있지 않더라도 실제로 런타임에서 실행하게 되면 HelloController는 HelloService 인터페이스를 구현한 어떠힌 클래스의 오브젝트를 이용해야합니다. 그 이유는 실제 오브젝트에게 요청을 보내야하기 때문입니다. 그때는 내가 어떤 오브젝트를 사용할것인가가 결정이 되어있어야 합니다. HelloController과 HelloService두 오브젝트 사이의 연관관계를 만들어주는 작업을 의존성 역전이라고 합니다.
의존성 역전에는 결국 제 3의 존재를 필요로 합니다. 그 존재를 Assembler라고 합니다. HelloController는 HelloService 인터페이스를 구현한 어떠한 클래스에 의존을 하는데 소스코드 레벨에서는 의존을 하고싶지 않도록 구현하였습니다. SimpleHelloService에서 ComplexHelloService로 변경되었다 하더라고 소스코드를 수정하지 않도록!
하지만 런타임에 필요하다면 SimpleHelloService오브젝트 대신 ComplexHelloService오브젝트를 사용하겠다. 라고 결정했다면 누군가는 이게 게능하도록 구성해줘야 합니다. 이부분이 어떻게 가능하냐면 HelloController가 사용하는 오브젝트를 직접 new 키워드를 사용해서 만드는 대신 외부에 그 오브젝트를 만들어서 HelloController가 사용할 수 있도록 주입해주는 방법입니다. 이러한 작업을해주는건 Assembler가 해당 역할을 해줍니다. 즉 Assembler는 Spring Container라고 부릅니다.
Sprinb Container는 우리가 메타정보를 주면 메타정보를 바탕으로 클래스의 싱글콘 오브젝트를 만드는데 오브젝트를 생성하는데 그치지않고 이 오브젝트가 사용할 다른 의존 오브젝트가 있다면 그 오브젝트를 주입해주는 작업까지 수행합니다.
'Spring > 인프런 토비의 Spring Boot' 카테고리의 다른 글
섹션 4-5 [독립 실행형 스프링 애플리케이션] DispatcherServlet으로 전환 (0) | 2024.06.01 |
---|---|
섹션 4-4 [독립 실행형 스프링 애플리케이션] 의존 오브젝트 DI 적용 (0) | 2024.06.01 |
섹션 4-2 [독립 실행형 스프링 애플리케이션] 의존 오브젝트 추가 (0) | 2024.06.01 |
섹션 4-1 [독립 실행형 스프링 애플리케이션] 스프링 컨테이너 사용 (0) | 2024.06.01 |
섹션 3-7 [독립 실행형 서블릿 애플리케이션] Hello 컨트롤러 맵핑과 바인딩 (0) | 2024.05.30 |