Spring & Springboot/올인원 스프링 프레임워크

XML 파일을 Java 파일로 변경하기

YJ_ma 2023. 9. 20. 00:32

XML파일을 Java 파일로 변경하기

XML파일이 아닌 Java파일을 이용해서 스프링 설정 파일을 만들어본다.

예제 프로젝트 준비하기

1. ch04_pjt_01 프로젝트를 복사해서 ch06_pjt_01로 붙여넣는다.

2. pom.xml에서 <artifactId>를 ch04_pt_01에서 ch06_pjt_p1로 수정한다.

<artifactId>ch06_pjt_01</artifactId>

3. [src/main/java] 내부의 패키지 이름을 ch04_pjt_01 → ch06_pjt_01로 변경한다.

변경 변경

4. [src/main/resources] 내부의 appplicationContext.xml에서 모든 패키지명을 ch04_pjt_01에서 ch06_pjt_01로 수정한다.

- appCtx1, appCtx2, appCtx3, appCtxImport.xml도 모두 변경해주기!

<!-- InitSampleData 빈 -->
<bean id="initSampleData"
    class="ch06_pjt_01.ems.utils.InitSampleData">
    <property name="sNums">

 

XML 파일의 기능을 Java 파일로 변경하기

1. [src/main/resources]에서 applicationContext.xml을 열어보면 하나의 파일에 모든 스프링 설정이 가능한 것을 확인할 수 있다.

ex, DAO, Service, Bean객체 

 

2. ch06_pjt_01.ems.configuration 패키지를 생성하고 그 안에 MemberConfig 클래스를 생성해준다.

- MemberConfig : applicationContext.xml의 역할을 대신할 자바 파일

@Configuration

· XML을 사용하지 않고 애너테이션을 이용한 스프링 설정 파일을 만들기 위해서는 자바 파일의 클래스 선언부에 @Configuration 애너테이션을 명시해야 한다.

→ 스프링 프레임워크에서 MemberConfig 클래스를 스프링 설정 파일로 인식

package ch06_pjt_01.ems.configuration;

import org.springframework.context.annotation.Configuration;

@Configuration
public class MemberConfig {

}

 

@Bean

· MemberConfig.java를 이용해 빈 객체를 생성하기 위해 사용

· StudentDao 빈 객체를 생성해준다. → 초기화될 때 StudentDao 객체를 빈 객체로 생성한다.
· @Bean을 명시한 다음 메서드를 만들고 StudentDao 객체를 반환한다.

package ch06_pjt_01.ems.configuration;

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

import ch06_pjt_01.ems.member.dao.StudentDao;

@Configuration
public class MemberConfig {

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

빈을 생성하는 문법 구조

· 메서드 이름빈 객체의 id

· 반환되는 데이터 타입빈 객체의 타입명

applicationContext.xml MemberConfig.java
<bean id="studentDao" class="ch06_pjt_01.ems.member.dao.StudentDao" /) @Bean
public StudentDao studentDao() {
    return new StudentDao();
}

 

생성자를 이용해 의존 객체 주입하기

StudentRegisterService를 이용한 주입

package ch06_pjt_01.ems.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ch06_pjt_01.ems.member.dao.StudentDao;
import ch06_pjt_01.ems.member.service.StudentRegisterService;

@Configuration
public class MemberConfig {

	@Bean
	public StudentDao studentDao() {
		return new StudentDao();
	}
	
	@Bean
	public StudentRegisterService studentRegisterService() {
		return new StudentRegisterService(studentDao());
	}
}
applicationContext.xml MemberConfig
<bean id="studentRegisterService" class="ch06_pjt_01.ems.member.service.StudentRegisterService" /)
   <constructor-arg ref="studentDao" />
</bean>
@Bean
public StudentRegisterService studentRegisterService() {
   return new StudentRegisterService(studentDao());
}
@Bean
public StudentDao studentDao() {
   return new StudentDao();
}

· StudentRegisterService 빈 객체가 생성되는 시점에 인자로 의존 객체(StudentDao) 주입

 

setter 메서드를 이용한 주입

· DBConnectionInfo 빈 객체를 생성하는 코드를 작성한다.

