[Spring] 스프링 XML 설정 → 애노테이션 설정 변환 방법

2021. 4. 22. 01:16 Spring Framework/Spring Core

 

[Spring] 스프링 XML 설정 → 애노테이션 설정 변환 방법

스프링 프레임워크를 사용은 XML 설정을 이용하는 방법과 자바 애노테이션 기반의 설정을 이용하는 두 가지 방법으로 구분할 수 있다. (참고 - 스프링 XML 설정 방법 : [Spring] 스프링 XML 설정 파일 작성 방법 정리)
본 글에서는 스프링의 XML 설정을 애노테이션 설정으로 변환하는 방법에 대해 다룬다.

 

📄 목차

1. 스프링 애노테이션 기반 설정 기본 포맷

2. 기본적인 빈 설정 방법
- 자동 주입 설정 - autowire 속성

3. DI(Dependency Injection) 설정
- 생성자 주입
- 프로퍼티 주입
- 프로퍼티 주입 - List 타입
- 프로퍼티 주입 - Map 타입

4. ApplicationContext 객체 생성
- Configuration 클래스가 한 개인 경우
- Configuration 클래스가 여러 개인 경우
- Configuration 클래스가 여러 개인 경우(@Import 사용)

 

1. 스프링 애노테이션 기반 설정 기본 포맷

import org.springframework.context.annotation.Configuration;

@Configuration
public class MemberConfig {

}

알아보기 쉽도록 XXXConfig, XXXConfiguration 같은 이름의 클래스를 생성하고 클래스에 @Configuration 애노테이션을 붙인다.

 

2. 기본적인 빈 설정 방법

XML 설정

<bean id="studentDao" class="ems.member.dao.StudentDao"></bean>

 

⬇️

애노테이션 설정

@Bean
public StudentDao studentDao() {
	return new StudentDao();
}

 

메소드명 ➡️ studentDao ➡️ 빈 이름(id)

리턴 타입 ➡️ StudentDao ➡️ 빈 타입

리턴 객체 ➡️ new StudentDao() ➡️ 빈 객체

 

빈 설정 애노테이션 (좌:XML 설정/우:애노테이션 설정)

  • id="..." ➡️ @Bean(name="...")
  • scope="prototype" ➡️ @Scope("prototype")
  • primary=true ➡️ @Primary
  • lazy-init=true ➡️ @Lazy
  • init-method="..." ➡️ Bean(initMethod="...")
  • destroy-method="..." ➡️ Bean(destroyMethod="...")

 

메소드 아규먼트를 통한 주입

@Bean
public BasicDataSource source() {
	BasicDataSource source = new BasicDataSource();
	source.setDriverClassName("oracle.jdbc.OracleDriver");
	source.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
	source.setUsername("scott");
	source.setPassword("1234");
	
	return source;
}

// 메소드 아규먼트 타입과 같은 빈이 자동으로 주입된다.
@Bean
public JdbcTemplate db(BasicDataSource source) {
	JdbcTemplate db = new JdbcTemplate(source);
	return db;
}

빈 등록 메소드에 선언한 아규먼트와 타입이 같은 빈이 자동으로 주입된다.

 

자동 주입 설정 - autowire 속성

빈의 이름(id)이나 타입을 통해 자동 주입하는 <bean>의 autowire 속성은 @Bean의 autowire 속성과 같다.

단, 이 방법은 스프링 5.1부터 정상 동작은 하지만 deprecated 되었다.

 

이름(id) 자동 주입 👉

XML 설정

<bean id='data1' class='com.atoz_develop.beans.DataBean2'/>
<bean id='data2' class='com.atoz_develop.beans.DataBean2'/>

<bean id='xml3' class='com.atoz_develop.beans.TestBean2' autowire="byName"/>

⬇️

애노테이션 설정

@Bean
public DataBean2 data1() {
	return new DataBean2();
}

@Bean
public DataBean2 data2() {
	return new DataBean2();
}

// autowire: deprecated since 5.1
@Bean(autowire = Autowire.BY_NAME)
public TestBean2 java3() {
	return new TestBean2();
}

 

타입 자동 주입 👉

XML 설정

<!-- byType이므로 id는 설정하지 않아도 됨 -->
<bean class='com.atoz_develop.beans.DataBean3'/>

