Plo Spring

Spring IOC(제어의 역전) , DI (의존성 주입)

PLO_98 2022. 3. 27. 22:42

ㅇ\출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26740787


- Inversion Of Control-

프로그램의 흐름 (객체의 생성 , 생명주기)을

개발자가 직접 제어하는 것이 아닌

외부에서 제어 및 관리해주는 것을 말한다.

- IOC Container -

스프링에서는 Application을 구성하는 Bean을 관리하기 위하여

IOC개념을 이용 Spring IOC Container가 객체를 관리함으로써

DI(의존성 주입) , AOP(관점 지향 프로그래밍)이 가능해지게 된다.

Spring IOC Container가 주도권을 가져감으로써

Spring IOC Container가 객체의 관리, 의존관계의 결정 및 설정 등의 역할을 맡게된다.


- DI (1)-

객체의 의존성을 개발자가 아닌 외부(IOC Container)에서 주입함으로써

객체간의 결합을 약하게 해주며 유지보수가 좋은 코드를 만들어준다.

스프링에서는 스프링 컨테이너가 각 클래스의 의존관계를

Bean설정 정보를 바탕으로 자동으로 결정 및 연결해준다.

- 강한 결합-

출처 : https://skmouse.tistory.com/entry/

A객체가 B,C객체에 의존하고 있다.

 

new를 통해 직접 객체를 생성

객체내부에서 다른 객체를 new를 통해 생성하는 것을 강한결합도를 갖는다한다.

상단 코드에서 boardWrite객체를 다른 객체로 바꾸고 싶다면

diStudy 클래스 내부의 코드까지 교체해야하기 때문에 강한 결합이다.

 

- 느슨한 결합 (DI)-

출처 : https://skmouse.tistory.com/entry/

외부에서 생성된 객체를 인터페이스를 통해 주입받는다.

외부에서 객체를 주입받게되면 런타임시에 의존관계가 결정 , 유연한 구조를 가진다.


-DI (생성자 주입)-

private final UserRepository userRepository;
	
    public UserDetailsServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

생성자를 이용하여 의존성을 주입하는 방법

스프링에서 가장 권장하는 방법이며 4.3이상 버전에서는

@Autowired의 생략이 가능하며 , 테스트 코드의 작성이 유리하다.

-DI (필드주입)-

@Autowired
private UserRepository userRepository;

일반적이고 쉬운방법이지만

Runtime시에 순환참조 문제가 발생할 수 있다.

-DI (Setter 주입)-

private UserRepository userRepository;
	
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

생성할 때 의존성을 주입하는 것이 아닌

원하는 때에 함수를 호출 , 의존성을 주입할 수 있다.