@Bean
public DBConnectionInfo dev_DBConnectionInfoDev() {
    DBConnectionInfo dbConnectionInfo = new DBConnectionInfo();
    dbConnectionInfo.setUrl("000.000.000.000");
    dbConnectionInfo.setUserId("admin");
    dbConnectionInfo.setUserPw("0000");

    return dbConnectionInfo;
}

@Bean
public DBConnectionInfo real_DBConnectionInfoDev() {
    DBConnectionInfo dbConnectionInfo = new DBConnectionInfo();
    dbConnectionInfo.setUrl("111.111.111.111");
    dbConnectionInfo.setUserId("master");
    dbConnectionInfo.setUserPw("1111");

    return dbConnectionInfo;
}

setter메서드를 사용할 때

· XML : <property> 태그 이용

· Java : 객체 생성 후 생성된 객체의 setter 메서드를 직접 호출

- 객체의 타입이 List와 Map 타입인 경우 : 빈 객체의 property를 초기화하면 된다.

applicationContext.xml MemberConfig.java
<bean id="dev_DBConnectionInfoDev"
class="ch06_pjt_01.ems.member.DBConnectionInfo">
   <property name="url" value="000.000.000.000" />
   <property name="userId" value="admin" />
   <property name="userPw" value="0000" />
</bean>
@Bean
public DBConnectionInfo dev_DBConnectionInfoDev() {
   DBConnectionInfo dbConnectionInfo = new DBConnectionInfo();
   dbConnectionInfo.setUrl("000.000.000.000");
   dbConnectionInfo.setUserId("admin");
   dbConnectionInfo.setUserPw("0000");

   return dbConnectionInfo;
}
<bean id="real_DBConnectionInfo"
    class="ch06_pjt_01.ems.member.DBConnectionInfo">
    <property name="url" value="111.111.111.111" />
    <property name="userId" value="master" />
    <property name="userPw" value="1111" />
</bean>
@Bean
public DBConnectionInfo real_DBConnectionInfoDev() {
    DBConnectionInfo dbConnectionInfo = new DBConnectionInfo();
    dbConnectionInfo.setUrl("111.111.111.111");
    dbConnectionInfo.setUserId("master");
    dbConnectionInfo.setUserPw("1111");

    return dbConnectionInfo;
}

 

· 다음은 EMSInformationService 빈 객체를 생성하는 코드와 문법 구조이다.

package ch06_pjt_01.ems.configuration;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import ch06_pjt_01.ems.member.DBConnectionInfo;
import ch06_pjt_01.ems.member.dao.StudentDao;
import ch06_pjt_01.ems.member.service.EMSInformationService;
import ch06_pjt_01.ems.member.service.StudentRegisterService;

@Configuration
public class MemberConfig {

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

	@Bean
	public StudentRegisterService studentRegisterService() {
		return new StudentRegisterService(studentDao());
	}

	@Bean
	public DBConnectionInfo dev_DBConnectionInfoDev() {
		DBConnectionInfo dbConnectionInfo = new DBConnectionInfo();
		dbConnectionInfo.setUrl("000.000.000.000");
		dbConnectionInfo.setUserId("admin");
		dbConnectionInfo.setUserPw("0000");

		return dbConnectionInfo;
	}

	@Bean
	public DBConnectionInfo real_DBConnectionInfoDev() {
		DBConnectionInfo dbConnectionInfo = new DBConnectionInfo();
		dbConnectionInfo.setUrl("111.111.111.111");
		dbConnectionInfo.setUserId("master");
		dbConnectionInfo.setUserPw("1111");

		return dbConnectionInfo;
	}

