[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;
...
}
'Dev' 카테고리의 다른 글
[Next Step] 자바 웹프로그래밍 2.1,2.2 정리 (0) | 2022.08.22 |
---|---|
Restful 하다는 것은 뭘까? (0) | 2022.07.18 |
[Spring] 의존성 주입(DI) 에 대해 알아보자 - 2 / Bean 설정 (0) | 2022.03.02 |
[Spring] 의존성 주입(DI) 에 대해 알아보자 - 1 / 개요, Bean 정의 (0) | 2022.02.28 |
13. 기술면접 전 보고가면 좋은 내용 공유 2 (0) | 2021.04.19 |