Dependency Injection ( 의존성 주입 )
Spring의 핵심개념이다.
어떠한 객체가 사용하는 의존 객체를 직접 만들어 사용하는것이 아니라,
주입 받아서 사용하는 개념이다.
강하게 결합된 클래스들을 분리하고, 애플리케이션 실행 시점에서 객체간의 관계를 결정해 줌으로써, 결합도를 낮추고 유연성을 확보해준다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
생성자를 통해 의존 관계를 주입하는 방법이다.
생성자의 호출 시점에 1회 호출 되는것이 보장된다.
Spring Framework에서 적극 지원하는 방법으로, 생성자가 한개만 있을경우에 @Autowired Annotation을 생략하여도 주입되도록 되어있다.
생성자 주입의 장점
1. 순환 참조를 방지한다.
2. 테스트에 용이하다.
3. 의존성이 명시적으로 들어난다.
4. Field를 final로 선언 할 수 있어 불변성을 갖는다.
5. 불변객체나 NULL이 아님을 보장하여 오류를 방지할 수 있다.
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@RequiredArgsConstructor 을 통해서 생성자를 주입한다.
@RequiredArgsConstructor Annotation : 클래스에 선언된 final 변수들, 필드들을 매개변수로 하는 생성자를 자동으로 생성해주는 어노테이션
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
}