	@Bean
	public EMSInformationService eMSInformationService() {
		EMSInformationService emsInformationService = new EMSInformationService();
		emsInformationService.setInfo("Education Management System program was developed in 2022.");
		emsInformationService.setCopyRight("COPYRIGHT(C) 2022 EMS C0., LTD. ALL RIGHT RESERVED. CONTACT MASTER FOR MORE INFORMATION.");
		emsInformationService.setVer("The version is 1.0");
		emsInformationService.seteYear(2022);
		emsInformationService.seteMonth(3);
		emsInformationService.seteDay(1);
		emsInformationService.seteYear(2022);
		emsInformationService.seteMonth(4);
		emsInformationService.seteDay(30);

		List<String> developers = new ArrayList<String>();
		developers.add("Cheney.");
		developers.add("Eloy.");
		developers.add("Jasper.");
		developers.add("Dillon.");
		developers.add("Kian.");
		emsInformationService.setDevelopers(developers);

		Map<String, String> administrators = new HashMap<String, String>();
		administrators.put("Cheney", "cheney@springPjt.org");
		administrators.put("Jasper", "jasper@springPjt.org");
		emsInformationService.setAdministrators(administrators);

		Map<String, DBConnectionInfo> dbInfos = new HashMap<String, DBConnectionInfo>();
		dbInfos.put("dev", dev_DBConnectionInfoDev());
		dbInfos.put("real", real_DBConnectionInfoDev());
		emsInformationService.setDbInfos(dbInfos);

		return emsInformationService;
	}

}

■ 주입되는 의존 객체의 타입이 List인 경우 List을 이용해서 빈 객체의 프로퍼티를 초기화

applicationContext.xml MemberService.java
<property name="developers">
    <list>
        <value>Cheney.</value>
        <value>Eloy.</value>
        <value>Jasper.</value>
        <value>Dillon.</value>
        <value>Kian.</value>
    </list>
</property>
List<String> developers = new ArrayList<String>();
developers.add("Cheney.");
developers.add("Eloy.");
developers.add("Jasper.");
developers.add("Dillon.");
developers.add("Kian.");
emsInformationService.setDevelopers(developers);

■ 주입되는 의존 객체의 타입이 Map인 경우 Map을 이용해서 빈 객체의 프로퍼티를 초기화

applicationContext.xml MemberService.java
<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>
Map<String, String> administrators = new HashMap<String, String>();
administrators.put("Cheney", "cheney@springPjt.org");
administrators.put("Jasper", "jasper@springPjt.org");
emsInformationService.setAdministrators(administrators);
💡EMSInformationService의 administrators Map의 value가 String이 아닌 참조형 객체 타입인 경우?
Map<String, String> administrators = new HashMap<String, dev_DBConnectionInfoDev>();
db_Infos.put("dev", dev_DBConnectionInfoDev());
db_Infos.put("real", real_DBConnectionInfoDev());
emsInformationService.setDbInfos(dbInfos);

 

이제 InitSampleData 빈 객체를 포함한 전체 빈 객체를 생성해준다.

■ MemberConfig 전체 코드

package ch06_pjt_01.ems.configuration;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import ch06_pjt_01.ems.member.DBConnectionInfo;
import ch06_pjt_01.ems.member.dao.StudentDao;
import ch06_pjt_01.ems.member.service.EMSInformationService;
import ch06_pjt_01.ems.member.service.PrintStudentInformationService;
import ch06_pjt_01.ems.member.service.StudentAllSelectService;
import ch06_pjt_01.ems.member.service.StudentDeleteService;
import ch06_pjt_01.ems.member.service.StudentModifyService;
import ch06_pjt_01.ems.member.service.StudentRegisterService;
import ch06_pjt_01.ems.member.service.StudentSelectService;
import ch06_pjt_01.ems.utils.InitSampleData;

@Configuration
public class MemberConfig {

	@Bean
	public InitSampleData initSampleData() {
		InitSampleData initSampleData = new InitSampleData();

		String[] sNums = {"hbs001", "hbs002", "hbs003", "hbs004", "hbs005"};
		initSampleData.setsNums(sNums);

		String[] sIds = {"rabbit", "hippo", "raccoon", "elephant", "lion"};
		initSampleData.setsIds(sIds);

		String[] sPws = {"p0001", "p0002", "p0003", "p0004", "p0005"};
		initSampleData.setsPws(sPws);

		String[] sNames = {"agatha", "barbara", "chris", "doris", "elva"};
		initSampleData.setsNames(sNames);

		int[] sAges = {19, 22, 20, 27, 19};
		initSampleData.setsAges(sAges);

		char[] sGenders = {'M', 'W', 'W', 'M', 'M'};
		initSampleData.setsGenders(sGenders);

		String[] sMajors = {"English", "Korean", "French", "Philosophy", "History"};
		initSampleData.setsMajors(sMajors);

		return initSampleData;
	}

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

