XML과 Java Config를 이용한 설정
학습 목표
- Maven을 이용해 스프링 프레임워크를 사용하는 프로젝트를 생성할 수 있습니다.
- Bean이 무엇인지 이해합니다.
- XML형식의 스프링 설정파일의 내용을 이해합니다.
- JavaConfig형태의 설정파일의 내용을 이해할 수 있습니다.
- @ComponentScan, @Component, @Autowired 어노테이션의 쓰임새에 대해 이해합니다.
핵심 개념
- Bean
- ApplicationContext
- DI
- AnnotationConfigApplicationContext
- @Configuration
- @ComponentScan
- @Component
- @Autowired
이번 포스팅에서는 XML과 Annotation을 이용하는 설정 방법들, 그리고 Bean과 DI같은 개념들을 살펴볼 것이다. 기초적인 Maven 프로젝트를 만들어보거나 설정을 적용해보는 실습은 많은 자료가 존재하기에 개인적으로 공부하며 모호했던 개념들을 중심으로 포스팅을 진행하려고 한다.
Bean
예전에는 Visual한 컴포는트를 Bean이라고 불렀지만, 근래에는 일반적인 Java클래스를 Bean클래스라고 얘기한다.
Bean 클래스는 다음과 같은 큰 3가지의 특징을 가지고 있다.
- 기본 생성자를 가지고 있어야 한다.
- 필드는 private하게 선언한다.
- getter, setter를 가지고 있어야 한다.
IoC의 관점에서 우리는 Bean으로 등록한 객체들의 생성과 사용을 맡길 것이기 때문에 위와 같은 일정한 규칙들을 지켜줘야 한다.
이렇게 만든 클래스들은 xml파일에 그 정보를 Bean으로 등록하여 사용해야한다. 예전에는 이렇게 해줬으나 지금은 발전하여 JavaConfig를 바탕으로 Annotation을 추가해주는 형식으로 사용하고 있다. 하나하나 살펴보겠다.
resource폴더에 applicationContext.xml등의 파일을 만들어 위와 같은 코드를 지정해주어야 한다. 즉, Bean을 하나 등록할 때 마다 xml에 주기적으로 추가해줘야 하는 것이다.
설정이 끝났다면 메인함수에서 다음과 같이 ClassPathXmlApplicationContext객체를 이용하여 사용할 수 있다. 이 객체는 만들어지는 순간 등록된 Bean객체를 전부 생성하여 관리해준다. 참고로 위의 ApplicationContext를 이용하여 객체를 얻을때는 getBean("Xml<Bean>tag id"); 와 같이 이용한다.
Spring Container의 Bean객체들은 기본적으로 싱글톤 패턴으로 만들어진다. 이런식으로 객체를 대신 생성해주고 싱글톤 등으로 관리해주는 기능등을 IoC라고 한다.
Java Config를 이용한 설정과 Annotation
xml을 이용한 설정관리는 Bean객체를 매번 추가해줘야 하는 등 불편하다. 이를 해결하기위해 annotation을 이용하여 Bean객체를 관리해주는 방법이 등장하였다. 자바의 annotation은 특정한 의미를 부여하는 방식으로 사용되어 컴파일시 해석될 수 있다. Spring은 설정을 위해 다양한 annotation을 제공해준다.
@Configuration
스프링 설정 클래스를 선언하는 annotation으로 이 클래스정보를 이용하여 IoC와 DI를 적용한다. 기본적으로 싱글톤으로 관리하며 getBean에 메소드 이름이나 클래스 정보를 바탕으로 얻어낼 수 있다.
@ComponentScan
알아서 annotation을 찾아서 Bean으로 등록해준다. 반드시 매개변수로 패키지명을 전달해주어야 하며 @Controller, @Service, @Repository, @Component 등의 annotation이 붙은 클래스를 찾아 컨테이너에 등록해준다.
@Bean
bean을 정의하는 annotation
@Component
컴포넌트 스캔의 대상이 되는 annotation중 하나로, 주로 유틸/기타 자원 클래스에 붙인다.
@Autowired
주입 대상이 되는 bean을 컨테이너에 찾아 주입하는 annotation이다.