Java파일 (어노테이션)을 이용한 스프링 컨테이너 설정
지금까지 스프링컨테이너와 Bean객체를 생성할 때 xml 파일을 생성한 뒤 Bean태그를 이용했다. xml 파일을 설정하지 않고도, 어노테이션을 활용해 Java파일에서 스프링컨테이너를 생성하는 과정을 알아본다.
xml에서 Java클래스 변환을 알아보면서 다음과 같은 주제를 다룬다.
- xml > Java로 변환
 - DB 모델의 property
 - List와 Map 타입의 변수
 - 스프링컨테이너 생성
 
■ 스프링 설정파일.xml > Java로 변환
MemberConfig.java
@Configuration
public class MemberConfig {
}
xml파일 대신 컨테이너로 사용할 Java 클래스에 @Configuration 어노테이션을 선언해줌으로, MemberConfig 클래스는 스프링설정파일로써, 스프링 컨테이너를 생성할 수 있게 되었다.
applicationContext.xml
<bean id="studentDao" class="ems.member.dao.StudentDao" />
<bean id="registerService" class="ems.member.service.StudentRegisterService">
    <constructor-arg ref="studentDao" ></constructor-arg>
</bean>
MemberConfig.java로 변환
@Configuration
public class MemberConfig {
	@Bean
	//<bean id="studentDao" class="ems.member.dao.StudentDao" /> 
	public StudentDao studentDao() {
		return new StudentDao();
	}
	
	@Bean
	//<bean id="registerService" class="ems.member.service.StudentRegisterService">
	public StudentRegisterService registerService() {
		//<constructor-arg ref="studentDao" />
		return new StudentRegisterService(studentDao());  
	}
xml 상에 id는 메소드명으로, class는 반환타입으로 메소드를 지정해주면 된다. @Bean 어노테이션은 해당 메소드가 Bean 객체를 생성할 수 있도록 해준다.
만약 생성자 주입이 지정되어있다면 constructor-arg 태그의 ref 속성 값에 있던 bean과 동일한 studentDao를 생성자 매개변수로 넣어준다.
■ DB 모델의 property 변환
DataBaseConnectionInfo.java
public class DataBaseConnectionInfo {
	private String jdbcUrl;
	private String userId;
	private String userPw;
    
	//getter, setter 생략
}
applicationContext.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>
DB Model 과 스프링설정파일의 일부이다. DB연동을 위해 필요한 jdbcUrl과 아이디, 패스워드를 가지며 xml파일을 이용해 의존성 주입했을 때의 예제이다. (실제로 DB와 연결하진 않았다)
MemberConfig.java로 변환
@Bean
public DataBaseConnectionInfo dataBaseConnectionInfoDev() {
    DataBaseConnectionInfo infoDev = new DataBaseConnectionInfo();
    infoDev.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
    infoDev.setUserId("scott");
    infoDev.setUserPw("tiger");
    
    return infoDev;
}
DB객체를 생성해준 뒤 setter를 이용해 xml에 있던 value 값을 넣어주면 된다.
■ List와 Map 타입의 변수 설정
EMSInformationService.java
public class EMSInformationService {
	private List<String> developers;
	private Map<String, String> administrators;
	private Map<String, DataBaseConnectionInfo> dbInfos;
}
- List<String> 타입
applicationContext.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>
MemberConfig.java로 변환
@Bean
public EMSInformationService informationService() {
    EMSInformationService info = new EMSInformationService();
    ArrayList<String> developers = new ArrayList<String>();
    developers.add("Cheney.");
    developers.add("Eloy.");
    developers.add("Jasper.");
    developers.add("Dillon.");
    developers.add("Kian.");
    info.setDevelopers(developers);
    
	//private Map<String, String> 타입 변환
	//private Map<String, DataBaseConnectionInfo> 타입 변환
    return info;
}
- Map<String, String> 타입
applicationContext.xml
<property name="administrators">
    <map>
        <entry>
            <key>
                <value>Cheney</value>
            </key>
            <value>cheney@springPjt.org</value>
        </entry>
    </map>
</property>
MemberConfig.java로 변환
Map<String, String> administrators = new HashMap<String, String>();
administrators.put("Cheney", "cheney@springPjt.org");
info.setAdministrators(administrators);
- private Map<String, DataBaseConnectionInfo> 타입
applicationContext.xml
<property name="dbInfos">
    <map>
        <entry>
            <key>
                <value>dev</value>
            </key>
            <ref bean="dataBaseConnectionInfoDev"/>
        </entry>
    </map>
</property>
MemberConfig.java로 변환
Map<String, DataBaseConnectionInfo> dbInfos = new HashMap<String, DataBaseConnectionInfo>();
dbInfos.put("dev", dataBaseConnectionInfoDev());
info.setDbInfos(dbInfos);
■ 스프링컨테이너 생성
Main.java
//스프링컨테이너가 .xml일 때
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");
//스프링컨테이너가 .java일 때
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MemberConfig.class);
//java 스프링컨테이너가 여러개일 때
AnnotationConfigApplicationContext ctx = 
	new AnnotationConfigApplicationContext(MemberConfig1.class, MemberConfig2.class, MemberConfig3.class);
Main클래스에서 스프링컨테이너를 불러오는 방법도 변경된다. 컨테이너가 xml혹은 java일때 상황에 맞춰 다른 클래스를 이용해 객체를 생성해주면 된다.
Java 파일 컨테이너 또한 xml과 같이 여러 파일로 나눌 수 있다. 그럴 땐 인자값으로 사용할 클래스를 모두 입력해주면 된다. 혹은 하나의 Java파일에 다른 설정파일들을 @import 해줌으로써 import에 포함된 다른 클래스들을 인자에서 제외할 수도 있다.
MemberConfig1 클래스에 다른 설정파일들을 import하는 코드
@Configuration
@Import({MemberConfig2.class, MemberConfig3.class})
public class MemberConfig1 {
}
출처 : [인프런] 자바 스프링 프레임워크(renew ver.) - 신입 프로그래머를 위한 강좌