티스토리 뷰
DI (Dependency Injection)
다른 프레임워크와 달리 스프링은 의존 관계 주입이라는 차별점을 갖는다.
개발자가 직접 객체를 생성하는 것이 아닌, 프레임워크에서 객체를 생성한 후 주입해 주는 방법이다.
방법 1. 개발자가 직접 객체를 생성한다.
A 객체를 사용하기 위해 개발자가 생성자를 사용하여 B와 C 객체를 생성하는 방식이다.
즉, 의존성 주입을 사용하지 않고 직접 객체를 생성하여 주입하는 방식이다.
public class UserService {
private UserRepository userRepository = new UserRepository();
public User findUser(String userId) {
return userRepository.findUserById(userId);
}
}
방법 2. 의존 관계 주입
A 객체를 사용하기 위해 스프링 프레임워크에서 B와 C 객체를 생성하고, 생성된 객체를 주입해 주는 방식이다.
의존 관계를 위해 3가지 방식이 존재한다.
- 필드 주입
- 사용하고자 하는 필드에 @Autowired를 사용한다.
- 수정자 주입
- 필드를 선언하고, 필드를 초기화하기 위한 setter를 사용한다.
- 생성자 주입
- 필드를 선언하고, 필드를 초기화하기 위한 생성자를 사용한다.
- 필드 주입
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
- 수정자 주입
@Service
public class UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
- 필드 주입
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
어떤 방식으로 DI 주입을 할까?
생성자 주입 방식은 객체의 불변성(immutable)을 보장한다. 객체가 생성되는 시점에 생성자를 호출하여 최초 1회만 초기화되기 때문이다. 또한, 객체가 생성되는 시점에 생성자를 호출하기 때문에 의존하고 있는 객체가 비어있을 가능성을 배제할 수 있게 된다.
의존성 주입 덕분에 객체가 다른 객체를 생성하거나 관리할 필요 없이, 필요로 하는 객체를 외부에서 생성하여 주입해 준다.
이는 코드의 결합도를 낮추어줌으로써 코드 변경 시에 영향을 받는 범위를 줄일 수 있게 된다.
Ioc (Inversion of Control)
제어의 역전(IoC)은 객체를 직접 생성하는 것이 아닌, 외부(프레임워크)에서 객체의 생성과 관리를 담당하는 것을 의미한다. 생성과 관리를 담당하는 것을 다른 말로 생명주기를 관리한다고 표현할 수 있다.
프로그램이 실행되는 동안 직접 객체를 생성하고 주입한다.
- 기존의 프로그래밍
@Controller
public class UserController {
private UserService userService = new UserService();
}
- IoC 프로그래밍
직접 객체를 생성하고 주입하는 것이 아닌, 프레임워크에서 객체를 생성하고 주입해 준다.
여기서는 생성자 주입 방식을 사용했다.
@Controller
public class UserController {
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
}
스프링의 경우 ApplicationContext가 IoC 컨테이너이다.
DI와 IoC 관련성
의존성 주입(Dependency Injection)은 IoC(Inversion of Control)의 구현 방법 중 하나이다.
- IoC : 프로그램 제어 프름을 개발자가 아닌 것이 아닌, 프레임워크에 하는 것
- DI : IoC 구현 방법 중 하나로, 필요한 객체의 주입을 외부에서 주입받는 것