ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Core] 공식문서 공부 - 1.3.1 Naming Beans
    JAVA/Spring 2022. 8. 21. 22:40

    https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-beanname

     

    Core Technologies

    In the preceding scenario, using @Autowired works well and provides the desired modularity, but determining exactly where the autowired bean definitions are declared is still somewhat ambiguous. For example, as a developer looking at ServiceConfig, how do

    docs.spring.io

    이번 글에서는 Bean의 명명 규칙과 구성 메타데이터 내의 별칭(alias) 요소에 대해 다룬다.

    모든 Bean은 한개 이상의 식별자(identifier)를 가지고 있다.
    이러한 식별자는 해당 Bean을 호출한 IoC 컨테이너 내에서 고유한(unique) 값을 가져야한다.
    일반적으로 Bean은 하나의 식별자를 가지지만, 두 개 이상의 식별자를 필요로 하는경우 추가되는 값들은 별칭(alias)으로 간주할 수 있다.

    XML 기반 구성 메타데이터(configuration metadata)에서는 id 속성이나 name 속성 중 하나만 또는 둘다 사용하여 Bean의 식별자로 지정한다.
    id 속성을 사용하는 경우 정확히 하나의 식별자만을 지정할 수 있고,
    name 속성을 사용하는 경우 콤마, 세미콜론, 공백 중 하나로 구분하여 둘 이상의 식별자를 지정할 수 있다.

    <!--id 속성을 사용시 하나의 고유한 이름만 지정가능-->
    <bean id="uniqueName"></bean>
    
    <!--name 속성을 사용시 여러개의 고유한 이름을 지정가능-->
    <bean name="uniqueName1,uniqueName2,..."></bean>


    만약 Bean에 name 이나 id 속성을 지정하지 않는 경우, IoC 컨테이너가 해당 Bean에 고유한 이름을 지정하게 된다.

    만약 ref 요소(<property> 태그 내의 속성) 또는 Service Locator 스타일 검색을 통해 Bean을 참조하려고 한다면,
    해당 Bean 정의에 꼭 이름(id or name 속성)을 명시해야한다.

    Bean Naming Conventions

    Bean의 이름은 소문자로 시작하며, CamelCase 형식으로 작성한다.
    예시로 accountManager, accountService, userDao, loginController 등이 있다.

     


    Aliasing a Bean outside the Bean Definition

    Bean 정의 내에서, 최대 1개의 id 속성 내의 이름과 여러개의 name 속성 내의 이름들의 조합으로, 2개 이상의 이름을 Bean에게 제공할 수 있다. 이렇게 구성된 이름들은 같은 Bean에 대한 별칭(alias)이라고 할 수 있고 이러한 방식이 때때로는 유용하다. 하지만 실제 Bean이 정의된 곳과 같은 곳에다가 별칭(alias)들을 설정하는 것은 항상 적절하다고 할 수도 없다.


    이외에 다른곳에서 정의된 Bean에 대한 별칭(alias)을 제공하는 것이 유용할 때도 있다.
    각각의 객체 정의를 가진 서브시스템들이 모여서 만들어지는 큰 규모의 시스템이 이에 해당한다.

    XML 기반 구성 메타데이터(configuration metadata)에서는 <alias /> 요소를 통해 다른 곳(다른 구성 메타데이터)에서 정의된 Bean의 별칭(alias)을 제공할 수 있다.

    <alias name="fromName" alias="toName"/>

    위의 alias 정의를 사용한 후부터는, 같은 IoC 컨테이너 내에서 "fromName"에 해당하는 Bean을 "toName"으로도 참조 할 수 있게된다.

    예를 들어, 서브시스템 A와 B가 있는데 이들이 같은 DataSource 객체를
    각각 "subsystemA-dataSource", "subsystemB-dataSoruce"라는 이름으로 참조 하고 있다고 하자.
    다음으로, 이 2개의 서브시스템으로 구성된 메인 어플리케이션이 있다고 하자.
    이 메인 어플리케이션은 같은 DataSource 객체를 "myApp-dataSoruce"라는 이름으로 참조 하고 있다고 하자.
    정리하면 서브시스템 A, B와 메인시스템이 DataSoruce 객체를 서로 다른 3가지 이름으로 참조하고 있는 상황이다.

    서로 다른 3개의 이름(id or name 속성)이 같은 객체를 참조할 수 있도록 구성 메타데이터에 <alias /> 요소를 추가해보자.

    <!--XML-Based Configuraion Metadata-->
    
    <beans>
        <alias name="myApp-dataSource" alias="subsystemA-dataSource"/>
        <alias name="myApp-dataSource" alias="subsystemB-dataSource"/>
    </beans>
    <!--Another XML-Based Configuration Metadata-->
    
    <beans>
    	<bean id="myApp-dataSource" class="...DataSource"></bean>
    </beans>

    다른 곳에서 정의된 Bean(id="myApp-dataSource")의 별칭(alias)을 <alias /> 요소를 사용하여 서브시스템들에게 제공하고있고,

    서브시스템 A, B와 메인시스템이 동일한 DataSoruce 객체(Bean)를 각각 고유한 이름을 통해 참조할 수 있게 되었다.

    댓글

Designed by Tistory.