Ioc 컨테이너 ( 제어의 역전 ) - 원칙
- 객체가 스스로의 값을 결정하지 못한다는 추상적인 개념을 의미
- 프레임워크 라이프사이클을 관리한다.
- 객체의 생성과 그 객체의 관리까지 모두 관리하는 개념이다.
객체의 생성, 초기화,서비스 소멸에 대한 모든 권한을 갖고 객체의 생명주기를 관리한다. - "제어"는 개발자가 객체를 생성할 때 어떤 내용을 담을 것인지 고정해 놓은 것을 의미한다
- "제어의 역전"은 외부의 값을 받아 객체를 생성하는 것을 의미한다.
- 메소드나 객체의 호출작업을 개발자가 아닌 외부(파라미터)가 결정하는 것을 의미한다.
- ( 하나의 객체가 생성될 때 개발자가 고정하여 정의한 내용이 아닌 외부의 인자에 따라 다른 객체를 생성한다. 어떤 값을가진 객체가 될 것인지에 대한 결정이 외부의 인자에 따라 결정된다.)
- 해당 객체의 역할과 외부 인자의 요구사항을 분리하여 객체지향 원칙을 잘 지키는 유연한 코드로 만들기 위해 사용한다.
inversion of Control의 약자로 제어의 역전을 의미한다.
- 일반적인 프로그램의 흐름은 아래처럼 각 객체들이 프로그램의 흐름을 결정하고 객체를 구성한다.
그래서 모든 작업을 사용자가 제어야해야한다.
객체의 결정 및 생성 -> 의존성 객체 생성 -> 객체 내의 메소드 호출 -> ( 반복 ) 객체의 결정 및 생성
IOC는 사용자가 제어하지 않고 어떤 특정한 객체에게 권한을 주어 객체의 생성부터 종료까지 모든 객체의 제어권을 넘기는 것을 의미한다 .
DIP
- DIP 와 Ioc는 유사하며 함께 사용되는것이 좋음.
DIP = 의존 역전 원칙
DIP - 상위 레벨 모듈은 절대 하위 레벨 모듈에 의존하지 않고 추상화에 의존한다.
고수준의 모듈은 변화가 쉬운 하위 레벨의 모듈에 의존하지 않고,
중간단계인 '인터페이스'를 추가하여 의존관계를 역전시킨다.
상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기에 하위 클래스나 구체 클래스가 아닌 상위클래스, 인터페이스, 추상 클래스를 통해 의존하라는 것이 바로 의존 역전 원칙
즉 고수준 모듈(차)의 일부 값을 융통성있게 변경하기 위해 모듈 내의 어떤 값(타이어)을 추상화 하고, 이 추상화를 통해 저수준모듈(일반 타이어 등의 여러 타이어)의 값을 변경할 수 있다.
DI
- ioc를 지키기 위해 수행되는 디자인 패턴
- 외부에서 의존성을 주입하는 행위를 의미한다.
1) 생성자 주입
- 생성자 호출 시 외부로부터 인자를 받아 생성자를 통해 의존성을 주입받는다
2) setter 주입
- setter메서드를 만들어서 의존성을 주입한다.
3) interface주입
- 인터페이스를 구현하여 의존성을 주입한다
4) Spring bean으로 의존성 주입
-@Autowired 를 선언하면 spring가 자동으로 의존성을 주입해준다.
1-필드주입 : 불가능한 주입을 프레임워크의 힘으로 주입한다.
- 테스트등의 이유로 직접 의존성을 넣을 수 없으므로 자주 사용되지 않음
2- setter 주입
> 불변보장이되지않는다
>런타임의 의존성을 변경해야하거나 의존성을 선택적으로 주입해야할 떄 사용된다
3. 생성자 주입
>스프링에서 추천한다.
> 생성자가 1개뿐인 경우 스프링이 자동으로 생성자를 추가해준다.
>생성자 주입된 컴포넌트들은 완전히 초기화된 상태로 클라이언트를 반환한다
> setter 주입은 클래스 내에 합리적인 기본값을 할당할 수 있는 선택적 의존성에만 사용해야 한다
> 주입이 최초 1회만 발생하기떄문에 의존관계가 변하지않는다
> nullPointException이 발생하지 않는다 - 객체가 생성되는 시점에 모든 의존성을 넣어준다
> 순환참조가 발생하지 않는다. 순환참조가 발생할 경우 에러를 띄우고 프로세스가 종료된다
> 생성자가 여러개인 경우 가장 많은 의존성을 주입할 수 있는 생성자를 사용한다.
- 의존성 주입 순서
* 생성자 > 필드 > setter
주입해야하는 대상이 여러개일 때
>> 타입 -> @Qualifier이 붙어있는 값이 가장 번저 , 그 다음 @Primary -> 변수 순으로 주입한다.
IOC의 구성요소 DI와 DL
DL(Dependency Lookup) - 의존성 검색
컨테이너에서는 객체들을 관리하기 위해 별도의 저장소에 빈을 저장하는데 저장소에 저장되어 있는 개발자들이 컨테이너에서 제공하는 API 를 이용하여 사용하고자 하는 빈 을 검색하는 방법입니다.
DI(Dependency Injection) - 의존성 주입
의존성 주입이란 객체가 서로 의존하는 관계가 되게 의존성을 주입하는 것입니다. 객체지향 프로그램에서 의존성 이란 하나의 객체가 어떠한 다른 객체를 사용하고 있음을 의미합니다. 그렇다면 IOC에서의 DI는 무엇일까요?
바로 각 클래스 사이에 필요로 하는 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것입니다.
'[!] 미완료 작성필요' 카테고리의 다른 글
| [ format ] 성능 테스트 진행계획서 (0) | 2023.09.20 |
|---|---|
| [web] 웹 개발환경과 jQuery (0) | 2023.09.20 |