모르는게 많은 개발자

[Spring] XML Configuration와 Java Configuration 비교 본문

스프링

[Spring] XML Configuration와 Java Configuration 비교

Awdsd 2020. 4. 8. 17:14
반응형

지금까지 Xml파일을 통해서 bean을 관리해오는 것을 봤다. 이제는 이 Xml을 Java코드로 바꿀 수 있는 방법을 알아보자.

 

1. @Configuration

JAVA config를 사용하기 위해서는 @Configuration Annotation을 사용해야 한다.

@Configuration
@ComponentScan("spring.di.ui")
public class DIConfig {
	@Bean
	public Exam ex() {
		return new NewlecExam();
	}
}
<context:component-scan base-package="spring.di.ui" />
<bean id="ex" class="spring.di.entity.NewlecExam" />

위의 코드는 XML을 자바 코드로 변경했을 때를 나타낸다. @Bean태그를 통해 bean을 생성하고 함수의 이름이 XML에서는 id가 된다.

여기서 Exam의 빈을 생성되는 동작 방식이 궁금할 수 있다.

  • @Bean태그를 통해 클래스 객체를 생성하고 @Value를 통해 변수에 값이 할당한다음 IoC컨테이너에 담긴다.
public class NewlecExam implements Exam {
	@Value("20")
	private int kor;
	@Value("40")
	private int eng;
	private int math;
	private int com;
	
	public NewlecExam(int kor, int eng, int math, int com) {
		this.kor = kor;
		this.eng = eng;
		this.math = math;
		this.com = com;
	}
}

이것을 실행하는 main문은 다음과 같다.

public class Program {
	public static void main(String[] args) {
    		//Annotation을 통해 Config를 정의했으므로 
        	//AnootationConfigApplicationContext객체를 통해 DIConfig.class를 등록
		ApplicationContext context = 
				new AnnotationConfigApplicationContext(DIConfig.class);

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

 

2. @Component VS @Bean

그럼 @Component와 @Bean은 모두 객체를 생성해 IoC 컨테이너에 넣는 역할을 한다. 그럼 두 Annotation의 차이는 뭘까?

  • @Component는 개발자가 직접 만든 클래스를 bean으로 등록할 때 사용.
  • @Bean은 개발자가 만들지 않은 클래스 즉, 외부 라이브러리를 bean으로 등록할 때 사용.

그럼 위의 예제는 약간 잘못됬다고 볼 수 있다. 위의 예제를 고치면 다음과 같다.

@Configuration
//@Component설정한 newlecExam을 scan하기 위해 spring.di.entity 패키지 추가
@ComponentScan({"spring.di.ui", "spring.di.entity"})
public class DIConfig {

}
@Component
public class NewlecExam implements Exam {
	@Value("20")
	private int kor;
	@Value("40")
	private int eng;
	private int math;
	private int com;
	
	public NewlecExam(int kor, int eng, int math, int com) {
		this.kor = kor;
		this.eng = eng;
		this.math = math;
		this.com = com;
	}
}

 

 

 

 

 

참고

https://www.youtube.com/watch?v=XzrXZIRB1vM&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=17

반응형
Comments