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 |
'Spring & Springboot > 올인원 스프링 프레임워크' 카테고리의 다른 글
스프링 MVC를 이용한 웹 서비스 프로젝트 (0) | 2023.09.20 |
---|---|
Java 파일 분리와 @Import 애너테이션 (0) | 2023.09.20 |
스마트폰 연락처 -2 (0) | 2023.09.19 |
스마트폰 연락처 -1 (0) | 2023.09.17 |
학사 관리 시스템 -4 (0) | 2023.09.14 |