스프링 프레임워크의 혼합 설정 방법

실제 애플리케이션 개발에서는 자동 설정, JavaConfig 설정, XML 설정을 함께 사용해야 하는 경우가 종종 발생합니다. 이러한 경우 모든 설정을 통합할 수 있는 루트 설정을 구성하는 것이 좋습니다.

JavaConfig를 루트 설정으로 사용하는 방법

JavaConfig 클래스를 루트 설정으로 사용할 경우, @ComponentScan, @Import, @ImportResource 어노테이션을 조합하여 다양한 설정을 통합할 수 있습니다.

루트 설정 클래스 예시


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ComponentScan
@Import({ MusicPlayerConfig.class, DiscConfig.class })
@ImportResource({"classpath:disc-beans.xml", "classpath:player-beans.xml"})
public class AppConfig {
}

테스트 클래스 예시


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class MusicSystemTest {
    
    @Autowired
    private AutoDisc autoDisc;
    @Autowired
    private MusicDisc musicDisc;
    @Autowired
    private MusicPlayer musicPlayer;
    @Autowired
    private XmlDisc xmlDisc;
    @Autowired
    private ConfigDisc configDisc;
    
    @Test
    public void testAllComponents() {
        autoDisc.play();
        musicDisc.play();
        musicPlayer.play();
        xmlDisc.play();
        configDisc.play();
    }
}

XML을 루트 설정으로 사용하는 방법

XML 파일을 루트 설정으로 사용할 경우, <context:component-scape> 요소로 자동 스캔을 활성화하고, <bean> 요소로 JavaConfig 설정 클래스를, <import> 요소로 다른 XML 설정 파일을 로드합니다.

루트 XML 설정 파일 예시



<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
    
    
    
    
    
    <bean class="com.example.springapp.DiscConfig"></bean>
    <bean class="com.example.springapp.PlayerConfig"></bean>
    
    
    <import resource="disc-beans.xml"></import>
    <import resource="player-beans.xml"></import>
</beans>

XML 기반 테스트 클래스 예시


import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MusicSystemXmlTest {
    
    private static ApplicationContext context = 
        new ClassPathXmlApplicationContext("app-config.xml");
    
    private AutoDisc autoDisc = context.getBean("autoDisc", AutoDisc.class);
    private MusicDisc musicDisc = context.getBean("musicDisc", MusicDisc.class);
    private MusicPlayer musicPlayer = context.getBean("musicPlayer", MusicPlayer.class);
    private XmlDisc xmlDisc = context.getBean("xmlDisc", XmlDisc.class);
    private ConfigDisc configDisc = context.getBean("configDisc", ConfigDisc.class);

    @Test
    public void testAllComponents() {
        autoDisc.play();
        musicDisc.play();
        musicPlayer.play();
        xmlDisc.play();
        configDisc.play();
    }
}

구성 요소 클래스 예시

자동 스캔을 사용하는 클래스


import org.springframework.stereotype.Component;

@Component
public class AutoDisc {
    public void play() {
        System.out.println("자동 설정으로 등록된 디스크가 재생됩니다.");
    }
}

JavaConfig에 등록된 클래스


public class MusicDisc {
    private String artist = "가수명";
    private String title = "곡명";
    
    public void play(){
        System.out.println("재생 중: " + title + " - " + artist);
    }
}

JavaConfig 설정 클래스


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DiscConfig {
    @Bean
    public MusicDisc musicDisc(){
        return new MusicDisc();
    }
}

의존성 주입을 사용하는 클래스


public class MusicPlayer {
    private MusicDisc disc;
    
    public MusicPlayer(MusicDisc disc) {
        this.disc = disc;
    }
    
    public void play() {
        disc.play();
    }
}

플레이어 설정 클래스


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PlayerConfig {
    @Bean
    public MusicPlayer musicPlayer(MusicDisc disc){
        return new MusicPlayer(disc);
    }
}

XML 설정에 등록된 클래스


public class XmlDisc {
    private String artist = "XML 아티스트";
    private String title = "XML 곡";
    
    public void play() {
        System.out.println("XML 설정으로 재생: " + title + " by " + artist);
    }
}

XML 설정 파일 예시



<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="xmlDisc" class="com.example.springapp.XmlDisc"></bean>
</beans>

두 번째 XML 설정 파일 예시



<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="configDisc" class="com.example.springapp.ConfigDisc"></bean>
</beans>

두 번째 XML 설정에 등록된 클래스


public class ConfigDisc {
    public void play(){
        System.out.println("두 번째 XML 설정으로 재생되는 디스크입니다.");
    }
}

태그: 스프링 자바설정 XML설정 컴포넌트스캔 의존성주입

7월 29일 09:33에 게시됨