728x90
스프링에서의 의존성 주입이란
- 객체 지향 프로그래밍에서 중요한 기술.
- 객체가 다른 객체들에 의존할 때 필요한 의존 객체들을 외부에서 주입해주는 방법
스프링에서는 어떻게 구현하는가?
- 생성자 주입
생성자를 통해 의존성을 주입받음. 객체가 생성될 때 필요한 모든 의존성이 제공되어야 하므로, 객체는 항상 완전하게 초기화 된 상태로 사용될 수 있음. - 세터 주입
세터 메소드를 통해 의존성을 주입받음. 이 방법은 객체 생성 후에도 의존성을 변경할 수 있어 유연성을 제공하지만, 객체가 완전히 초기화 되지 않은 상태로 사용될 가능성이 있음. - 필드주입
필드에 직접 의존성을 주입함. 이 방법은 코드가 간결해지지만, 테스트와 코드 재사용 측면에서는 권장되지는 않음.
스프링 프레임워크는 이러한 의존성 주입 기능을 내부적으로 구현하기 위해 리플렉션, 프록시, 빈 라이프사이클 관리 등 다양한 기술을 사용함.
왜 의존성 주입을 사용해야 하는가?
- 결합도 감소
객체들 사이의 의존 관계가 완화되어, 각 객체의 변경이 다른 객체에 미치는 영향을 줄일 수 있음. - 코드 재사용 증가
각 객체가 특정 구현에 덜 의존적이기 때문에, 다양한 시나리오에서 재사용할 수 있음. - 테스트 용이성 향상
의존성을 외부에서 주입할 수 있으므로, 테스트용 구현이나 모의 객체(Mock objects) 를 쉽게 주입하여 테스트가 용이해짐. - 코드의 가독성 및 유지보수성 향상
의존성이 명확하게 구분되어 관리되므로, 코드의 이해와 수정이 쉬워짐.
BookRepository
public interface BookRepository {
List<String> findAllBooks();
}
BookRepositoryImpl 구현 클래스
@Repository
public class BookRepositoryImpl implements BookRepository {
@Override
public List<String> findAllBooks() {
// 데이터베이스에서 책 목록을 가져오는 구체적인 로직
return Arrays.asList("Book 1", "Book 2", "Book 3");
}
}
BookService 클래스
@Service
public class BookService {
private final BookRepository bookRepository;
@Autowired
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
public List<String> getBooks() {
return bookRepository.findAllBooks();
}
}
BookService
는 BookRepository
의 구체적인 구현에 대해 알지 못함.
스프링 컨테이너는 실행 시점에 BookRepository
의 적절한 구현체를 BookService
에 자동으로 주입함.
이로 인해 BookService
는 어떠한 BookRepository
구현체가 주입되든지 간에 올바르게 작동할 수 있으며, 테스트 시에는 모의 객체(Mock Object)를 주입하여 테스트가 용이해짐.
DI 방식의 장단점
장점
- 낮은 결합도
DI 를 사용하면 객체들이 서로 강하게 연결되어 있지 ㅇ낳아 서로 독립적으로 개발하고 테스트할 수 있음. - 테스트 용이성
의존성을 외부에서 주입받기 때문에, 단위 테스트 시에 테스트 대상이 사용하는 실제 의존성 대신 모의 객체나 스텁을 주입할 수 있어 테스트가 용이함. - 재사용성 향상
DI를 통해 생성된 모듈은 재사용이 용이함. 의존성이 외부에서 주입되기 때문에 다른 환경이나 애플리케이션에서도 동일한 컴포넌트를 재사용할 수 있음. - 리팩토링 용이성
의존성 주입을 사용하면 기존 코드를 변경하지 않고도 의존성을 교체하거나 업데이트할 수 있음.
단점
- 구현 복잡성 증가
의존성 주입을 위한 프레임워크를 사용하면 초기 구현 시 복잡성이 증가할 수 있음. 특히 큰 프로젝트에서는 DI 시스템을 설계하고 관리하는데 많은 노력이 필요할 수 있음.
- 런타임 오류 가능성
컴파일 시간이 아닌 런타임에 의존성이 결정되기 때문에, 잘못 구성된 의존성으로 인해 런타임에 오류가 발생할 수 있음. - 오버헤드
의존성 주입 프레임워크를 사용하면 성능에 약간의 오버헤드가 발생할 수 있으며, 특히 의존성 해석과 주입 과정에서 추가적인 시간이 소요될 수 있음. - 학습 곡선
의존성 주입을 효과적으로 사용하기 위해서는 DI 패턴과 프레임워크에 대한 이해가 필요함.
728x90
'99클럽 TIL' 카테고리의 다른 글
99클럽 코테 스터디 22일차 TIL Spring 의존성 주입 (1) | 2024.05.09 |
---|---|
99클럽 코테 스터디 21일차 TIL Spring DI 와 IoC, DI와 DIP (1) | 2024.05.08 |
99클럽 코테 스터디 19일차 TIL Spring 제어의 역전(IoC) (0) | 2024.05.06 |
99클럽 코테 스터디 19일차 TIL Spring POJO 기반의 구성 (0) | 2024.05.05 |
99클럽 코테 스터디 18일차 TIL OOP (0) | 2024.05.04 |
Comment