반응형
05번 글 ( https://simfairy.tistory.com/281 ) 이어서 함
- 정리
3. 두 개 이상의 설정 파일 사용
- 애너테이션 방식
- config.test01.AppConfig1
- MemberDao 빈
- MemberPrinter 빈
- config.test01.AppConfig2
- 나머지 빈
- main.MainForSpring
- 두 개의 설정파일을 ACAC객체에 전달
- XML 방식
- src/main/resources/test01
4. @Import 애너테이션, <import>태그 사용
- @Import애너테이션
- config.test02.AppConfig : AppConfig2 설정을 불러옴
- config.test02.AppConfig2
- main.MainForSpring
- ctx = ctx = new AnnotationConfigApplicationContext(AppConfig.class)
- <import>태그
- src/main/resources/test02/conf.xml : conf2.xml 설정을 불러옴
- src/main/resources/test02/conf2.xml
- main.MainForSpring
- ctx = new GenericXmlApplicationContext("classpath:test02/conf.xml");
- config 패키지 안에 test01 패키지 AppConfig1, AppConfig2 클래스 생성
- AppConfig1
기존에 AppCtx 클래스에서 가져옴
package config.test01;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.MemberDao;
import spring.MemberPrinter;
@Configuration
public class AppConfig1 {
@Bean
public MemberDao memberDao() {
return new MemberDao();
}
@Bean
public MemberPrinter memberPrinter() {
return new MemberPrinter();
}
}
- AppConfig2
기존에 AppCtx 클래스에서 가져옴
package config.test01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.ChangePasswordService;
import spring.MemberDao;
import spring.MemberInfoPrinter;
import spring.MemberListPrinter;
import spring.MemberPrinter;
import spring.MemberRegisterService;
import spring.VersionPrinter;
@Configuration
public class AppConfig2 {
@Autowired
private MemberDao memberDao;
@Autowired
private MemberPrinter memberPrinter;
@Bean
public MemberRegisterService memberRegSvc() {
return new MemberRegisterService(memberDao); // 생성자 주입
}
@Bean
public ChangePasswordService changePwdSvc() {
ChangePasswordService pwdSvc = new ChangePasswordService();
pwdSvc.setMemberDao(memberDao); // 세터(수정자) 주입
return pwdSvc;
}
@Bean
public MemberListPrinter memberListPrinter() {
// 생성자 주입
return new MemberListPrinter(memberDao, memberPrinter);
}
@Bean
public MemberInfoPrinter memberInfoPrinter() {
MemberInfoPrinter memberInfoPrinter = new MemberInfoPrinter();
// 세터(수정자) 주입, Setter DI(Dependency Injection)
memberInfoPrinter.setMemberDao(memberDao);
memberInfoPrinter.setPrinter(memberPrinter);
return memberInfoPrinter;
}
@Bean
public VersionPrinter versionPrinter() {
return new VersionPrinter().setMajorVersion(5).setMinorVersion(0);
}
}
- main 패키지 MainForSpring
package main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import assembler.Assembler;
import config.AppCtx;
import config.test01.AppConfig1;
import config.test01.AppConfig2;
import spring.ChangePasswordService;
import spring.DuplicateMemberException;
import spring.MemberInfoPrinter;
import spring.MemberListPrinter;
import spring.MemberNotFoundException;
import spring.MemberRegisterService;
import spring.RegisterRequest;
import spring.VersionPrinter;
import spring.WrongIdPasswordException;
public class MainForSpring {
// 애노테이션 방식, XML 방식 두가지 다 사용하기 위해서 선언함
// 애노테이션 방식만 쓸거면 작성할 필요없음
private static ApplicationContext ctx = null;
public static void main(String[] args) throws IOException {
// 애노테이션 방식
// ctx = new AnnotationConfigApplicationContext(AppCtx.class);
// 두 개 이상의 설정 사용
ctx = new AnnotationConfigApplicationContext(AppConfig1.class, AppConfig2.class);
// XML 방식
// ctx = new GenericXmlApplicationContext("classpath:appCtx.xml");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("명령어를 입력하세요");
String command = reader.readLine(); // 예외는 던지기
if(command.equalsIgnoreCase("exit")) {
System.out.println("프로그램이 종료됩니다");
break;
} else if(command.startsWith("new ")) { // 회원가입
processNewCommand(command.split(" "));
} else if(command.startsWith("change ")) { // 비밀번호 변경
processChangeCommand(command.split(" "));
} else if(command.equals("list")) { // 모든 회원 목록
processListCommand();
} else if(command.startsWith("info")) {
processInfoCommand(command.split(" "));
} else if(command.equals("version")) {
processVersionCommand();
}
else {
printHelp(); // 사용법
}
}
}
private static void processNewCommand(String[] arg) { // 회원가입
if(arg.length != 5) {
printHelp();
return;
}
// {new, 이메일, 이름, 암호, 암호확인}
RegisterRequest req = new RegisterRequest();
req.setEmail(arg[1]);
req.setName(arg[2]);
req.setPassword(arg[3]);
req.setConfirmPassword(arg[4]);
// 스프링 컨테이너에서 MemberRegisterService 객체를 가져옴
MemberRegisterService regSvc = ctx.getBean("memberRegSvc", MemberRegisterService.class);
// 비밀번호 일치 확인
if(!req.isPasswordEqualToConfirmPassword()) { // 암호와 암호확인이 일치하면
System.out.println("암호와 암호확인이 일치하지 않습니다");
return;
}
try {
regSvc.register(req);
System.out.println("등록했습니다.\n");
} catch (DuplicateMemberException e) {
System.out.println("이미 존재하는 이메일입니다");
}
}
private static void processChangeCommand(String[] arg) { // 비밀번호 변경
if(arg.length != 4) {
printHelp();
return;
}
// {change, 이메일, 현재비번, 변경비번}
// 어셈블러 컨테이너에서 ChangePasswordService 객체를 가져옴
ChangePasswordService pwdSvc = ctx.getBean("changePwdSvc", ChangePasswordService.class);
try {
pwdSvc.changePassword(arg[1], arg[2], arg[3]);
System.out.println("암호를 변경했습니다.\n");
} catch (MemberNotFoundException e) {
System.out.println("이메일이 존재하지 않습니다.\n");
} catch (WrongIdPasswordException e) {
System.out.println("이메일과 암호가 일치하지 않습니다.\n");
}
}
private static void printHelp() { // 사용법
System.out.println();
System.out.println("잘못된 명령입니다. 아래 명령어 사용법을 확인하세요");
System.out.println("명령어 사용법 : ");
System.out.println("모든회원목록 : list");
System.out.println("신규회원 : new 이메일 이름 암호 암호확인");
System.out.println("암호변경 : change 이메일 현재비번 변경비번");
System.out.println("회원상세 : info 이메일");
System.out.println("버전확인 : version");
System.out.println();
}
private static void processListCommand() {
MemberListPrinter listPrinter = ctx.getBean("memberListPrinter", MemberListPrinter.class);
listPrinter.printAll();
}
private static void processInfoCommand(String[] arg) {
if(arg.length != 2) { // {info, 이메일}
printHelp();
return;
}
MemberInfoPrinter infoPrinter = ctx.getBean("memberInfoPrinter", MemberInfoPrinter.class);
infoPrinter.printMemberInfo(arg[1]);
}
private static void processVersionCommand() {
VersionPrinter version = ctx.getBean(VersionPrinter.class);
version.print();
}
}
- src / main / resources / test01 폴더 생성
ctrl + n 에서 spring 검색
Spring Bean Confi~ 선택후 conf1.xml, conf2.xml 생성
- conf1.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="memberDao" class="spring.MemberDao" />
<bean id="memberPrinter" class="spring.MemberPrinter" />
</beans>
- conf2.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="memberRegSvc" class="spring.MemberRegisterService">
<constructor-arg ref="memberDao" />
</bean>
<bean id="changePwdSvc" class="spring.ChangePasswordService">
<property name="memberDao" ref="memberDao" />
</bean>
<bean id="memberListPrinter" class="spring.MemberListPrinter">
<constructor-arg ref="memberDao" />
<constructor-arg ref="memberPrinter" />
</bean>
<bean id="memberInfoPrinter" class="spring.MemberInfoPrinter">
<property name="memberDao" ref="memberDao" />
<property name="printer" ref="memberPrinter" />
</bean>
<bean id="versionPrinter" class="spring.VersionPrinter">
<property name="majorVersion" value="5" />
<property name="minorVersion" value="0" />
</bean>
</beans>
- main 패키지 MainForSpring
public class MainForSpring {
`
`
`
// 두 개 이상의 설정 사용
// ctx = new AnnotationConfigApplicationContext(AppConfig1.class, AppConfig2.class);
ctx = new GenericXmlApplicationContext("classpath:test01/conf1.xml", "classpath:test01/conf2.xml");
- config 패키지의 test01 을 복사해서 붙여넣고 test02로 만든다
test02 패키지 안에 있는 AppConfig1을 AppConfig로 이름을 바꿈
package config.test02;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import spring.MemberDao;
import spring.MemberPrinter;
@Configuration
@Import(value = {AppConfig2.class})
public class AppConfig {
@Bean
public MemberDao memberDao() {
return new MemberDao();
}
@Bean
public MemberPrinter memberPrinter() {
return new MemberPrinter();
}
}
- AppConfig2
package config.test02;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.ChangePasswordService;
import spring.MemberDao;
import spring.MemberInfoPrinter;
import spring.MemberListPrinter;
import spring.MemberPrinter;
import spring.MemberRegisterService;
import spring.VersionPrinter;
@Configuration
public class AppConfig2 {
@Autowired
private MemberDao memberDao;
@Autowired
private MemberPrinter memberPrinter;
@Bean
public MemberRegisterService membaerRegSvc() {
return new MemberRegisterService(memberDao); // 생성자 주입
}
@Bean
public ChangePasswordService changePwdSvc() {
ChangePasswordService pwdSvc = new ChangePasswordService();
pwdSvc.setMemberDao(memberDao); // 세터(수정자) 주입
return pwdSvc;
}
@Bean
public MemberListPrinter memberListPrinter() {
// 생성자 주입
return new MemberListPrinter(memberDao, memberPrinter);
}
@Bean
public MemberInfoPrinter memberInfoPrinter() {
MemberInfoPrinter memberInfoPrinter = new MemberInfoPrinter();
// 세터(수정자) 주입, Setter DI(Dependency Injection)
memberInfoPrinter.setMemberDao(memberDao);
memberInfoPrinter.setPrinter(memberPrinter);
return memberInfoPrinter;
}
@Bean
public VersionPrinter versionPrinter() {
return new VersionPrinter().setMajorVersion(5).setMinorVersion(0);
}
}
- main 패키지 MainForSpring
// 애노테이션 방식
// ctx = new AnnotationConfigApplicationContext(AppCtx.class);
// 두 개 이상의 설정 사용
// ctx = new AnnotationConfigApplicationContext(AppConfig1.class, AppConfig2.class);
ctx = new GenericXmlApplicationContext("classpath:test01/conf1.xml", "classpath:test01/conf2.xml");
// XML 방식
// ctx = new GenericXmlApplicationContext("classpath:appCtx.xml");
// @Import 애너테이션 사용
// ctx = new AnnotationConfigApplicationContext(AppConfig.class);
// <import> 태그 사용
ctx = new GenericXmlApplicationContext("classpath:test02/conf.xml");
반응형
'학습 > SPRING' 카테고리의 다른 글
13. 스프링 - Paging (0) | 2022.12.30 |
---|---|
07. 스프링 - 의존 자동 주입 (0) | 2022.12.22 |
04. 스프링 DI : 생성자 방식 (0) | 2022.12.21 |
03. 스프링 DI - 애노테이션 방식, XML 방식 (0) | 2022.12.19 |
01~02 스프링 시작하기 (0) | 2022.12.19 |
댓글