-
Spring Boot - IoC와 DIFramework & 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 애너테이션을 사용하지 않아도 된다.
728x90'Framework & Library > Spring Boot' 카테고리의 다른 글
Spring Boot - Transaction(트랜잭션) (0) 2021.11.29 Spring Boot - Filter (0) 2021.11.28 Spring Boot - AOP (0) 2021.09.23 Spring Boot - 사용자 입력 데이터 처리 (0) 2021.09.23 Spring Boot - 스프링 웹 개발 기초 (0) 2021.09.23