강의

멘토링

커뮤니티

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

펌킨푸딩님의 프로필 이미지
펌킨푸딩

작성한 질문수

스프링 부트 - 핵심 원리와 활용

자동 구성 이해2 - ImportSelector

@Configuration 질문드립니다.

작성

·

20

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
publicclass ImportSelectorTest {

 

@Test

void staticConfig() {

AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(StaticConfig.class);

HelloBean bean = appContext.getBean(HelloBean.class);

assertThat(bean).isNotNull();

}

 

@Test

void selectConfig() {

AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(SelectorConfig.class);

HelloBean bean = appContext.getBean(HelloBean.class);

assertThat(bean).isNotNull();

}

 

@Configuration

@Import(HelloConfig.class)

publicstaticclass StaticConfig {}

 

@Configuration

@Import(HelloImportSelector.class)

publicstaticclass SelectorConfig {}

}

안녕하세요. StaticConfig, SelectorConfig 클래스에 @Configuration 애노테이션은 어떤 모질문 템플릿]

1. 강의 내용과 관련된 질문인가요? 예

2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예

3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

 

[질문 내용]

public class ImportSelectorTest {

 

@Test

void staticConfig() {

AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(StaticConfig.class);

HelloBean bean = appContext.getBean(HelloBean.class);

assertThat(bean).isNotNull();

}

 

@Test

void selectConfig() {

AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(SelectorConfig.class);

HelloBean bean = appContext.getBean(HelloBean.class);

assertThat(bean).isNotNull();

}

 

@Configuration

@Import(HelloConfig.class)

public static class StaticConfig {}

 

@Configuration

@Import(HelloImportSelector.class)

public static class SelectorConfig {}

}

 

안녕하세요. StaticConfig, SelectorConfig 클래스에 @Configuration 애노테이션은 어떤 역할을 하나요? @Configuration 애노테이션을 주석 후 테스트를 해봤을 때 정상 동작하는 것까진 확인하였습니다.

 

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 펌킨푸딩님

다음과 같은 코드를 실행하면 해당 파일이 자동으로 스프링 빈으로 등록됩니다.

AnnotationConfigApplicationContext(StaticConfig.class);

 

따라서 별도의 설정이 없어도 @Import 기능을 사용할 수 있습니다.

그럼에도 불구하고 @Configuration을 사용하는 이유는 @Configuration이 붙으면 관례상 누구나 아~ 이 파일은 스프링 설정 파일이구나라고 쉽게 인식할 수 있기 때문입니다.

 

명시성: 이 클래스는 스프링 설정을 위한 클래스임을 명확하게 드러냅니다. (가독성 및 유지보수)

관례: 스프링 설정을 담당하는 클래스에는 @Configuration을 붙이는 것이 일반적인 관례입니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 펌킨푸딩님.

스프링에서 @Configuration은 클래스가 스프링 빈 정의를 포함하고 있다는 것을 나타냅니다. 이 어노테이션은 스프링 컨테이너에게 해당 클래스를 Java 기반의 설정 소스로 사용하라고 알려줍니다. 그러면 스프링 컨테이너는 해당 클래스의 @Bean 메서드를 찾아 빈을 등록합니다.

질문하신 StaticConfig와 SelectorConfig 클래스에서 @Configuration 어노테이션을 제거해도 테스트가 정상 동작하는 이유는, @Import 어노테이션 때문입니다. @Import는 다른 설정 클래스나 구성 요소를 현재 설정에 포함시키는 역할을 합니다. 이와 함께 AnnotationConfigApplicationContext는 클래스를 인자로 받아 스프링 컨텍스트를 설정하는 역할을 합니다.

@ImportSelector와 같은 기능을 사용하면, @Configuration 없이도 클래스를 컨텍스트에 포함시켜 설정할 수 있기 때문에, @Configuration 어노테이션이 없어도 설정 클래스가 스프링 컨테이너에 포함되어 동작하게 됩니다.

관련하여 추가 정보가 필요하시다면 아래의 링크들을 참고해보시기 바랍니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

펌킨푸딩님의 프로필 이미지
펌킨푸딩

작성한 질문수

질문하기