이전의 TIL에서 DI와 IoC에 대해서 정리를 했었지만, 그때보다 개념이 좀 더 확실하게 잡혀서 다시금 기록하려고 한다.
현실에서의 패키지여행이라는 예시로 설명해 보겠다. 패키지여행에서 손님의 역할은 관광이다. 패키지여행을 신청하면 언제, 어떤 곳을 갈지, 어떤 식당을 갈지 등 모든 일정은 여행사가 제공해 주는 것을 따라야 한다. 손님은 여행사에게 여행을 맡기고 온전히 관광에 집중하면 된다. 여행사라는 별도의 설정자를 통해 일정을 주입받고 오롯이 관광에 집중하는 것이다. 이렇듯 클라이언트(손님)가 여행을 직접 제어하는 것이 아니라 시스템(여행사)이라는 외부에서 여행을 제어하고 관리하는 것이 바로 제어의 역전 IoC이다.
그런데 위에서 말한 일정은 언제든지 변경될 수 있다. 여행 도중 비다 쏟아진다거나, 식당의 휴업 등 다양한 원인으로 일정이 변경될 수 있다.
하지만 여행사가 손님에게 제공하는 일정이 바뀌어도 손님의 관광에는 지장이 없다. 이렇듯 실행 시점에서 실제 의존 관계가 정해지고 연결되는 것을 의존관계 주입, DI이라고 한다.
관계를 정리하면 다음과 같다.
코드상에서 여행사의 역할을 해주는 것을 DI컨테이너 혹은 IoC컨테이너라고 하며 보통 스프링이 이 역할을 대신해 준다.
개인적인 생각으로 DI는 IoC를 달성하기 위한 기법 중 하나이다.
DI는 보통 3가지 방법으로 구현할 수 있다. 각 특징은 다음과 같으며 그 중 생성자 주입 방법에 대해서만 언급하겠다.
public class MemberService {
private final MemberRepository memberRepository;
@Autowired // 생성자가 하나일 때 생략 가능
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository
}
}
다시금 공부하면서 IoC 를 잘 사용해야지 좋은 객체 지향 프로그래밍을 실현할 수 있다는 생각을 계속했다. 특히 SOLID 원칙 중 'OCP 개방 폐쇄 원칙'과 'DIP 의존 관계 역전 원칙'을 고수하기 위해서는 필수적이다.
기초적이고 기본적인 내용이지만 멀리 가기 위해서는 단단히 다져야한다.
차분히 멀리 가자.
[TIL#35] 개념 정리] RESTful (0) | 2024.04.15 |
---|---|
[TIL#34] 개념 정리] 객체 지향 프로그램 (0) | 2024.04.08 |