| IoC/DI | description |
|---|---|
| IoC : 제어 역전 | 객체를 직접 생성하지 않고, 스프링에서 관리하는 IoC Container한테 객체 관리의 제어권을 넘겨주는 것이다. |
| DI : 의존성 주입 | 제어의 역전을 통해 외부 컨테이너에서 생성한 객체를 주입받아 사용한다. |
@Service
@RequiredArgsConstructor
public class userService {
private final UserRepository repository;
}
public interface UserRepository extends JpaRepository<User, Long> {
}
여태까지 흔히 사용한 3Layer Architecture가 바로 제어 역전을 보여주는 예시다.
Bean은 제어 역전으로 스프링이 생성한 객체를 일컫는다.
객체를 Bean으로 자동등록해주는 어노테이션 : @Component
자동등록이 있다면 수동등록도 있다
Bean 수동등록 어노테이션 : @Configuration, @Bean
생성자를 통해 의존성을 주입받는 방식을 주로 사용한다.
생성자를 final로 선언하여 불변성 또한 보장해주는 편이다.
여기서 잠깐!!
@Component
public class PasswordEncoder {
...
}
@Component
public class UserDataLoader {
private final PasswordEncoder passwordEncoder;
...
}
같은 패키지 안에 두 클래스가 존재했다..
그 둘은 만나선 안되는 것이었다...
왜냐하면
UserDataLoader가 무시되는 상황이 발생하는 것이다.
서로를 의존하다보니 순환참조라는 문제를 마주쳤다.
해결은 정말 간단하게 패키지를 옮기기만 해도 해결이 가능한 부분이다.
하지만 지금 생각해보니 Bean의 우선 순위를 정해주기만 해줘도 해결이 될지도..?