Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

(스파르타 코딩클럽) DI, IOC란 본문

TIL

(스파르타 코딩클럽) DI, IOC란

H.S-Backend 2024. 7. 25. 09:59

IOC(Inversion of Control)이란

제어의 역전

메서드나 객체의 호출 작업을 개발자가 아닌 스프링에게 제어권을 넘기는것.

 

이전까지는 개발자가 객체의 생성을 관리하며 제어했으나
스프링을 사용하게 되면서 스프링 컨테이너에 제어권을 넘겨 스프링 컨테이너가 흐름을 제어한다.


 

DI(Dependency Injection) 

 

의존성 주입

객체를 직접 생성하는게 아닌 외부(IOC컨테이너)에서 생성한 후 주입시켜주는 방식

 

의존성 주입 방식

생성자 주입(Constuctor Injection)

수정자 주입(Setter Injection)

필드 주입(Field Injection)

 

스프링에서 권장하는 의존성 주입 방법은 생성자 주입(Constuctor Injection) d이다

 

생성자 주입이란

생성자를 통해 의존관계를 주입하는 방법으로 생성자를 호출시에 딱 한번만 호출되는 것을 보장한다

@Controller
public class TestController {
	private final TestService testService;
    
    public TestController(TestService testService){
    	this.testService = testService;
    }
}

출처: https://mozzi-devlog.tistory.com/18 [우당탕탕:티스토리]

 

수정자 주입이란

Setter를 사용하여 의존관계를 주입하는 방법 .

수정 가능성이 존재하는 의존관계일 때 사용하고 자바의 Bean프로터피 규익 Setter메서드 방식을 사용한다.

수정자 주입의 경우 final선언이 불가능하고 setter메서드에 @Autowired르르 사용한다.

@Controller
public class TestController {
	private TestService testService;
    
    @Autowired
    public void setTestService(TestService testService){
    	this.testService = testService;
    }
}

출처: https://mozzi-devlog.tistory.com/18 [우당탕탕:티스토리]

 

필드주입이란

직접 의존관계를 주입하는 방법이다

코드가 짧아지는 장점이 있지만 외부에서 변경이 불가능하고 테스트 코드를 작성하기 힘들다는 단점이 존재

@Controller
public class TestController {
	@Autowired
	private TestService testService;
}

출처: https://mozzi-devlog.tistory.com/18 [우당탕탕:티스토리]

 

위 세가지 의존성 주입중에 생성자 주입을 추천하는 이유

  • 의존 관계가 설정이 되지 않으면 컴파일 시점에 알 수 있다.
  • 의존성 주입이 필요한 필드를 final키워드로 선언이 가능하다.
  • 스프링에서 순환 참조 기능을 제공하며 순환 참조 시 에러를 보여준다.
  • 테스트 코드 작성에 용이하다.

 

 

정리

클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 

인터페이스에만 의존하고 있어야한다.

런타임 시점의 의존관계는 컨테이너 팩토리 같은 제 3의 존재가 결정한다.

의좐관계는 사용할 오브젝트에 대한 래퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.


DI의 핵심

설계 시점에서 알지 못했던 두 오브젝트의 관계를 맺도록 도와주는 제 3의 존재

(애플리케이션 컨텍스트, 빈팩토리, IOC컨테이너)가 있다.

 

의존관계 주입(DI)이란 DI 컨테이너를 통해 의존 오브젝트의 래퍼런스를 전달받는 과정을 말한다.

 

DI는 자신이 사용할 오브젝트에 선택과 생성 제어권을 외부로 넘기고 

자신은 수동적으로 주입받은 오브젝트를 사용한다는 점에서 IoC의 개념이 잘 들어맞는다.

스프링 컨테이너의 IoC는 주로 의존관계 주입 또는 DI라는 초점에 맞추어져 있으며

스프링을 IoC컨테이너 이외 DI컨테이너, DI프레임 워크라고도한다.

 

https://ktpark1651.tistory.com/336

 

DI 와 IoC 란 무엇인가? (최종 정리)

개요 개발 면접 질문에서 항상 많이 받았던 질문인 DI, IoC 에 대한 정리가 필요하다고 생각해 글을 작성합니다. 책을 읽다보니, DI 보단 IoC 가 더 근간에 가까운 개념이었다는 것을 알게 되었습니

ktpark1651.tistory.com

반응형