뉴렉쳐 스프링 프레임워크 정리/Part1. DI

[Spring 개념정리] Java를 통한 Configuration

째로스 2023. 7. 14. 14:38

목표

xml 대신 Java 코드를 통해 설정파일을 작성한다.

 

기존 xml 설정 파일 작성방식

<!-- setting.xml -->

<?xml version="1.0" encoding="UTF-8"?>
<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/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
						http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
                        
    <context:component-scan base-package="spring.di.ui"/>
    <bean id="exam" class="spring.di.entity.NewLecExam"/>
<beans>

위와 같이 xml로 작성된 설정파일을 Java 코드로 만들면 아래와 같다.

 

Java 코드로 작성한 설정 파일

@ComponentScan("spring.di.ui")
@Configuration
public class NewlecDIConfig {
	
	@Bean
	public Exam exam() {
		return new NewlecExam();
	}
}

@Configuration : Java로 작성한 설정 파일임을 알림

@ComponentSacn("spring.di.ui") = <context:component-scan base-package="spring.di.ui"/>

@Bean public Exam exam(){return new NewlecExam()} = <bean id="exam" class="spring.di.entity.NewLecExam"/>

으로 똑같이 작성할 수 있다.

 

@Bean 어노테이션은 @Component 어노테이션과 같이 객체를 생성할 때 사용되는 어노테이션이다.

다만 다른점이 있다면, @Bean은 메소드를 통해 리턴되는 객체를 IoC 컨테이너에 생성하는 것이고,

@Component는 클래스 자체를 객체로 만들어 IoC 컨테이너에 저장한다는 점이다.

주로 @Bean은 외부 라이브러리에서 반환되는 객체를 IoC 컨테이너에 담아야할 경우 사용된다.

 

다만 xml 대신 Java 코드로 설정파일로 생성한 IoC 컨테이너를 사용하기 위해서는 하나 더 수정해줘야 할게 있다.

public class Program {
    public static void main(String[] args) {			
        ApplicationContext context = new AnnotationConfigApplicationContext(NewlecDIConfig.class);

        ExamConsole console = (ExamConsole) context.getBean("console");
        //ExamConsole console = context.getBean(ExamConsole.class);
        console.print();
    }
}

바로 context 변수를 생성할 때, AnnotationCofingApplicationContext 생성자에 해당 클래스를 주입하여 설정파일을

가져와야 한다.

 

여러 개의 Java 설정 파일을 사용해야할 경우는 아래와 같다.

public class Program {
    public static void main(String[] args) {			
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        
        context.register(AppConfig.class,OtherConfig.class);
        context.register(NewlecDIConfig.class);
        context.refresh();
        
        ExamConsole console = (ExamConsole) context.getBean("console");
        console.print();
    }
}