본문 바로가기

Spring/Dependency Injection

[Spring Framework] XML을 Java Configuration으로

728x90
반응형

'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)

 

 

 

지난 시간까지는 XML의 대부분을 어노테이션으로 변경해었습니다.

이번 시간에는 XML의 Configuration, 즉 <context::component-scan /> 과 같은 부분까지도 XML에서 없앨 수 있는 Java Configuration에 대해서 다뤄보고자합니다.

 

 

 

우선 XML 파일을 지워도 DI가 되게끔 하기 위해서는 이를 대체하기 위한 무언가가 필요합니다.

그것이 바로 Java Class로 만든 Config 파일입니다.

즉, XML 파일이 java 파일로 바뀌었다고 생각하면 되는 것이죠.

 

이 때, 새로 만든 config를 위한 java class는 이것은 Configuration을 위한 class임을 spring에게 알려주기 위해서 @Configuration이라는 어노테이션을 붙여주게 됩니다.

 

그 다음으로는 우리가 만들어주지 못했던 <context:component-scan base-package="객체화할 클래스들이 있는 패키지명"/> 를 @ComponentScan("객체화할 클래스들이 있는 패키지명") 으로 어노테이션을 붙여줍니다.

 

 

더보기

약 내가 객체화 할 클래스들이 있는 패키지가 여러개라면, XML 과 같이 콤마로 구분하는 것 외에도 배열의 형태를 위해서 중괄호를 함께 써줘야합니다.

즉, @ComponentScan({"spring.di.ui", "spring.di.console"}) 과 같이 작성해야합니다.

 

 

또한 지난 시간에 @Component를 붙여주었던 Animal class 도 변경해 주어야 하는데요,

우선 @Component 어노테이션이 아닌, Java Configuration을 통해서 객체를 생성해 줄 것 입니다.

 

Java Configuration을 위해서 새로 class를 만들어 MyAppConfig 라는 Java  Configuration을 위한 class를 생성하겠습니다.

 

아래의 코드로 작성할 수 있습니다.

 

 

 

- MyAppConfig.java

// <context:component-scan base-package="spring.di.ui, spring.di.console"/> 대신
@ComponentScan({"spring.di.ui", "spring.di.console"})
@Configuration
public class MyAppConfig {
	
	// <bean id = "animal" class = "spring.entity.Animal"/>
	@Bean
	public Animal animal() {
		return new Animal();
	}
	
	@Bean
	public AnimalPrint console() {
		return new AnimalPrintName();
	}
}

 

 

 

위의 코드를 보면 생소한 어노테이션이 하나 보이는데요, 바로 @Bean입니다.

우리가 Java Configuration class에서 객체를 생성했다고 해서 spring 안의 IoC 컨테이너에 자동으로 담기게 되는 것은 아닙니다.

따라서 우리가 만든 객체를 IoC 컨테이너에 담아줄 무언가가 필요한데, 바로 그 기능을 하는 것이 Bean 어노테이션입니다.

 

 

그러면 Bean 어노테이션 아래에 있는 객체 생성 부분에 대해서 좀 더 알아봅시다.

animal의 객체를 생성하고 있는 코드인데요, 기존의 xml과 각각 다음의 부분들이 대응된다고 생각하면 이해하기 쉽습니다.

 

 

<bean id = "animal" class = "spring.entity.Animal"/>

 

@Bean
public Animal animal() {
    return new Animal();
}

 

 

 

이제 마지막으로 Program.java 에서 DI 지시서를 받아오는 부분을 수정해주어야 하는데요,

우리는 기존의 setting.xml을 사용하는 것이 아니라 MyAppConfig라고 하는 Java Configuration을 사용해야 합니다.

 

 

따라서 ClassPathXmlApplicationContext 함수를 이용하는 것은 바람직 하지 않습니다.

그 이유는 저번에 설명했듯이, ClassPathXmlApplicationContext 는 xml 기반의 config 를 사용할 때에 경로를 지정해주기 위한 함수이기 때문입니다.

 

따라서 우리는 java로 config를 하였을 때에 사용할 수 있는 ApplicationContext 함수를 찾아야하는데 그것이 바로 AnnotationConfigApplicationContext 입니다.

인자에는 방금 만들어준 Java Configuration 파일의 클래스를 넣어주면 됩니다.

 

 

아래와 같이 Program.java의 코드를 수정할 수 있습니다.

 

 

 

- Program.java

public class Program {
	public static void main(String[] args) {
	    	
		ApplicationContext context = 
				new AnnotationConfigApplicationContext(MyAppConfig.class);
		
		AnimalPrint console = context.getBean(AnimalPrintName.class);
		console.print();
              
	}
}

 

실행하면 아래와 같은 결과를 얻을 수 있습니다.

 

 

 

 

이번 시간은 DI 의 마지막 시간이라고 합니다.

뉴렉처님의 좋은 강의를 듣고 감사한 마음으로 DI를 차근차근 포스팅하면서 배워보았습니다.

 

다음 시간에는 뉴렉처 강의의 AOP 부분을 포스팅하겠습니다 :)

 

 

 

728x90
반응형