• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

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

23.04.25 22:19 작성 조회수 569

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) 같은 방식으로 동작한다고 생각하면 될까요??

 

 

 

 

 

답변 1

답변을 작성해보세요.

4

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

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

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

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

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

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

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

 

cjh님의 프로필

cjh

질문자

2023.04.26

감사합니다 토비님 !!!

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

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