ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot - IoC와 DI
    Framework & Library/Spring Boot 2021. 9. 23. 17:54

    IoC(Inversion of Cotainer)

    IoC란?

     - IoC는 Inversoin of Container의 약자로, 제어의 역전이란 의미를 가지고 있다.

     - 제어의 역전이란 객체의 생명주기 관리를 컨테이너가 도맡아, 제어권이 개발자에서 컨테이너로 넘어가게 되어 제어권의 흐름이 바뀌었다는 것을 뜻한다.

     - 즉, 개발자가 직접 new 키워드를 통해 인스턴스를 생성하고, 메서드를 호출하는 작업들을 스프링에 위임하는 것이다.


    DI(Dependency Injection)

    DI란?

     - DI란 의존 관계 주입이라 하고, 어떤 객체가 사용하는 의존 객체를 내부에서 직접 생성하는 것이 아니라 외부에서 주입하는 방식을 말한다.

     

    DI의 사용 이유

     - 객체를 주입받는다는 것은 외부에서 생성한 객체를 넘겨받는 것이기 때문에 결합도를 낮출 수 있고, 런타임 시에 의존관계가 결정되기 때문에 유연한 구조를 가진다.

     - 내부에 직접 객체를 생성할 경우, 내용을 수정할 때 코드 자체를 수정해야 한다. 하지만, DI를 사용할 경우 이를 정의하고 있는 파일만 수정하면 되기 때문에 유지보수에서도 유리한 점을 지니고 있다.


    의존성 주입의 세 가지 방법

    Field Injection(필드 주입)
    @Component
    public class TestController {
    
        @Autowired
        private TestService testService;
    }

     - 가장 간단한 방법으로 Bean으로 등록된 객체를 사용하고자 하는 클래스에 Field로 선언한 후 @Autowired 애너테이션을 통해 주입하는 방법이다.

     - 이 방식은 가장 간단한 선언 방식이다.

     - 하지만, 의존 관계가 눈에 잘 보이지 않아 추상적이고, 이로 인해 의존성 관계가 과도하게 복잡해질 수 있다는 단점이 있다.

     

    Setter Injection(수정자 주입)
    @Component
    public class TestController
    
        private TestService testService;
        
        @Autowired
        public void setTestService(TestService testService) {
            this.testService = testService;
        }
    }

     - setter 메서드에 @Autowired 애너테이션을 선언하여 주입하는 방법이다.

     - 의존성을 선택적으로 나누어 주입할 수 있도록 부담을 덜어준다.

     - 하지만, 의존성 주입 대상 필드를 final로 선언하는 것이 불가능하다.

     

    Constructor Injection(생성자 주입)
    @Component
    public class TestController
    
        private final TestService testService;
        
        public TestController(TestService testService) {
            this.testService = testService;
        }
    }

     - 생성자에 의존성 주입을 받고자 하는 field를 나열하는 방법으로, 권고되는 방법 중 하나이다.

     - 필수적으로 사용해야 하는 레퍼런스 없이는 인스턴스를 만들지 못하도록 강제한다.

     - Spring 4.3 이상부터는 생성자가 하나인 경우 @Autowired 애너테이션을 사용하지 않아도 된다.


     

    GitHub - qlsdud0604/spring-boot-basic: 스프링 부트의 기본적인 작동원리를 학습하기 위한 프로젝트

    스프링 부트의 기본적인 작동원리를 학습하기 위한 프로젝트. Contribute to qlsdud0604/spring-boot-basic development by creating an account on GitHub.

    github.com

     

    728x90

    댓글

Designed by Tistory.