ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Bean, Component 어노테이션
    프레임워크/Spring 2022. 1. 18. 16:52
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


    1. Bean, Component 어노테이션

    Bean과 Component 어노테이션은 모두 Spring의 빈 등록을 하는 어노테이션입니다.

     

    그럼 왜 1개의 어노테이션으로 빈 등록을 하면 되는 것을 2개의 어노테이션으로 분리되어 있을까요?

     

    당연하게도 2개는 같은 목적을 가지고 있지만 사용법이 다르기 때문입니다.

     

    2. Spring Bean 설정

    Spring의 XML 설정은 외부 라이브러리나 개발자가 직접 작성한 Class 모두 Bean 태그의 Class 속성으로 Class를 전달하여 Bean으로 생성할 수 있습니다.

     

    Java를 이용하여 Bean을 설정하려면 어노테이션을 사용합니다.

     

    개발자가 직접 작성한 Class의 경우 Class에 Component 어노테이션을 추가하여 해당 Class가 Bean으로 생성되는 Class라는 것을 지정합니다.

     

    그런데 외부의 라이브러리의 경우와 같이 개발자가 해당 Class에 Component 어노테이션을 추가할 수 없습니다.

     

    그래서 이때 Bean 어노테이션을 이용하여 해당 Class를 Bean으로 만들어 줄 수 있습니다.

     

    3. Bean 어노테이션

    Bean 어노테이션은 외부의 라이브러리처럼 개발자가 직접 작성하지 않은 Class를 Spring이 관리하는 Bean으로 생성하고 싶을 때 사용하는 어노테이션입니다.

     

    Bean 어노테이션의 구성을 보면 Target이 Method로 되어있는 것을 확인할 수 있습니다.

     

    그러므로 Bean 어노테이션은 Method Level에 지정이 가능합니다.

     

    만약 Bean 어노테이션을 Class Level에 지정하면 Compile Error가 발생합니다.

     

    이번에는 Java에서 제공하는 PriorityQueue라는 우선순위 큐를 Bean으로 생성하도록 해보겠습니다.

     

    먼저 Bean 설정이 있는 Class에 Configuration 어노테이션을 사용하여 이 Class가 Java 설정 Class라는 것을 지정을 합니다.

     

    이후 Bean으로 등록하고자 하는 객체를 반환하는 메소드를 작성하여 해당 메소드에 Bean 어노테이션을 추가합니다.

     

    예시에는 Integer타입을 갖는 PriorityQueue를 반환하도록 메소드를 작성하였습니다.

     

    Test를 진행한 결과 Bean으로 등록된 sortedQueue는 DI를 통해 위에서 작성한 메소드에서 반환된 객체를 주입해주는 것을 확인할 수 있습니다.

     

    조금 더 명확히 Bean으로 등록이 되는 것인지 확인을 위해 이번에는 동일한 PriorityQueue를 Bean으로 등록하되 미리 숫자가 입력된 Queue를 Bean으로 등록하도록 하겠습니다.

     

    위처럼 Config Class에 Bean 설정 메소드를 추가합니다.

     

    그리고 Test Class로 돌아와 기존 Bean을 주입받는 속성을 보면 Compile Error가 발생한 것을 볼 수 있습니다.

     

    Compile Error 이유는 Spring은 Bean으로 등록된 객체를 DI 하기 위해 해당 객체의 타입이 일치하면 해당 속성에 Bean 객체를 주입하여 줍니다.

     

    그런데 지금은 신규로 추가한 Bean이 PriorityQueue <Integer>로 기존 Bean과 동일한 타입으로 추가되었기 때문입니다.

     

    Autowired는 Bean을 주입하는 경우 1순위로 타입을 비교하여 같은 객체를 주입하며 만약 같은 타입이 여러 개 존재하는 경우는 Bean id와 동일한 속성 명인 Bean을 주입하여 줍니다.

     

    Bean 어노테이션의 name 속성으로 id를 지정할 수 있으며 만약 지정을 하지 않을 경우 메소드 명의 CamelCase가 Bean id가 됩니다.

     

    이제 Bean을 주입받는 방법을 알게 되었으므로 수정이 필요한 Class를 수정해보도록 하겠습니다.

     

    기존 Bean 어노테이션에 name 속성을 추가하고 'sortedQueueBean'이라는 id를 지정하도록 하겠습니다.

     

    그리고 신규로 추가된 Bean의 경우는 메소드 명의 CamelCase를 활용해 보도록 하겠습니다.

     

    기존의 PriorityQueue 속성명 queue를 sortedQueueBean으로 변경하여 빈 PriorityQueue를 주입받도록 하였습니다.

     

    BeanAnnotationNumberQueueTest를 진행하면 Bean 메소드에서 추가한 숫자가 들어있는 Queue가 주입되어 속성에 입력된 것을 확인할 수 있습니다.

     

    4. Component 어노테이션

    Component 어노테이션은 개발자가 직접 작성한 Class를 Spring이 관리하는 Bean으로 생성하고 싶을 때 사용하는 어노테이션입니다.

     

    Component 어노테이션의 구성을 보면 Target이 Type로 되어있는 것을 확인할 수 있습니다.

     

    그러므로 Component 어노테이션은 Class Level에 지정이 가능합니다.

     

     

    만약 Component 어노테이션을 Method에 설정하면 Compile Error가 발생합니다.

     

    Product Class를 Component 어노테이션을 통해 Bean으로 등록해 보도록 하겠습니다.

     

    Componenet 어노테이션이 있는 Class의 경우 Bean 생성을 위해 생성자를 이용합니다.

     

    Test를 진행한 결과 Bean으로 등록된 product는 DI를 통해 위에서 작성한 Class의 생성자를 통해 객체를 생성하여 주입해주는 것을 확인할 수 있습니다.

     

    이번에는 Product를 상속한 Pen Class를 만들어 생성자를 통해 값을 초기화하는 Test를 진행하겠습니다.

     

    위 처럼 Pen Class를 생성하고 Bean을 주입받는 Test를 진행하도록 하겠습니다.

     

    Test 결과 Pen Class의 생성자로 초기화 한 값들이 정상적으로 담겨져 있는 것을 확인할 수 있습니다.

     

    Product Class는 여러 상품의 부모 타입으로 사용이 가능 하기에 Pen을 Product 타입으로 주입 받고자 하면 Compile Error가 발생합니다.

     

    Bean 어노테이션에서 확인 한 것과 동일하게 같은 타입의 Bean이 여러개 존재하여 발생하는 Compile Error 입니다.

     

    Bean 어노테이션에서 타입이 같은 Bean이 여러개인경우 Bean id를 등록 하였습니다.

     

    그럼 Component는 어떻게 Bean id를 지정해야 될까요?

     

    Component의 경우 name 속성이 아닌 value 속성을 을 통해 id를 지정할 수 있습니다.

     

    사용된 예제 코드는 Git에 있습니다.

    반응형

    댓글

Designed by Tistory.