의존성 주입(Dependency Injection, DI)은 객체 지향 프로그래밍에서 객체의 의존성을 외부에서 주입받는 디자인 패턴을 의미함
DI는 소프트웨어 모듈 간의 결합도를 낮추고 코드의 재사용성과 테스트 가능성을 높이기 위해 사용됨
DI는 크게 세 가지 요소로 구성됨
- 의존성(Dependency), 주입(Injection), 제어 역전(Inversion of Control, IoC)
의존성(Dependency)
- 의존성은 클래스가 다른 클래스의 기능을 필요로 하는 관계를 말함
- 예를 들어 UserService 클래스가 데이터베이스에서 유저 정보를 가져오는 UserRepository를 사용해야 한다면, UserService는 UserRepository에 의존성을 가지게 됨
- 클래스 내부에서 다른 클래스의 인스턴스를 직접 생성하는 방식은 결합도가 높아져 클래스 수정이 어렵고 테스트가 복잡해 질 수 있음
주입(Injection)
- 주입이란 클래스가 필요로 하는 의존성을 외부에서 주입해 주는 것을 의미
- 직접 의존성을 생성하지 않고 외부에서 생성한 객체를 전달 받음으로써 의존성의 결합을 줄이는 방식
- DI에서는 세 가지 주입 방법이 주로 사용됨
/*
생성자 주입 : 필요한 의존성을 클래스 생성자에서 받는다.
이는 의존성이 반드시 필요할 때 유용하고, 가장 일반적으로 사용되는 방식이다.
*/
public class UserService
{
private readonly UserRepository _userRepository;
public UserService(UserRepository userRepository)
{
_userRepository = userRepository;
}
}
/*
세터 주입 : 생성 후 필요한 의존성을 설정자 메서드로 전달 받는다.
이는 의존성이 선택적일 때 유용하다.
*/
public class UserService
{
private UserRepository _userRepository;
public void SetUserRepository(UserRepository userRepository)
{
_userRepository = userRepository;
}
}
/*
인터페이스 주입 : 클래스가 특정 인터페이스를 구현하여 의존성을 주이받는다.
인터페이스를 통해 의존성을 전달하므로 DI 컨테이너나 프레임워크에서 활용되기도 한다.
*/
public interface IUserService
{
void SetRepository(UserRepository userRepository);
}
제어 역전(Inversion of Control, IoC)
- DI의 핵심 개념 중 하나로, 객체의 생성과 생명주기를 관리하는 책임이 객체 자체가 아닌 외부의 다른 구성요소(주로 IoC 컨테이너)에 있다는 의미
- IoC 컨테이너는 객체를 생성하고 주입하는 작업을 자동으로 처리해 주기 때문에 클래스는 자신이 필요한 객체를 스스로 관리할 필요가 없음
- 이로 인해 모듈 간 결합도가 낮아지고 코드의 유연성이 높아짐
DI와 IoC 컨테이너의 역할
- IoC 컨테이너는 애플리케이션의 모든 의존성을 관리함.
- 대표적인 IoC 컨테이너로는 .NET의 Microsoft.Extensions.DependencyInjection, Java의 Spring Framework 등
- 컨테이너는 의존성 주입 관리, 객체 생명주기 관리, 결합도 관리 역할을 수행
DI의 장점
- 결합도 감소
- 재사용성 증가
- 테스트 용이성
- 코드 가독성 및 유지보수성 향상
DI 사용 시 주의사항
- 필요 이상으로 남발하지 않기 : 너무 많은 의존성을 주입받으면 코드가 복잡해지고 관리가 어려워질 수 있음
- 정확한 IoC 컨테이너 설정 : DI 컨테이너 설정이 잘못되면 의존성 주입 과정에서 오류가 발생할 수 있음
- 순환 의존성(Circular Dependency) 피하기 : 서로가 서로를 의존하는 경우 DI가 순환 참조 문제를 일으킬 수 있음
'개발' 카테고리의 다른 글
[SVN] VisualSVN Server license expired. 에러 (0) | 2024.12.03 |
---|---|
[Web] 클라이언트 폴링(Polling), SSE, WebSocket 비교 (0) | 2024.11.28 |
[web] 서버 사이드 렌더링, 클라이언트 사이드 렌더링 (0) | 2024.11.06 |