의존객체를 주입해주는 클래스를 따로 작성하는 것
package assembler;
import new3.ChangePasswordService;
import new3.MemberDao;
import new3.MemberRegisterService;
public class Assembler {
private MemberDao memberDao;
private MemberRegisterService regSvc;
private ChangePasswordService pwdSvc;
// 객체 할당
public Assembler() {
memberDao = new MemberDao();
regSvc = new MemberRegisterService(memberDao);
pwdSvc = new ChangePasswordService();
pwdSvc.setMemberDao(memberDao);
}
public MemberDao getMemberDao() {
return memberDao;
}
public MemberRegisterService getRegSvc() {
return regSvc;
}
public ChangePasswordService getPwdSvc() {
return pwdSvc;
}
}
Assembler 생성자에서 MemberRegisterService 객체는 MemberDao 객체를 주입받고, ChangePasswordService는 setter을 통해 주입받음
위의 Assembler 객체를 생성한 후, get 메서드를 통해 필요한 객체 구하고, 사용한다.
package main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import assembler.Assembler;
import new3.ChangePasswordService;
import new3.MemberRegisterService;
import new3.DuplicateMemberException;
import new3.MemberNotFoundException;
import new3.RegisterRequest;
import new3.WrongIdPasswordException;
public class Main {
public static void main(String[] args) throws IOException {
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;
}
if(command.startsWith("new ")){
processNewCommand(command.split(" "));
continue;
}else if(command.startsWith("change ")){
processChangeCommand(command.split(" "));
continue;
}
printHelp();
}
}
private static Assembler assembler = new Assembler(); // 객체 조립기 생성
//문자열을 입력받아 순서대로 회원가입 진행
private static void processNewCommand(String[] arg){
if(arg.length!=5){
printHelp();
return;
}
MemberRegisterService regSvc = assembler.getRegSvc(); // 조립기의 regSvc 가져옴
RegisterRequest req = new RegisterRequest();
req.setEmail(arg[1]);
req.setName(arg[2]);
req.setPassword(arg[3]);
req.setConfirmPassword(arg[4]);
if(!req.isPasswordEqualComfirmPassword()){
System.out.println("암호 불일치\n");
return;
}
try{
regSvc.regist(req); // req 받아서 회원 등록 성공시 id, 실패시 null 반환
System.out.println("등록되었습니다\n");
}catch(DuplicateMemberException e){ // 이메일 중복 에러 발생
System.out.println("이미 존재하는 이메일입니다\n");
}catch(WrongIdPasswordException e){
System.out.println("이메일과 암호가 일치하지 않습니다\n");
}
}
private static void processChangeCommand(String[] arg){
if(arg.length!=4){
printHelp();
return;
}
ChangePasswordService changePwdSvc = assembler.getPwdSvc();
try{
changePwdSvc.changePassword(arg[1],arg[2],arg[3]);
System.out.println("암호 변경 완료");
}catch(MemberNotFoundException e){
System.out.println("존재하지 않는 이메일");
}catch(WrongIdPasswordException e){
System.out.println("이메일과 암호가 일치하지 않음");
}
}
private static void printHelp(){
}
}
스프링은 기본적으로 DI를 지원하는 조립기를 사용
package main;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import new3.ChangePasswordService;
import new3.MemberDao;
import new3.MemberRegisterService;
@Configuration // 스프링 설정 클래스를 의미
public class AppCtx {
@Bean //스프링에 빈 객체로 등록
public MemberDao memberDao(){ // memberDao 라는 이름으로 스프링에 등록됨
return new MemberDao();
}
@Bean
public MemberRegisterService memberRegisterSvc(){
return new MemberRegisterService(memberDao()); // DI
}
@Bean
public ChangePasswordService changePasswordSvc(){
ChangePasswordService pwdSvc = new ChangePasswordService();
pwdSvc.setMemberDao(memberDao());
return pwdSvc;
}
}
위의 조립기를 작성 후 ctx = new AnnotationConfigApplicationContext(AppCtx.class);
로 컨테이너 생성,
getBean()
으로 객체를 이용한다