[Spring Boot] xml 설정 파일을 이용한 Bean 관리 및 사용

2023. 5. 31. 17:29기술 창고/Spring

728x90
SMALL

최근 몇 년간 Spring을 사용해 본 개발자 분들이라면 대부분 xml 파일을 자주 사용하진 않았을 것입니다.

불과 한 20년 전만 해도 모든 설정 내용들을 xml 파일에 넣어서 관리했다고 합니다.

따라서, 현재의 개발 흐름에 따르면 xml을 매우 깊게 알아볼 필요까지는 없지만 알고있고 이해하고 있다면 많은 도움이 될 것입니다.

초기에 xml을 사용했던 기업들도 많이 있어서 xml 형식의 데이터들이 많이 포함되어 있는 개발환경도 있을 것이기 때문입니다.

 

이번에는 기본적으로 Spring을 사용하면 주로 생성하게 되는 Bean 객체들을 기존처럼 java 설정처럼 관리하는 것이 아닌 xml로 어떻게 관리할 수 있는지 간단하게 정리해보겠습니다.

 

 

우선 Spring 프로젝트 내에서 resources 경로에 xml 파일을 만들어줍니다.

해당 xml에 Bean 객체들을 기존의 @Configuration 으로 설정했던 설정 클래스 객체처럼 모아서 관리될 수 있도록 할 것입니다.

이름은 아무렇게나 해도 상관없을 것입니다.

 

 

브라우저에 spring xml configuration example 이라고 검색하면 spring 공식 홈페이지에서 제공해주는 xml 설정 스키마 예시 양식을 볼 수 있습니다.

 

 

해당 사이트에 들어가서 context schema 항목을 찾으면 예시 코드를 확인할 수 있습니다.

xml 파일 설정 기본 양식 코드라고 보면 됩니다.

해당 코드 내용을 복사해줍니다.

 

방금 만든 xml configuration 파일에 복사한 내용을 붙여넣기 합니다.

초기에 beans 태그가 존재하는데 해당 태그 내부에 기존에 Component 어노테이션으로 지정된 Bean 객체들을 넣어주면서 관리할 것 입니다.

 

<bean id="name" class="java.lang.String"> <!-- bean 객체 : 속성 명은 name 그리고 타입은 String -->
    <constructor-arg value="sehun"/> <!-- 생성자 인수 지정 : 속한 bean 객체의 생성자 주입을 하면서 sehun 값을 부여받음 -->
</bean>

<bean id="age" class="java.lang.Integer"> <!-- bean 객체 : 속성 명은 age 그리고 타입은 Integer -->
    <constructor-arg value="25" /> <!-- 생성자 인수 지정 : 속한 bean 객체의 생성자 주입을 하면서 25 값을 부여받음 -->
</bean>

<!-- component scan을 적용할 패키지를 정해 해당 패키지 내부에 있는 Component bean 객체들을 스캔해올 수 있다. -->
<context:component-scan base-package="com.udemy.learnspringframework.app1.game"/>

<!-- component-scan을 대체하고 싶다면 beans 로 따로 지정해줄 수 있다. -->
<!-- 특정 패키지 내에 있는 객체를 bean 태그로 불러올 수 있다. -->
<!-- id에는 Bean 객체명을 만들어주고, class 부분에는 불러올 객체가 존재하는 경로 + 마지막에 해당 객체명을 넣어준다. -->
<bean id="game" class="com.udemy.learnspringframework.app1.game.PackMan"/>
<bean id="gameRunner" class="com.udemy.learnspringframework.app1.game.GameRunner">
       <constructor-arg ref="game"/>
</bean>

해당 beans 내용에 넣어서 관리해줄 bean 객체들에 대한 내용을 넣어줍니다.

xml 파일 내에서 bean 객체들을 불러오거나 생성하는 방법 몇 가지를 보면,

 

1. 기본적으로 <bean> 태그를 사용해서 직접적으로 bean객체를 그 자리에서 만들어준다.

2. @Component 로 지정한 bean객체가 있는 경로를 <bean> 태그의 class 속성에 명시함으로서 bean 태그에 불러온다.

3. <context:component-scan base-package="{스캔할 패키지 경로}"> 태그를 사용하여 @Component들이 존재하는 패키지 경로를 입력하여 해당 경로 내부에 존재하는 Component bean 객체들을 한번에 전부 받아오는 방식.

 

# <bean> 태그 내부에는 <constructor-arg> 태그를 넣음으로서 해당 bean 객체를 불러오면서 생성자 주입을 할 수 있습니다. value 속성을 넣으면 기본 원시 타입의 데이터를 넣어서 생성자주입을 하고, ref 속성을 넣으면 객체 타입의 데이터를 넣어서 생성자 주입을 할 수 있습니다.

 

// xml로 설정을 관리하면 Configuration 이나 ComponentScan 어노테이션을 사용할 필요가 없다.
//@Configuration // java 설정을 나타내는 어노테이션
//@ComponentScan
public class XmlConfigurationContextLauncherApplication {

    public static void main(String[] args) {

        // AnnotationConfigApplicationContext 은 기존의 Spring 내부에 기본적으로 존재하는 Bean을 관리하는 application context를 가지고 와서 직접 만들어주었던 Component bean 객체들을 가지고 왔다면,
        // ClassPathXmlApplicationContext 은 xml 파일로 만든 HTML 형식의 설정 파일에 Bean 객체들을 관리하고 불러와서 사용하는 방식이다.
        // 해당 설정 xml 파일 내부에 Component bean 객체들이 Component 어노테이션을 명시받고 생성되어있다고 생각하면 될 것이다.
        // 또한, Configuration 어노테이션도 적용이 되어있다고 생각하면 될 것이다.
        try (var context = new ClassPathXmlApplicationContext("contxtConfiguration.xml")) {
            Arrays.stream(context.getBeanDefinitionNames()).forEach(System.out::println);
            System.out.println(context.getBean("name")); // xml로 불러온 Bean 에서 id 값을 기준으로 해당 값을 불러온다.
            System.out.println(context.getBean("age"));
            context.getBean(GameRunner.class).run();
        }

    }
}

xml로 관리되어지고 있는 내용들을 확인하기 위해서 ClassPathXmlApplicationContext를 사용하여 해당xml 파일을 직접적으로 가져왔습니다.

이제 xml 에 들어가있는 bean객체들을 확인하고 사용할 수 있습니다.

 

기존의 Spring 내에 존재하는 Bean객체들을 관리하는 application context를 가져오는 AnnotationConfigApplicationContext 와 사용 방식이 유사합니다.

변수로 받아 .getBean 함수를 통해 원하는 Bean 객체를 조회하여 메소드를 호출하거나 사용할 수 있습니다.

 

 

이렇듯 xml 설정 파일로 bean 객체들을 관리하고 사용하는 방법을 간단하게만 알아보았는데, 이전에 기업들이 실무에서 사용했던 xml 설정 파일을 보면 몇 천개의 코드들이 들어가있습니다.

오늘날에 와서는 어노테이션이라고 하는 기능을 통해 효율적으로 개발하고 있는 방식을 대부분 채택하고 있기 때문에 xml 파일을 활용한 방식은 잘 사용하지 않는 추세이지만 아직까지 오래된 옛날 방식의 개발 방식을 채택하고 있는 기업에 종사하고 있다면 알아두면 도움이 될 것으로 보입니다.

 

어노테이션 vs xml

 

728x90
반응형
LIST