본문 바로가기
학습/SPRING

06. 스프링 - 두 개 이상의 설정 파일 사용하기

by Elfen Lied 2022. 12. 21.
반응형

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

댓글