IoC / DI 에 대해 설명해 주세요.
IoC와DI는 스프링의 핵심 개념 중 하나이다.객체 지향 프로그래밍에서 중요한 디자인 패턴으로, 코드의 결합도를 낮추고 유연성을 높일 수 있게 해준다. 왜냐하면 개발자가 직접 의존성 관리를 하는 것보다 효율적으로 할 수 있기 때문이다.
IoC
IoC는 Inversion Of Control의 약자로, 제어의 역전이라는 뜻을 가지고 있다.뜻 그대로 프로그램의 흐름을 개발자가 아닌 프레임워크가 관리하는 것을 의미한다.
객체의 생성과 생명주기 관리를 프레임워크가 담당하게 되어, 개발자는 비즈니스 로직에 더 집중할 수 있다.
DI
DI는 Dependency Injection의 약자로, 의존성 주입이라는 뜻을 가지고 있다.객체 간의 의존성을 외부에서 주입하는 방식을 말한다.
DI를 통해 얻을 수 있는 장점
개발자는 객체 간의 결합도를 낮추고, 코드의 유연성을 높일 수 있다.
DI를 통해 객체는 필요한 의존성만 제공받으므로, 코드의 변경에 더 유연하게 대응할 수 있다.
테스트 시에 실제 객체 대신
Mock객체를 주입할 수 있기 때문에 단위 테스트 시에 용이하다.
스프링에서의 IoC와 DI
스프링에서는 스프링 컨테이너를 통해
IoC와DI가 이루어진다. 떄문에 스프링 컨테이너를 IoC 컨테이너, DI 컨테이너 라고 부르기도 한다.클래스 사이의 의존 관계를
Bean설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 방식으로 제공한다.스프링에서는
@Component가 포함된 애노테이션,@Configuration과@Bean,XML설정 파일을 통해 특정 클래스를 스프링 빈으로 등록할 수 있다.스프링이 이렇게 다양한 형식을 지원할 수 있는 이유는 스프링 컨테이너 밑에
BeanDefinition이라는 추상화가 잘 설계되어 있기 때문이다.스프링에서
BeanFactory또는ApplicationContext라는 객체가 스프링 컨테이너의 역할을 해주며,ApplicationContext가BeanFactory의 기능을 상속받고 추가적으로 메시지소스 국제화 기능, 환경 변수 등 부가 기능을 제공한다.
의존관계 주입 방법
필드 주입
장점 : 사용하기 편하다.
단점 : 테스트하기 어렵고, DI 컨테이너와 결합도가 커진다.
수정자 주입
장점 : 선택적으로 의존관계를 주입할 수 있다.
단점 :
setter를public으로 열어두어야 하기 때문에 불변이 보장되지 않는다.
★생성자 주입★
장점 : 불변성이 보장되고,
NPE를 방지할 수 있다.단점 : 필요한 인자가 많아질수록 코드도 길어진다.(
@RequiredArgsContructor로 보완 가능)
가장 권장되는 주입 방법은 생성자 주입이다. 왜냐하면, 생성자 주입은 객체를 생성할 때 딱 한 번만 호출되어 불변한 설계가 가능하고, 의존관계 주입이 누락이 됐을 때 유일하게 컴파일 에러로 잡아준다. 또한 유일하게 순환 참조가 발생했을 때 컴파일 에러로 잡아준다.
참고
Last updated