inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

토비의 스프링 부트 - 이해와 원리

인프라 빈 구성 정보의 분리

@Import에서 @Component가 없어도 동작합니다.

해결된 질문

886

cjh

작성한 질문수 24

0

 강사님께서

@Import 어노테이션은

@Component 어노테이션이 붙은 혹은

메타 어노테이션으로 @Component가 붙은 클래스를 컴포넌트 스캔 대상이 아닌 클래스를 구성정보로 등록할수 있다고 말씀해주셨습니다.

 

호기심에 Import할 클래스 레벨에 어노테이션을 붙이지 않고

public class ServerConfigTest {

    @Bean
    Name1 name1(){
        return new Name1(name3());
    }
    @Bean
    Name2 name2(){
        return new Name2(name3());
    }
    @Bean
    Name3 name3(){
        return new Name3();
    }

    static class Name1{
        Name3 name3;
        public Name1(Name3 name3) {
            System.out.println("네임 1 등장이요");
        }
    }
    static class Name2{
        public Name2(Name3 name3) {
            System.out.println("네임 2 등장이요");
        }
    }
    static class Name3{
        public Name3() {
            System.out.println("네임 3 등장이요");
        }
    }
}
@MyAutoConfiguration
@Import(ServerConfigTest.class)
public class ServerTestBean2 {
 //코드..
}

결과는

@Component,

@Configuration(proxyBeanMethods=false)와 같은 결과가 로그로 보이더라구요

 

래퍼런스에는 일반 구성 클래스

as well as regular component classes(AnnotationConfigApplicationContext.register와 유사) 라고 적혀있는데

 

그 의미가

import가

applicationContext.register(ServerConfigTest) 같은 방식으로 동작한다고 생각하면 될까요??

 

 

 

 

 

spring spring-boot spring-jdbc

답변 1

5

토비

주어진 설명에 대해서 정말 그런가 테스트 해보시는 모습이 멋지십니다. 저도 종종 그러는 편이라..

강의에서는 @Configuration이나 @Component가 붙은 빈으로 사용할만한 클래스가 스캔 대상이 아니고 직접 선택해서 가져와야할때 쓰는 방법이라고 @Import를 설명드렸습니다. 99% 정도는 부트의 자동 구성이나 스프링에서 @Enable로 시작하는 애노테이션을 이용해서 특정 기술의 구성 정보를 추가하는 용도로 사용합니다.

가장 많이 쓰이는 것은 @Configuration이 붙은 클래스를 가져오는 경우이고, 그 다음은 ImportSelector나 BeanDefinitionRegistrar 같은 빈 등록을 위해서 사용되는 특별한 인터페이스의 구현 클래스를 빈으로 등록하면서 가져오는 것 같습니다. 사실 register 메소드와 유사한 방식이라서 빈 스캐너로 인식되도록 만들어진 @Component를 붙이지 않아도 됩니다. 스프링 내부에서도 ImportSelector 구현 클래스에는 @Component가 붙어있지 않습니다.

강의에서 설명한 것은 @Configuration이라는 특별하게 동작하는 설정 전용 빈 클래스 외에 일반 빈 클래스도 가져올 수 있다는 내용이었습니다. 애플리케이션 개발 중에 빈 스캐너 대상 패키지 외에 특별한 이유로 만들어진 @Configuration은 아닌 일반 빈 클래스를 가져오는 경우, 클래스에 빈으로 등록된다는 의미로 @Component를 붙여놓는 것이 좋다고 생각합니다. 혹시 나중에 스캔 대상으로 사용될 수도 있고요. 그 자체로 스프링 빈으로 만들어졌다는 주석이기도 해서 그렇습니다.

ImportSelector 같은 건 부트의 자동 구성 매커니즘 같은 고도의 기술 구조를 가져갈 때가 아니라면 딱히 쓸일도 없고, 그런 용도 외의 단순 클래스를 @Import 해서 쓰는 건 별로 바람직해 보이지 않기 때문에 @Configuration이 아니라면 빈으로 쓰려고 만든 @Component가 불은 클래스는 식으로 설명을 했던 기억입니다.

초급 대상 강의를 만들면서 의도적으로 설명을 단순화하거나 더 풀어서 설명을 하거나 때론 언급하지 않고 넘어가는 내용도 있습니다. 그렇지 않으면 스프링과 같은 방대한 기술은 유사한 작업을 하는 굉장히 많은 선택지와 장단점이 있기 때문에 일일히 설명하다보면 너무 깊이 들어가거나 양이 많아지는 문제가 있습니다. 그런 점을 이해해주시면 좋겠습니다.

좋은 질문 해주셔서 감사합니다. 강의를 만들면서 사실 누군가 이것까지 물어보실까하는 생각을 종종하는데, 실제로 그런 분들을 만나면 반갑네요.

 

0

cjh

감사합니다 토비님 !!!

사실 질문하기 전에 구글링이랑 래퍼런스를 봐도 이해가 잘 안되었는데

너무 이해가 잘됩니다. 감사합니다 !! 좋은 하루 보내세요 !!

11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지

0

77

2

TestRestTemplate 을 통해 테스트 실행시 웹 요청 정보가 콘솔에 표시되지 않습니다.

0

86

1

섹션7. 자동구성 정보파일분리 강의 질문(@MyAutoConfiguration 붙힌 이유)

0

202

2

WebApplicationContext를 DispatcherServlet에 this로 넘기는 것

0

279

2

인프라 빈 구성 정보의 분리에서 EnableMyAutoConfiguration 질문드립니다.

0

211

2

질문드립니다.

0

234

2

spring boot 3.3.7로 학습중입니다.

0

372

2

Serverproperties 객체 생성 후 @Impor 어노테이션 사용 이유 용도

0

162

2

spring start io 에서 이제더이상 2.x버전은 지원하지 않는 것 같습니다.

1

299

2

Springboot 3.2 이상에서 파라미터 추론관련

0

919

4

binding error

0

223

3

Arrays.copyOf 메서드의 타입 세이프

1

156

2

MyOnClassCondition에 있는 matches method의 Invoke 횟수

1

234

3

인용구의 출처가 궁금합니다.

0

260

1

프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용

0

236

2

SimpleCacheConfiguration과 빈 등록

0

169

2

MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점

0

244

1

IntelliJ project jenerator spring initailizr

0

150

1

강의 자료 레퍼지토리에 업로드

0

216

1

강의자료

0

388

1

Hikari 라이브러리가 없으면 오류가 나는거 아닌가요

0

315

2

Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의

0

477

5

@Import 로 Bean을 등록해야하는 기준이 뭔지 궁금합니다.

0

344

2

application.properties파일내 프로퍼티 이름

0

214

1