인프런 커뮤니티 질문&답변

SeokHoon Kim님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

Bean Configuration / Dependency Injection 에 관해 질문드립니다 :)

해결된 질문

작성

·

122

1

안녕하세요 영한님,

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 값이 제대로 조회가 됩니다.

감사합니다.

SeokHoon Kim님의 프로필 이미지
SeokHoon Kim
질문자

답변 감사합니다. @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으로 빈등록을 하면 메서드 파라미터에 있는 모든 빈들을 찾아서 그냥 넣어주는건가요?

 

SeokHoon Kim님의 프로필 이미지
SeokHoon Kim
질문자

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."

그냥 생성자 주입과 똑같은 원리로 작동하는것 같습니다.