티스토리 뷰
의존성(Dependency)
하나의 객체가 다른 객체 없이 제대로된 역할을 할 수 없다는것을 의미한다.
즉, 하나의 객체가 다른 객체의 상태에 따라 영향을 받는것이다.
ex ) A객체가 B객체 없이 동작이 불가능한 상황을 'A가 B에 의존적이다'라고 한다.
주입(Injection)
외부에서 밀어 넣는것을 의미한다.
∴ 의존성과 주입을 결합해서 생각하면 '어떤 객체가 필요한 객체를 외부에서 밀어 넣는다'는 의미가 된다.
why?
왜 굳이 외부에서 객체를 주입해야 하나?
장사를 예로 들면
사과 샌드위치가게, 사과 샐러드가게가 있고 여러 가게에 사과를 납품하는 납품회사가 있다고 가정해보면
이해하기 쉽다.
사과를 납품하는 회사는 여러가게에 사과라는 객체만 전달해주면 된다.
또한 사과 샌드위치 가게와 샐러드 가게는 각자 본인들의 메뉴에만 집중하고
납품받은 사과를 메뉴에 맞게 조리하기만 하면 된다.
즉, 주입 받는 입장에서는 어떤 객체인지 신경 쓸필요가 없으며
어떤 객체에 의존하든 자신의 역할은 변하지 않는다.
의존성 주입이란?(DI)
- ‘외부'에서 클라이언트에게 서비스를 제공(주입)하는 것 - 객체가 필요로 하는 어떤 것을 외부에서 전달해주는 것.
- 이런 연관 관계를 개발자가 직접 코딩을 통해 컴포넌트(클래스)에 부여하는 것이 아니라 컨테이너가 연관 관계를 직접 규정하는것.
- 코드에서 직접적인 연관 관계가 발생하지 않으므로 각 클래스들의 변경이 자유로워짐(loosely coupled, 약한 결합).
- 의존성 주입을 가능하게 하는 디자인, 설계 패턴까지도 의미.
- 작은 의미의 의존성 주입이 단일 클래스와 관련되어 있다면 의존성 주입 아키텍처 패턴은 이론과 객체들을 어떻게 구성할지에 대한 지침까지도 포함.
- 여러 프레임워크들이 전체 애플리케이션 단위에서 느슨하게 결합된 코드를 개발하는 것을 가능하도록 지원.
의존성 주입의 참여 객체
클라이언트-서버
Class A가 Class B의 코드를 참조할 때, A는 B에 의존한다고 말한다. 이 때 Class A는 Class B의 '클라이언트'이고, B는 A의 '서비스'라고 할 수 있다.
주입자
주입자는 서비스를 생성해서 클라이언트로 주입해주는 책임을 갖는다.
인터페이스
클라이언트의 서비스가 어떻게 상호작용할지 그 방법을 정의하는 인터페이스 클래스이다.
의존성 주입 장점
- 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문에 코드의 재사용성, 유연성이 높아짐.
- 클래스들간의 의존관계를 최소화하여 코드를 단순화 할 수 있음.
- 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아줌.
- 애플리케이션의 유지보수가 쉬우며 테스트가 용이.
- 확장성을 가짐.
- 기존 구현 방법은 개발자가 직접 코드 안에서 객체의 생성과 소멸을 제어했지만 의존성 주입은 객체의 생성, 소멸과 객체 간의 의존 관계를 컨테이너가 제어.
의존성 주입의 단점
- 책임이 분리되어 있기 때문에 클래스 수를 늘림으로써 복잡성이 증가
- 주입된 객체들에 관한 코드 추적이 어려움
- 초기 개발 노력이 필요
- 의존성 주입 프레임워크를 사용하면 빌드 시간이 늘어날 수 있으며, 프레임워크에 대한 의존도를 높임.
'프로그래밍 기초 > Spring' 카테고리의 다른 글
게시판 페이징 처리(2) (2) | 2023.12.15 |
---|---|
게시판 페이징 처리(1) (3) | 2023.12.15 |
한글 깨짐 현상 해결 (0) | 2023.11.30 |
프로젝트 절대 경로 설정 (0) | 2023.11.30 |