Bean Configuration / Dependency Injection 에 관해 질문드립니다 :)
안녕하세요 영한님,
Dependency Injection에 관해서 궁금한점이 있어 질문드립니다. 제가 실무중이나 code review중에 아래같은 코드를 자주봤는데 지금까지는 그냥 그런가보다 하고 넘어갔지만, 그래도 강사님께 좀 자세한 mechanism을 들으면 좀더 개념확립에 도움이 될것같아서 질문드립니다.
//SecretVault.java
@Component
public class SecretVault {
private final String secret = "Secret123";
public SecretVault() {
}
public String getSecret() {
return this.secret;
}
}
//SecretService.java
public class SecretService {
private SecretVault vault;
public SecretService() {
}
public SecretService(SecretVault vault) {
super();
this.vault = vault;
}
public String revealSecret() {
return vault.getSecret();
}
}
//CoreApplication.java
@SpringBootApplication
public class CoreApplication {
public static void main(String[] args) {
SpringApplication.run(CoreApplication.class, args);
}
@Bean
SecretService secretService(SecretVault vault) {
return new SecretService(vault);
}
}
//테스트 클래스
//JUnit Test Pass
//MiscTest.java
@SpringBootTest
public class MiscTest {
@Autowired
ApplicationContext ac;
@Test
void testSecret() {
SecretService service = (SecretService) ac.getBean("secretService");
Assertions.assertEquals(service.revealSecret(), "Secret123");
}
}테스트 결과, secretService bean안에 vault 필드가 제대로 주입되어있습니다. 빈 생성하는 method parameter가 spring이 관리하는 bean이면 저절로 찾아서 넣어주나요? 저는 method parameter bean이 같은 configuration 클래스 안에서 생성되었을 경우에만 가능한걸로 알았는데, 위 예제의 dependency injection이 어떻게 일어나는지 궁금합니다.
답변 1
0
안녕하세요. SeokHoon Kim님, 공식 서포터즈 코즈위버입니다.
SecretService 는 @Bean 어노테이션으로, SecretVault는 @Component 어노테이션으로 모두 빈으로 등록하여 관리하게 됩니다. 이처럼 스프링 빈 끼리는 의존성 주입을 지원합니다. 그래서 valut 값이 제대로 조회가 됩니다.
감사합니다.
1
답변 감사합니다. @Autowired가 없는데 의존성주입을 자동으로 해주는건가요?
보통 아래처럼 직접 Configuration 클래스에서 @Autowired로 의존주입을 받아서 넣어주거나,
@Configuration
public class beanConfig{
@Autowired
SecretVault vault;
@Bean
SecretService secretService() {
return new SecretService(vault);
}
}직접 SecretService에서 @Autowired를 써서 의존성주입을 해결하는건 알겠는데,
위에 코드는 그런게 전혀없어서 bean declaration method (SecretService secretService(SecretVault vault))의 parameter에 어떻게 빈이 주입되는지가 궁금합니다. @Bean으로 빈등록을 하면 메서드 파라미터에 있는 모든 빈들을 찾아서 그냥 넣어주는건가요?
1
docs.spring.io 에서 답변을 찾았습니다.
" A @Bean-annotated method can have an arbitrary number of parameters that describe the dependencies required to build that bean. The resolution mechanism is pretty much identical to constructor-based dependency injection."
그냥 생성자 주입과 똑같은 원리로 작동하는것 같습니다.
코드 자료
0
42
2
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
54
2
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
0
75
1
롬복 @Setter를 써야 하는 상황이 있는건가요?
0
90
1
빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?
0
81
1
테스트 속도가 나중에 영향이 있을까요?
0
77
1
gradle 설정 안떠서 질문 남깁니다!
0
121
2
build.gradle로 프로젝트를 여는 이유
0
85
1
provider 사용하는 이유
0
89
1
다음 강의 뭘 들어야 할까요
0
126
2
프로토타입 빈, 직접 destroy 호출 안 할 경우
0
65
1
beanB
0
82
2
퀴즈다시풀기
0
68
1
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
0
92
2
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
0
67
3
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
0
106
2
도메인의 정의?
0
59
1
ApplicationContext 질문입니다.
0
63
1
@Scope의 proxyMode를 사용할때 단위 테스트 방법
0
89
2
ai api 선정하기 관련 질문
0
118
2
생성자 자동주입 관련해서
0
65
1
생성자 직접 호출 vs 팩토리 메서드 패턴
0
97
2
Spring에서 SessionScope와 RequestScope는 함께 사용되나요?
1
65
1
12:25
0
78
2





