Spring DI/IoC

우지혜·2021년 7월 27일
0

스프링 코어

목록 보기
1/1

의존성 주입(DI)

하나의 처리를 위해서 여러 개의 컴포넌트를 통합하려고 할 때 DI 방식이 유리하다.

예를 들어 UserSerivce 클래스에서 회원가입 로직을 구현한다고 했을 때 UserRepository(User 엔티티에 대한 Repository), PasswordEncoder(패스워드 인코딩 관련 클래스) 두 가지 의존성이 필요하다고 가정해보자.


public class UserService {
	private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;
}

일반적인 방식은 UserService 클래스 내부에서 new 키워드를 통해 필요한 의존성을 직접 생성한다.


public UserService() {
	this.userRepository = new UserRepository();
    this.passwordEncoder = new PasswordEncoderA();
}

여기서 단점은, 한 번 클래스가 생성되고 나면 의존성을 변경할 수 없다는 것이다. 아래 사진과 같이 PasswordEncoder에 대해서 두 개 이상의 클래스가 구현이 되었을 때, 처음에는 PasswordEncoderA에 있는 인코딩 방식을 사용하다가 유저에 따라 PasswordEncoderB를 사용하고 싶더라도 교체가 불가능하다.

동적으로 의존성을 변경하고싶다고 하더라도 UserSerivce가 구체적인 컴포넌트에 의존하고 있기 때문에 때문에 변경이 불가능하다. 즉, DIP 의존성 역전 원칙에 위배되어 결합도가 높은 코드가 된다.

구체 클래스가 아닌 추상 클래스에 의존한 코드를 만들기 위해서는 의존성 주입 방식이 필요하다.

대표적인 예로 생성자 주입 방식이 있다.


public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) {
	this.userRepository = userRepository;
    this.passwordEncoder = passwordEncoder;
}

위와 같이 생성자를 통해 외부에서 의존성을 주입받을 경우, 상황에 따라 PasswordEncoder 구체 클래스를 변경해서 주입받을 수 있다!!

IoC 컨테이너

  • 아직 정리하지 않았어용..ㅎㅎ

질문할만한 요소

  • IoC는 개발자가 프로그램의 제어 흐름을 직접 제어
  • IoC 컨테이너의 역할은 무엇이 있을까요
  • DI 종류는 어떤 것이 있고, 이들의 차이는 무엇인가요

0개의 댓글