Dev

[Spring] 의존성 주입(DI)에 대해 알아보자 - 3 / 의존성 주입

VIPeveloper 2022. 3. 3. 14:36
728x90
반응형

[Spring] 의존성 주입(DI)에 대해 알아보자 - 1 / 개요, Bean 정의

[Spring] 의존성 주입(DI)에 대해 알아보자 - 2 / Bean 설정

 

의존성 주입

의존성 주입에는 3가지 방법이 있다.

. 설정자 기반 의존성 주입 방법

. 생성자 기반 의존성 주입 방법

. 필드 기반 의존성 주입 방법

설정자 기반 의존성 주입 방법 == 세터 인젝션

. 세터 메서드(setXXXX())를 이용해 의존성을 주입하는 방법이다.

. 아래와 같은 클래스가 있다고 하고, userService를 구현해보자.

// userService를 구현해보자.

 public class UserServiceImpl implements UserService{
	private UserRepository userRepository;
	private PasswordEncoder passwordEncoder;
	
	public void setUserRepository(UserRepository userRepository){
		this.userRepository = userRepository;
	}
	
	public void setPasswordEncoder(PasswordEncoder passwordEncoder){
		this.passwordEncoder = passwordEncoder;
	}
 }

. 설정자 메서드를 만들었으니 의존성 주입을 해보자. 세터 인젝션 주입은 크게 4가지로 할 수 있다.

 

 

1. 자바 기반 설정 방식으로 표현한 예시

@Bean
UserService userService(){
	UserServiceImpl userService = new UserServiceImpl();
	userService.setUserRepository(userRepository());
	userService.setPasswordEncoder(passwordEncoder());
	return userService;
}

2. 파라메타를 활용한 자바 기반 설정 방식으로 표현한 예시

@Bean
UserService userService(UserRepository userRepository, PasswordEncoder passwordEncoder){
	UserServiceImpl userService = new UserServiceImpl();
	userService.setUserRepository(userRepository);
	userService.setPasswordEncoder(passwordEncoder);
	return userService;
}

3. XML 기반 설정 방식으로 표현한 예시

. property 요소의 name 속성에 주입 대상의 이름을 지정하면 된다.

<bean id="userService" class="com.example...">
    <property name="userRepository" ref="userRepository" />
    <property name="passwordEncoder" ref="passwordEncoder" />
</bean>

4. 어노테이션 기반 설정 방식을 표현한 예시

. 클래스에 @Component 어노테이션과 더불어, 세터메서드에 @Autowired를 달아주면 된다.

. 해당 방식 사용 시, 별도의 설정파일이 필요하지 않는 장점이 있다.

// userService를 구현해보자.
@Component
 public class UserServiceImpl implements UserService{
	private UserRepository userRepository;
	private PasswordEncoder passwordEncoder;
	
        @Autowired
	public void setUserRepository(UserRepository userRepository){
		this.userRepository = userRepository;
	}
	@Autowired
	public void setPasswordEncoder(PasswordEncoder passwordEncoder){
		this.passwordEncoder = passwordEncoder;
	}
 }

 

생성자 기반 의존성 주입 방법 == 컨스트럭터 인젝션

. 생성자의 인수를 사용해 의존성을 주입하는 방법이다.

1. 어노테이션 기반으로 표현한 컨스트럭터 인젝션

. @ConstructorProperties을 이용한다.

@ConstructorProperties({"userRepository","passwordEncoder"})
public UserServiceImpl(UserRepository userRepository, PasswordEncoder passwordEncoder){
	//...
}

2. XML 방식으로 표현한 컨스트럭터 인젝션

. setter 방식과 거의 유사하지만 constructor-arg로 설정한다는 것에 대해 조금 다르다.

<bean id="userService" class="com.example...">
    <constructor-arg index="0" ref="userRepository" />
    <constructor-arg index="1" ref="passwordEncoder" />
</bean>

 

필드 기반 의존성 주입 방법 == 필드 인젝션

. DI 컨테이너의 힘을 빌려 의존성을 주입하는 방식이다.

. 의존성을 주입하고 싶은 필드에 @Autowired어노테이션을 달아주면 된다.

. DI 컨테이너 없이 사용되는 독립형 라이브러리로 사용되는 소스코드에서는 필드 인젝션은 사용 불가능하다.

// userService를 구현해보자.
@Component
 public class UserServiceImpl implements UserService{
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private PasswordEncoder passwordEncoder;
	 
   ...
 }
728x90
반응형