728x90
반응형
의존성 주입(DI) 이란?
객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입시켜주는 방식. 걍 결합도를 느슨하게 만드는 것이다.
How??
객체를 직접 만들어서 사용하는게 아니라 주입받아서 사용한다. Spring에서 new 연산자를 안쓰는 이유가 바로 이것이다.
인터페이스
왼쪽과 같이 Ch라는 인터페이스 하나를 만들었다.
이 Ch에서는 cooking() 이라는 메소드를 가진다.
클래스
두 클래스에는 각각 일반요리사(Chef)와 짱쌘요리사(SuperChef)가 있다.
그리고 두 요리사 모두 cooking( ) 이라는 메소드를 Ch에게 상속받아 해당 메소드를 사용할 수 있다
식당(Restaurant)에서 요리할 줄아는 Ch를 고용했다. 일반요리사(Chef)와 짱쌘요리사(Chef)는 둘다 요리를 할줄 안다.
그래서 식당(Restaurant) 입맛대로 잡아다가 사용할 수가 있다.
클래스 명만 인터페이스 명으로 다음과 같이 주게 되면
Chef chef = new Chef(); --> Ch chef = new Chef(); 또는
SuperChef superChef = new SuperChef(); -> Ch chef = new Chef();
두 요리사는 식당(Restaurnat)에 취업할 수 있다. 위 코드에서는 private Ch 뒤의 chef가 사용되었다.
단, 주석과 같이 new Chef(); 로 객체를 생성하면 결합도가 낮아진다.
원래 객체를 만들고 안만들고 제어하는건 개발자인데, 개발자가 객체를 new로 생성하는 순간 결합도가 발생한다.
스프링(Spring)은 객체를 스스로 만들어 사용한다. 이것을 제어의 역전 : IOC(Inversion Of Control)라고 한다.
Spring DI Container
- Spring DI Container가 관리하는 객체를 빈(Bean)이라 한다.
- 빈 들의 생명주기(Life-Cycle)을 관리한다는 뜻으로 빈 팩토리(BeanFactory)라 한다.
- BeanFactory에 여러 컨테이너 기능을 추가한 ApplicationContext가 있다.
DI -> 의존성 주입
- 객체 간의 결합을 느슨하게 하는 스프링의 핵심 기술
- 객체사이의 의존관계를 자기자신이 아닌 외부에 의해 설정된다는 개념
- 제어의 역행(Inversion of Control, IoC) 라는 의미로 사용
- DI 컨테이너는 어떤 클래스가 필요로 하는 인스턴스를 자동으로 생성, 취득하여 연결시켜 주는 역할을 함.
제어의 역전(IOC) 란?
메소드나 객체의 호출을 개발자가 결정하지 않고, 외부에서 결정되는 것이다.
객체의 의존성을 역전시켜 결합도를 줄이고 유연한 코드를 작성할 수 있어 가독성 및 코드 중복, 유지 보수가 용이하다.
DI(의존성 주입) vs IOC(제어의 역전) 차이점
그렇다면, DI와 IOC는 같은 것일까? 절대 아니다.
다시말해 IOC는 프로그램 제어권을 개발자가 아닌 외부로부터 발생시키는 상황. 즉, 역전되는 개념이다.
DI는 해당 기능을 구현하기 위해 객체의 의존관계를 자신이 아닌 외부에서 주입시키는 것이다.
DI는 IOC를 실행한 개념이라고 볼 수 있다.
의존성 주입(DI)을 사용하는 이유
- 재사용성을 높여준다.
- 테스트에 용이하다.
- 코드를 단순화 시켜준다.
- 사용하는 이유를 파악하기 수월하고 코드가 읽기 쉬워지는 점이 있다.
- 종속성이 감소하기 때문에 변경에 민감하지 않다.
- 결합도(coupling)를 낮추면서 유연성과 확장성은 향상 시킬 수 있다.
- 객체간의 의존관계를 설정할 수 있다.
다음 포스팅에서는 DI(의존성 주입)을 하는 방법에 대해 알아보자.
728x90
반응형
'✨ Back-end > Spring-Boot' 카테고리의 다른 글
[Spring] 페이지 나누기 (Thymeleaf Fragment ) 기능 적용 (0) | 2023.03.16 |
---|---|
[Spring] DI(의존성 주입) @Autowired, @Resource, @Controller, @Service (0) | 2023.03.15 |
[Spring] 타임리프 사용해서 폼(form)만들기 - th:object, th:field (0) | 2023.03.15 |
[Spring] 어노테이션 @RequestParam 과 @ModelAttribute (0) | 2023.03.15 |
[Spring] 스프링에서 Mybatis Oracle 데이터베이스 연동하기 (0) | 2023.03.14 |
댓글