Spring 객체 조립기 (assembler)

이주희·2022년 7월 30일
0

spring

목록 보기
4/16
post-custom-banner

조립기란?

의존객체를 주입해주는 클래스를 따로 작성하는 것

코드

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()으로 객체를 이용한다

post-custom-banner

0개의 댓글