	@Bean
	public StudentRegisterService studentRegisterService() {
		return new StudentRegisterService(studentDao());
	}

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

	@Bean
	public StudentDeleteService studentDeleteService() {
		return new StudentDeleteService(studentDao());
	}

	@Bean
	public StudentSelectService studentSelectService() {
		return new StudentSelectService(studentDao());
	}

	@Bean
	public StudentAllSelectService studentAllSelectService() {
		return new StudentAllSelectService(studentDao());
	}

	@Bean
	public PrintStudentInformationService printStudentInformationService() {
		return new PrintStudentInformationService(studentAllSelectService());
	}

	@Bean
	public DBConnectionInfo dev_DBConnectionInfoDev() {
		DBConnectionInfo dbConnectionInfo = new DBConnectionInfo();
		dbConnectionInfo.setUrl("000.000.000.000");
		dbConnectionInfo.setUserId("admin");
		dbConnectionInfo.setUserPw("0000");

		return dbConnectionInfo;
	}

	@Bean
	public DBConnectionInfo real_DBConnectionInfoDev() {
		DBConnectionInfo dbConnectionInfo = new DBConnectionInfo();
		dbConnectionInfo.setUrl("111.111.111.111");
		dbConnectionInfo.setUserId("master");
		dbConnectionInfo.setUserPw("1111");

		return dbConnectionInfo;
	}

	@Bean
	public EMSInformationService eMSInformationService() {
		EMSInformationService emsInformationService = new EMSInformationService();
		emsInformationService.setInfo("Education Management System program was developed in 2022.");
		emsInformationService.setCopyRight("COPYRIGHT(C) 2022 EMS C0., LTD. ALL RIGHT RESERVED. CONTACT MASTER FOR MORE INFORMATION.");
		emsInformationService.setVer("The version is 1.0");
		emsInformationService.seteYear(2022);
		emsInformationService.seteMonth(3);
		emsInformationService.seteDay(1);
		emsInformationService.seteYear(2022);
		emsInformationService.seteMonth(4);
		emsInformationService.seteDay(30);

		List<String> developers = new ArrayList<String>();
		developers.add("Cheney.");
		developers.add("Eloy.");
		developers.add("Jasper.");
		developers.add("Dillon.");
		developers.add("Kian.");
		emsInformationService.setDevelopers(developers);

		Map<String, String> administrators = new HashMap<String, String>();
		administrators.put("Cheney", "cheney@springPjt.org");
		administrators.put("Jasper", "jasper@springPjt.org");
		emsInformationService.setAdministrators(administrators);

		Map<String, DBConnectionInfo> dbInfos = new HashMap<String, DBConnectionInfo>();
		dbInfos.put("dev", dev_DBConnectionInfoDev());
		dbInfos.put("real", real_DBConnectionInfoDev());
		emsInformationService.setDbInfos(dbInfos);

		return emsInformationService;
	}

}

 

스프링 컨테이너 초기화

1. ch06_pjt_01.ems  패키지의 MainClass.java 파일을 복사해서 MainClassUseConfig.java 파일을 생성해준다.

스프링 설정 파일을 기존 XML파일(applicationContext.xml)에서 애너테이션을 이용한 Java파일(MemberConfig.java)로 변경된 상태이다.

 

2. MainClassUseConfig.java을 열어 스프링 컨테이너를 초기화하는 부분을 MemberConfig.class로 수정해준다.

수정 수정
GenericXmlApplicationContext ctx = 
    new GenericXmlApplicationContext("classpath:appCtxImport.xml");
AnnotationConfigApplicationContext ctx = 
    new AnnotationConfigApplicationContext(MemberConfig.class);
초기화 클래스
GenericXmlApplicationContext
초기화 클래스
AnnotationConfigApplicationContext

실행 결과