<bean id='xml4' class='com.atoz_develop.beans.TestBean3' autowire="byType"/>    

⬇️

애노테이션 설정

// BY_TYPE이므로 메소드 이름(빈 id)는 자유롭게 지정 가능
@Bean
public DataBean3 data100() {
	return new DataBean3();
}

@Bean(autowire = Autowire.BY_TYPE)
public TestBean3 java4() {
	return new TestBean3();
}

 

3. DI(Dependency Injection) 설정

생성자 주입

XML 설정

<bean id="registerService" class="ems.member.service.StudentRegisterService">
    <constructor-arg ref="studentDao"></constructor-arg>
</bean>

⬇️

애노테이션 설정

@Bean
public StudentModifyService modifyService() {
	return new StudentModifyService(studentDao());
}

 

프로퍼티 주입

XML 설정

<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
    <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <property name="userId" value="scott"/>
    <property name="userPw" value="tiger"/>
</bean>

⬇️

애노테이션 설정

@Bean
public DataBaseConnectionInfo dataBaseConnectionInfoDev() {
	DataBaseConnectionInfo infoDev = new DataBaseConnectionInfo();
	infoDev.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
	infoDev.setUserId("scott");
	infoDev.setUserPw("tiger");
	
	return infoDev;
}

 

프로퍼티 주입 - List 타입

XML 설정

<bean id="informationService" class="ems.member.service.EMSInformationService">
	<property name="developers">
		<list>
			<value>Cheney.</value>
			<value>Eloy.</value>
			<value>Jasper.</value>
			<value>Dillon.</value>
			<value>Kian.</value>
		</list>
	</property>
</bean>

⬇️

애노테이션 설정

@Bean
public EMSInformationService informationService() {
	EMSInformationService info = new EMSInformationService();
	
	List<String> developers = new ArrayList<>();
	developers.add("Cheney.");
	developers.add("Eloy.");
	developers.add("Jasper.");
	developers.add("Dillon.");
	developers.add("Kian.");
	info.setDevelopers(developers);
	
	return info;
}

 

프로퍼티 주입 - Map 타입

XML 설정

<bean id="informationService" class="ems.member.service.EMSInformationService">
	<property name="administrators">
		<map>
			<entry>
				<key>
					<value>Cheney</value>
				</key>
				<value>cheney@springPjt.org</value>
			</entry>
			<entry>
				<key>
					<value>Jasper</value>
				</key>
				<value>jasper@springPjt.org</value>
			</entry>
		</map>
	</property>
</bean>

⬇️

애노테이션 설정

@Bean
public EMSInformationService informationService() {
	EMSInformationService info = new EMSInformationService();
	
	Map<String, String> administrators = new HashMap<>();
	administrators.put("Cheney", "cheney@springPjt.org");
	administrators.put("Jasper", "jasper@springPjt.org");
	info.setAdministrators(administrators);
	
	return info;
}

 

4. ApplicationContext 객체 생성

애노테이션 기반의 스프링 설정을 사용할 경우 ApplicationContext(스프링 IoC 컨테이너)의 구현체는 AnnotationConfigApplicationContext를 사용한다.

 

Configuration 클래스가 한 개인 경우

ApplicationContext context = new AnnotationConfigApplicationContext(MemberConfig.class);

 

Configuration 클래스가 여러 개인 경우

ApplicationContext context = new AnnotationConfigApplicationContext(MemberConfig1.class, MemberConfig2.class, MemberConfig3.class);

 

Configuration 클래스가 여러 개인 경우(@Import 사용)

애노테이션 설정

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

@Configuration
@Import({MemberConfig2.class, MemberConfig3.class})
public class MemberConfigImport {

}

@Configuration과 함께 @Import를 사용해서 Import할 Configuration 클래스를 명시한다.

 

ApplicationContext 객체 생성 방법은 Configuration 클래스가 한 개인 경우와 동일하다.

 

관련 글

[Spring] 스프링 XML 설정 파일 작성 방법 정리

 

출처 : atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-XML-%EC%84%A4%EC%A0%95-%EC%95%A0%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%84%A4%EC%A0%95-%EB%B3%80%ED%99%98-%EB%B0%A9%EB%B2%95?category=869243