반응형
IoC(Inversion of Control)란?
- IoC(Inversion of Control)는 한글로 번역하면 '제어의 역전'이라는 의미, 애플리케이션의 흐름 제어를 개발자가 아닌 프레임워크가 담당하도록 역전된다는 것을 말한다. 다시 말해, 객체의 생성 및 객체 간의 의존성을 수동으로 처리하지 않고, Spring과 같은 IoC 컨테이너가 대신 관리해 주는 것을 의미한다.
- 보통 객체지향 프로그래밍에서는 개발자가 객체를 명시적으로 생성하고, 그 객체가 다른 객체를 사용할 수 있도록 의존성을 직접 주입합니다. 예를 들어, A 객체가 B 객체에 의존하는 경우, A는 B를 생성하거나 그 참조를 받아야 합니다. 이때 개발자가 객체 간의 관계를 직접 설정합니다.
- IoC를 사용하면 이 관계 설정을 개발자가 아닌 Spring 컨테이너가 대신합니다. 즉, 객체 간의 의존성을 Spring이 주입해 주기 때문에, 개발자는 객체의 생성과 관계 설정에 대한 걱정을 덜 수 있습니다. 이렇게 하면 객체들이 훨씬 더 독립적으로 설계될 수 있으며, 필요한 의존성만 Spring이 주입하게 됩니다.
DI(Dependency Injection)란?
- Dependency Injection(의존성 주입)은 IoC의 구현 방식 중 하나로, DI는 한 객체가 다른 객체에 의존할 때, 그 의존성을 직접 객체 내부에서 생성하지 않고 외부에서 주입받는 방식입니다. 이 방식은 객체 간의 결합도를 줄여주며, 유연한 코드 작성을 가능하게 해 줍니다.
- 객체는 종종 다른 객체의 기능을 활용하는 것을 필수적으로 요구해야 하는데, 이러한 관계를 의존성(Dependency)이라고 부른다. 의존성이란 객체가 다른 객체의 기능에 의존한다는 뜻이다.
- DI는 이 의존성을 해결하기 위한 패턴으로, 객체가 스스로 의존성을 해결하지 않고, 외부에서 필요한 객체를 주입받는다는 뜻이다. 이를 통해 객체는 다른 객체를 스스로 생성하거나 관리할 필요 없이, 외부에서 제공받은 의존성을 통해 원하는 기능을 수행할 수 있다.
DI의 유형
- 생성자 주입(Constructor Injection): 객체의 생성자에서 필요한 의존성을 주입받는 방법으로 반드시 의존성이 필요할 때 사용된다.
public class ServiceA {
private final ServiceB serviceB;
public ServiceA(ServiceB serviceB) {
this.serviceB = serviceB;
}
}
- Setter 주입(Setter Injection): 생성자가 아닌, Setter 메서드를 통해 의존성을 주입받는 방법으로, 선택적 의존성이 있을 때 주로 사용된다.
public class ServiceA {
private ServiceB serviceB;
public void setServiceB(ServiceB serviceB) {
this.serviceB = serviceB;
}
}
- 필드 주입(Field Injection): 필드에 직접 의존성을 주입하는 방법으로, 간단하지만 테스트가 어렵고 코드의 가독성을 저하시킬 수 있어 권장되지 않는 방식입니다.
@Autowired
private ServiceB serviceB;
IoC와 DI의 동작 방식
- Spring 컨테이너와 IoC
- Spring 프레임워크의 IoC 컨테이너는 애플리케이션 내의 모든 객체를 관리하고, 객체 간의 의존성을 설정하는 역할을 한다. 개발자는 컨테이너에 Bean을 등록하거나, XML 파일 또는 어노테이션을 통해 의존성을 정의할 수 있다. 컨테이너는 애플리케이션 실행 시 필요한 모든 객체를 생성하고, 의존성 주입을 통해 객체 간의 관계를 설정한다.
- 아래 코드에서 ServiceA는 ServiceB에 의존성을 갖고 있는데, ServiceA가 직접 ServiceB를 생성하지 않고, Spring 컨테이너가 ServiceB 객체를 주입하는 것을 의존성 주입(Dependency Injection)이라 한다.
@Component
public class ServiceB {
public void doSomething() {
System.out.println("ServiceB is working.");
}
}
@Component
public class ServiceA {
private final ServiceB serviceB;
// 생성자 주입
@Autowired
public ServiceA(ServiceB serviceB) {
this.serviceB = serviceB;
}
public void performAction() {
serviceB.doSomething();
}
}
결론
- Spring IoC와 DI는 객체 지향 프로그래밍에서 의존성 관리와 객체 생성을 프레임워크에 맡김으로써 애플리케이션의 유지보수성과 유연성을 극대화하는 개념이다.
- Spring의 IoC 컨테이너가 모든 객체를 관리하고, 의존성 주입을 통해 객체 간의 관계를 설정해 줌으로써 개발자는 비즈니스 로직에 집중할 수 있다.
- 의존성 주입(DI)은 객체가 필요한 의존성을 외부에서 주입받아 관리하는 방법으로, 결합도를 낮추고 테스트와 유지보수를 쉽게 만들어 준다.
728x90
반응형
'Develop' 카테고리의 다른 글
[Scraping] Colab Web Scraping 설정하기 (1) | 2024.10.28 |
---|---|
[k8s] kubeadm 개념 및 명령어 정리 (0) | 2024.10.02 |
[k8s] 구성 요소별 관련 명령어 (3) | 2024.10.02 |
[k8s] Kubernetes 주요 구성 요소 (0) | 2024.10.02 |
[Spring] Spring Bean 생명주기와 @Annotation 정리 (0) | 2024.09.10 |
[Flutter] Uri를 활용한 SMS 보내기 기능 구현 (0) | 2024.08.29 |
[SMTP] 수신 메일에서의 hover, onmouse 기능 미지원 이슈 (4) | 2024.08.28 |
[Java] params URLEncoder 처리 (0) | 2024.07.30 |