[Spring] 스프링 XML 설정 → 애노테이션 설정 변환 방법
[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 설정 파일 작성 방법 정리
'Spring Framework > Spring Core' 카테고리의 다른 글
AspectJ Weaver를 사용한 애노테이션 기반의 스프링 AOP 구현 방법 (0) | 2021.04.22 |
---|---|
AspectJ Weaver를 사용한 XML 기반의 스프링 AOP 구현 방법 (0) | 2021.04.22 |
[Spring] @Component 애노테이션 및 함께 사용하는 애노테이션 정리 (0) | 2021.04.22 |
[Spring] 애노테이션을 이용한 빈 설정 방법 정리 (0) | 2021.04.22 |
[Spring] 스프링 빈(Bean) 초기화, 소멸 시 특정 작업을 하는 방법 (0) | 2021.04.22 |
[Spring] 의존성 주입 애노테이션 정리 - @Autowired, @Resource, @Inject (0) | 2021.04.22 |
[Spring] 스프링 XML 설정 파일 작성 방법 정리 (0) | 2021.04.22 |
Servlet에서 스프링 ApplicationContext 사용하기 (0) | 2021.04.22 |