• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

컴포넌트 스캔 관련 질문

23.07.23 18:02 작성 조회수 336

0


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

[질문 내용]
컴포넌트 스캔 강의를 듣다 질문이 있는데요 @ComponentScan 을 쓰면 @Configuration도 꼭 써줘야 되나요 아니면 그냥 @ComponentScan만 써도 되는건가요??? 두 개의 어노테이션의 차이는 뭔가요?

그리고 앞선 강의인 싱글톤 컨테이너에서 @Configuration 과 @Bean 을 이용했을땐 따로 @Autowired 안써서 의존관계를 주입을 안해줬는데 그때는 따로 의존관계를 주입하지 않아도 되나요??

답변 1

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2023.07.24

안녕하세요. 황지호님, 공식 서포터즈 y2gcoder입니다.

@ComponentScan 을 쓰면 @Configuration도 꼭 써줘야 되나요 아니면 그냥 @ComponentScan만 써도 되는건가요??? 두 개의 어노테이션의 차이는 뭔가요?

=> 쉽게 말씀드리면 빈을 등록하는 두 방법이라고 보시면 됩니다.

@Configuration 과 @Bean 을 이용했을땐 따로 @Autowired 안써서 의존관계를 주입을 안해줬는데 그때는 따로 의존관계를 주입하지 않아도 되나요??

=> A라는 빈에서 마찬가지로 빈으로 관리 중인 B를 주입받고 싶을 때 스프링에서 자동으로 빈을 찾아 주입해주는 방법이 @Autowired라고 생각하시면 됩니다. 애너테이션 이름 자체도 해당 뜻을 내포하고 있습니다 :)

또한 위의 내용들은 앞 선 내용들을 잘 읽어보시고 이해하실 수 있습니다. 핵심 원리 기본편에서는 스프링 컨테이너와 스프링 빈, 의존성 주입을 이해하는 것이 핵심 내용이라고 생각합니다. 개인적으로 이러한 부분들이 이해가 가지 않으신다면 계속해서 강의를 진행하는 것이 아니라 처음으로 돌아가 다시 이해가 되실 때까지 복습하시는 것이 황지호님께 더 도움이 되실 것이라 생각합니다 :)

 

감사합니다.

황지호님의 프로필

황지호

질문자

2023.07.24

이해가 잘 안되어서 그러는데요 ㅠㅠ

@ComponentScan을 쓸때는 @Configuration 을 안 써도 되는건가요??

그리고 @Configuration 을 써도 의존관계 주입이 필요하면 @Autowired 를 써야되는건가요?

y2gcoder님의 프로필

y2gcoder

2023.07.25

@ComponentScan을 쓸때는 @Configuration 을 안 써도 되는건가요??

=> @ComponentScan은 @Component 와 해당 애노테이션을 상속하는 애노테이션들이 붙은 클래스들을 스캔하여(스캔 범위를 지정해줄 수 있고 보통은 @SpringBootApplication 에 내장되어있습니다) 빈으로 알아서 등록해주는 애노테이션입니다. @Configuration은 안에 @Component 가 들어가 있어 마찬가지로 @ComponentScan의 대상이 되어 빈으로 등록됩니다. 빈으로 등록할 때 안의 @Bean 이 붙은 메서드를 찾아 해당 메서드의 반환 타입을 빈으로 등록합니다 :)

그리고 @Configuration 을 써도 의존관계 주입이 필요하면 @Autowired 를 써야되는건가요?

=> 네 맞습니다!

 

황지호님의 프로필

황지호

질문자

2023.07.26

그럼 @Configuration 안 쓰고 @ComponentScan 만 쓰면 그 클래스는 스프링 빈으로 등록되지 않는건가요?

@ComponentScan 은 그냥 단순히 @Component 붙은것들을 스프링 빈으로 등록하겠다고 선언하는 어노테이션인건가요?? 이것도 @Configuration 처럼 설정정보를 나타나겠다고 선언(?)하는 건가요??

y2gcoder님의 프로필

y2gcoder

2023.07.26

그럼 @Configuration 안 쓰고 @ComponentScan 만 쓰면 그 클래스는 스프링 빈으로 등록되지 않는건가요?

=> 반대입니다. @ComponentScan이 빈 등록에 꼭 필요합니다. @Configuration + @Bean을 통한 수동 등록도 결국 @Configuration 내에 있는 @Component를 먼저 스캔해야 하기 때문에 @ComponentScan이 필요합니다.

@ComponentScan 은 그냥 단순히 @Component 붙은것들을 스프링 빈으로 등록하겠다고 선언하는 어노테이션인건가요??

=> 네 맞습니다.

황지호님의 프로필

황지호

질문자

2023.07.27

그럼 @ComponentScan 없이 @Configuration + @Bean 만을 이용해서는 스프링 빈으로 등록하지 못한다는 건가요??

y2gcoder님의 프로필

y2gcoder

2023.07.27

네 @SpringBootApplication 내에 @ComponentScan 이 있기 때문에 해당 메인 클래스가 있는 패키지와 하위 패키지가 스캔 범위가 되고 그 안에 있는 @Configuration 클래스를 스캔해서 @Bean 들을 빈으로 등록할 수 있습니다 :)

위를 기본으로 이해하시면 될 것 같습니다 :)

황지호님의 프로필

황지호

질문자

2023.07.28

@SpringBootApplication 내에 @ComponentScan 이 있으면 다른 클래스에서는 @ComponentScan 을 안써도 해당패키지의 하위패키지까지 스캔해서 빈으로 등록해주지 않나요??

 

그리고 @ComponentScan 이 단순히 그 패키지와 하위 패키지에서 @Component 붙은것만 빈으로 등록해주는 것 뿐만 아니라 @ComponentScan 붙은 클래스도 빈으로 등록해주는건가요??

y2gcoder님의 프로필

y2gcoder

2023.07.31

@SpringBootApplication 내에 @ComponentScan 이 있으면 다른 클래스에서는 @ComponentScan 을 안써도 해당패키지의 하위패키지까지 스캔해서 빈으로 등록해주지 않나요??

=> 네 맞습니다.

 

그리고 @ComponentScan 이 단순히 그 패키지와 하위 패키지에서 @Component 붙은것만 빈으로 등록해주는 것 뿐만 아니라 @ComponentScan 붙은 클래스도 빈으로 등록해주는건가요??

=> 제가 알기로는 @ComponentScan은 스프링 컨테이너가 컴포넌트 스캔할 범위만 지정해주는 것으로 알고 있습니다. 해당 애노테이션이 붙은 클래스를 빈으로 등록하려면 @Component(@Service, @Controller, @Repository 등)을 붙여주셔야 합니다.