SSAFY11th-book-study / book-study

0 stars 0 forks source link

[7.6.2] bean, component 어노테이션 사용법 #87

Open a-young-kim opened 1 month ago

a-young-kim commented 1 month ago

bean 어노테이션과 component 어노테이션 모두 빈 등록을 할 경우 사용하는 어노테이션으로 알고 있는데 어떤 차이가 있는지 궁금해서 질문 드립니다. bean 어노테이션은 configuration 어노테이션이 있는 클래스의 메소드에 사용하여 해당 메소드에서 생성되는 객체를 빈으로 등록 component 어노테이션은 compoenetScan에서 지정한 패키지 안에 있는 클래스들 중 해당 어노테이션을 가지고 있으면 모두 빈으로 등록하는 방식으로 알고 있습니다.

  1. 제가 이해한 방식이 맞는지 위의 차이말고도 다른 차이가 있을 지 궁금합니다.
  2. 또한 두 가지 방법 모두 사용하여 빈을 생성할 경우 어떤 빈이 먼저 생성될 지 궁금합니다.
sootudio commented 1 month ago
  1. 이해하신 방식이 맞다고 생각합니다. 제가 찾아봤을 때, 위에 적어놓으신 부분은 두 애노테이션의 등록 방식의 차이를 설명하신 것 같습니다. 그 이외에도 @Bean은 메서드 레벨에서 사용되고, 주로 명시적으로 빈을 정의하고자 할 때 사용되지만, @Component는 클래스 레벨에서 사용되고, 주로 클래스 자체가 빈으로 등록되어야 할 때 사용된다는 차이가 있다고 찾았습니다.

  2. Spring 컨테이너는 @Bean 메서드를 통해 정의된 빈을 우선적으로 처리한 후, @Component로 정의된 빈을 처리한다고 합니다. 관련해서 GPT가 만들어준 예제 코드를 가져왔습니다.

    
    @Configuration
    public class AppConfig {
    
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
    }

@Component public class MyServiceImpl implements MyService { // 클래스 내용 }


앞에서 설명한 것 처럼, 위 코드에서는 `@Bean`으로 정의된 `MyServiceImpl` 빈이 우선적으로 등록되고, 그 다음에 `@Component`로 정의된 `MyServiceImpl`가 처리된다고 합니다.
a-young-kim commented 1 month ago

자바에서 제공해주는 라이브러리들을 빈으로 만들기 위해 @bean을 사용해서 빈으로 등록한다.

hj-k66 commented 1 month ago

component-scan 동작 과정

ConfigurationClassParser 가 Configuration 클래스를 파싱한다. @Configuration 어노테이션 클래스를 파싱하는 것이다. ⬇ ComponentScan 설정을 파싱한다. base-package 에 설정한 패키지를 기준으로 ComponentScanAnnotationParser가 스캔하기 위한 설정을 파싱한다. ⬇ base-package 설정을 바탕으로 모든 클래스를 로딩한다. ⬇ ClassLoader가 로딩한 클래스들을 BeanDefinition으로 정의한다. 생성할 빈의 대한 정의를 하는 것이다. ⬇ 생성할 빈에 대한 정의를 토대로 빈을 생성한다.

https://velog.io/@hyun-jii/%EC%8A%A4%ED%94%84%EB%A7%81-component-scan-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95