Spring IOC(제어의 역전) , DI (의존성 주입)
- Inversion Of Control-
프로그램의 흐름 (객체의 생성 , 생명주기)을
개발자가 직접 제어하는 것이 아닌
외부에서 제어 및 관리해주는 것을 말한다.
- IOC Container -
스프링에서는 Application을 구성하는 Bean을 관리하기 위하여
IOC개념을 이용 Spring IOC Container가 객체를 관리함으로써
DI(의존성 주입) , AOP(관점 지향 프로그래밍)이 가능해지게 된다.
Spring IOC Container가 주도권을 가져감으로써
Spring IOC Container가 객체의 관리, 의존관계의 결정 및 설정 등의 역할을 맡게된다.
- DI (1)-
객체의 의존성을 개발자가 아닌 외부(IOC Container)에서 주입함으로써
객체간의 결합을 약하게 해주며 유지보수가 좋은 코드를 만들어준다.
스프링에서는 스프링 컨테이너가 각 클래스의 의존관계를
Bean설정 정보를 바탕으로 자동으로 결정 및 연결해준다.
- 강한 결합-
A객체가 B,C객체에 의존하고 있다.
객체내부에서 다른 객체를 new를 통해 생성하는 것을 강한결합도를 갖는다한다.
상단 코드에서 boardWrite객체를 다른 객체로 바꾸고 싶다면
diStudy 클래스 내부의 코드까지 교체해야하기 때문에 강한 결합이다.
- 느슨한 결합 (DI)-
외부에서 생성된 객체를 인터페이스를 통해 주입받는다.
외부에서 객체를 주입받게되면 런타임시에 의존관계가 결정 , 유연한 구조를 가진다.
-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;
}
생성할 때 의존성을 주입하는 것이 아닌
원하는 때에 함수를 호출 , 의존성을 주입할 수 있다.