IoC (Inversion of Control)
"제어의 역전"
메서드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 스프링에게 제어권을 넘기는 것을 의미한다.
이전까지는 개발자가 객체의 생성을 관리하며 제어했지만, 스프링을 사용하게 되면 스프링 컨테이너에게 제어권을 넘겨 스프링 컨테이너가 흐름을 제어하게 된다.
스프링과 같은 프레임워크를 사용할 때 Controller, Service 같은 객체들의 동작을 구현은 우리가 직접 하지만, 해당 객체들이 어느 시점에 호출될지는 신경 쓰지 않는다. 단지 프레임워크가 요구하는 대로 객체를 생성하면, 프레임워크가 해당 객체들을 가져다가 생성하고, 메서드를 호출하고, 소멸시킨다. 프로그램의 제어권이 역전된 것이다.
IoC는 원칙이며, 세부 구현 사항은 개발자에게 달려있다. IoC가 구현된 예는 다음 세가지가 있다.
- Dependency Injection(의존성 주입)
- Service Locator Pattern
- Event-driven Programs (이벤트 기반 프로그램)
그 중 Dependency Injection(의존성 주입)에 대해서 알아보자
DI (Dependency Injection)
스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능으로, 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식이다.
DI를 통해서 모듈 간의 결합도가 낮아지고 유연성이 높아진다.
public class A {
private B b = new B();
}
A라는 클래스는 B라는 클래스를 필드로 가지고 있다. 그런데 B 클래스 내부에 final 필드를 추가한다면 'new B( )' 부분에서 컴파일 에러가 나게 될 것이다. B의 변경이지만 A도 영향을 받게 되는데 이런 경우를 "A가 B에 의존한다." 라고 한다.
그렇다면 의존성 주입이란? 위와 같은 상황을 방지하기 위해 이 의존성을 외부에서 주입해 준다는 의미가 된다.
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
위 코드도 마찬가지로 A가 B에 의존하고 있다. 하지만 의존 대상을 직접 생성(결정)하는 것이 아니라 외부로부터 주입받는다. 의존성을 외부로부터 주입받는다고 할 수 있다.
의존성 주입 방법에는 세가지가 있다.
생성자 주입 (Constructor Injection)
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
위에서 살펴본 주입 방법이다.
Setter 주입 (Setter Injection)
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
}
인터페이스 주입 (Interface Injection)
public interface BInjection {
void inject(B b);
}
public A implements BInjection {
private B b;
@Override
public void inject(B b) {
this.b = b;
}
}
어떤 의존성을 주입할 것인지를 인터페이스에 명시하고, 의존성을 주입받는 클래스는 해당 인터페이스의 구현체로 만든다. (setter 주입과 비슷)
DI의 장점
- 의존성이 줄어든다. (변경에 덜 취약해진다.)
- 모의 객체를 주입할 수 있기 때문에 단위 테스트가 쉬워진다.
- 가독성이 높아진다.
- 재사용성이 높아진다.
참고
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
IT 커리어 성장 코스 항해99, 첫 취업부터 현직자 코스까지
항해99는 실무에 집중합니다. 최단기간에 개발자/PM으로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.
hanghae99.spartacodingclub.kr
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
[항해 취업코스] 개발자 취준 기록 14 - Annotation (0) | 2024.03.10 |
---|---|
[항해 취업코스] 개발자 취준 기록 13 - MVC 모델 (0) | 2024.03.07 |
[항해 취업코스] 개발자 취준 기록 11 - Java Map 내부 구현 파악 (1) | 2024.03.07 |
[항해 취업코스] 개발자 취준 기록 10 - Garbage Collector (0) | 2024.03.07 |
[항해 취업코스] 개발자 취준 기록 9 - 클래스와 인스턴스의 차이 (feat. 객체) (0) | 2024.03.06 |