TIL


ばねDI


依存とは?

  • DIは依存注入である.
  • 依存:オブジェクト間の依存を表す
  • MemberRegisterService MemberDaoクラスメソッド
  • を使用
  • は、あるクラスが別のクラスを実行する方法においてこの
  • に依存することを示す.
    依存
  • は、変更の影響を受ける関係
  • を意味する.
  • に依存するターゲットを取得するには、依存オブジェクト
  • を直接作成します.
  • private MemberDao memberDao = new MemberDao();
  • クラスで依存オブジェクトを直接作成することは容易であるが、メンテナンスの観点からはあまり良くないため、DIを使用して依存オブジェクト
  • を取得する.
    package chap02;
    
    public class MemberRegisterService {
    		private MemberDao memberDao = new MemberDao();
    		
    		public void regist(RegisterRequest req) {
    			//이메일로 회원 데이터 조회
    			Member member = memberDao.selectByEmail(req.getEmail());
    			
    			if(member != null) {
    				//같은 이메일을 가진 회원이 존재하면
    				throw new DuplicateMemberException("에러");
    			}
    			//같은 이메일을 가진 회원 없으면
    			Member newMember = new Member();
    			memberDao.insert();
    		}
    }
    

    DIによる依存関係の処理

  • DIは、直接依存オブジェクトを作成するのではなく、
  • を使用して依存オブジェクトを受信する
  • DIを使用すると、変更の柔軟性が生まれます.
  • package spring;
    
    public class MemberRegisterService {
    		
    		public MemberDao memberDao;
    		
    		
    		// 의존 객체를 전달 받아서 주입
    		// 생성자를 통해 의존하고있는 객체를 주입 받은 것
    		public MemberRegisterService(MemberDao memberDao) {
    			this.memberDao = memberDao;
    		}
    		
    		public void regist(RegisterRequest req) {
    			//이메일로 회원 데이터 조회
    			Member member = memberDao.selectByEmail(req.getEmail());
    			
    			if(member != null) {
    				//같은 이메일을 가진 회원이 존재하면
    				throw new DuplicateMemberException("에러");
    			}
    			//같은 이메일을 가진 회원 없으면
    			Member newMember = new Member();
    			memberDao.insert();
    		}
    }
    

    サンプルアイテム


    メンバーデータ関連クラス

    package com.jisung.spring;
    
    import java.time.LocalDateTime;
    
    public class Member {
    	
    	private Long id;
    	private String email;
    	private String password;
    	private String name;
    	private LocalDateTime registerDateTime;
    	
    	public Member(String email, String password, String name, LocalDateTime registerDateTime) {
    		this.email = email;
    		this.password = password;
    		this.name = name;
    		this.registerDateTime = registerDateTime;
    	}
    
    	public Long getId() {
    		return id;
    	}
    
    	public void setId(Long id) {
    		this.id = id;
    	}
    
    	public String getEmail() {
    		return email;
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public LocalDateTime getRegisterDateTime() {
    		return registerDateTime;
    	}
    	
    	//회원 비밀번호 변경
    	public void changePassword(String oldPassword, String newPassword) {
    		if(!password.equals(oldPassword)) {
    			throw new WrongIdPasswordException();
    		}
    		this.password = newPassword;
    	}
    }
    
    package com.jisung.spring;
    
    //이전비밀번호와 현재비밀번호비교해서 오류발생
    public class WrongIdPasswordException extends RuntimeException{
    	
    }
    package com.jisung.spring;
    
    import java.util.HashMap;
    import java.util.Map;
    
    //회원 정보 저장
    public class MemberDao {
    	private static long nextId = 0;
    	
    	private Map<String, Member> map = new HashMap<String, Member>();
    	
    	public Member selectByEmail(String email) {
    		return map.get(email);
    	}
    	
    	public void insert(Member member) {
    		member.setId(++nextId);
    		map.put(member.getEmail(),member);
    	}
    	
    	public void update(Member member) {
    		map.put(member.getEmail(), member);
    	}
    }

    会員登録処理関連カテゴリ

    package com.jisung.spring;
    
    //동일 이메일을 갖고 있는 회원이 존재하면 예외발생
    public class DuplicateMemberException extends RuntimeException{
    	public DuplicateMemberException(String message) {
    		super(message);
    	}
    }
    package com.jisung.spring;
    
    //회원가입을 처리할 때 필요한 이메일,암호,이름 데이터를 담고있는 클래스
    public class RegisterRequest {
    	private String email;
    	private String password;
    	private String confirmPassword;
    	private String name;
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	public String getConfirmPassword() {
    		return confirmPassword;
    	}
    	public void setConfirmPassword(String confirmPassword) {
    		this.confirmPassword = confirmPassword;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	//비밀번호와 비밀번호 확인이 같은지
    	public boolean isPasswordEqualToConfirmPassword() {
    		return password.equals(confirmPassword);
    	}
    }
    
    package com.jisung.spring;
    
    import java.time.LocalDateTime;
    
    //회원등록 클래스
    public class MemberRegisterService {
    	public MemberDao memberDao;
    	
    	
    	// 의존 객체를 전달 받아서 주입
    	// 생성자를 통해 의존하고있는 객체를 주입 받은 것
    	public MemberRegisterService(MemberDao memberDao) {
    		this.memberDao = memberDao;
    	}
    	
    	public Long regist(RegisterRequest req) {
    		//이메일로 회원 데이터 조회
    		Member member = memberDao.selectByEmail(req.getEmail());
    		
    		if(member != null) {
    			//같은 이메일을 가진 회원이 존재하면
    			throw new DuplicateMemberException("dup email "+ req.getEmail());
    		}
    		//같은 이메일을 가진 회원 없으면
    		Member newMember = new Member(req.getEmail(), req.getPassword(), req.getName(), LocalDateTime.now());
    		memberDao.insert(newMember);
    		return newMember.getId();
    	}
    }
    

    パスワードの変更に関連するクラス

    package com.jisung.spring;
    
    //비밀번호 변경 클래스
    public class ChangePasswordService {
    	private MemberDao memberDao;
    	
    	public void changePassword(String email,String oldPwd, String newPwd) {
    		Member member = memberDao.selectByEmail(email); // 이메일을 통해 회원 정보 가져옴
    		
    		//중복된 회원이 있으면
    		if(member == null) {
    			throw new MemberNotFoundException();
    		}
    		//비밀번호 변경
    		member.changePassword(oldPwd, newPwd);
    		//회원정보 업데이트
    		memberDao.update(member);
    	}
    
    	//의존객체 주입
    	public void setMemberDao(MemberDao memberDao) {
    		this.memberDao = memberDao;
    	}
    	
    	
    }
    
    package com.jisung.spring;
    
    //이메일에 해당하는 member가 존재하지 않을 때
    public class MemberNotFoundException extends RuntimeException {
    
    }
    

    オブジェクトアセンブリ

  • メインメソッドからオブジェクトを注入するのも良い方法
  • である.
  • マスターメソッドでは、オブジェクトを注入せずにオブジェクトを注入するための個別のクラスが作成されます.
  • 組立機類
  • package assembler;
    
    import com.jisung.spring.ChangePasswordService;
    import com.jisung.spring.MemberDao;
    import com.jisung.spring.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;
    	}
    	
    	
    }

    アセンブリの使用例

    package main;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import com.jisung.spring.ChangePasswordService;
    import com.jisung.spring.DuplicateMemberException;
    import com.jisung.spring.MemberNotFoundException;
    import com.jisung.spring.MemberRegisterService;
    import com.jisung.spring.RegisterRequest;
    import com.jisung.spring.WrongIdPasswordException;
    
    import assembler.Assembler;
    
    public class MainForAssembler {
    	
    	private static Assembler assembler = new Assembler();
    	
    	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(); // 한줄입력
    			//exit입력받으면 종료
    			if(command.equalsIgnoreCase("exit")) {
    				System.out.println("종료합니다.");
    				break;
    			}
    			//new로 시작하면 
    			if(command.startsWith("new ")) {
    				processNewCommand(command.split(" "));
    				continue;
    			}
    			//change로 시작하면..
    			if(command.startsWith("change ")) {
    				processChangeCommand(command.split(" "));
    				continue;
    			}
    			printHelp();
    		}
    	}
    	
    	private static void processNewCommand(String[] arg) {
    		if(arg.length != 5) {
    			printHelp();
    			return;
    		}
    		MemberRegisterService regSvc = assembler.getRegSvc();
    		RegisterRequest req = new RegisterRequest();
    		req.setEmail(arg[1]);
    		req.setName(arg[2]);
    		req.setPassword(arg[3]);
    		req.setConfirmPassword(arg[4]);
    		
    		if(!req.isPasswordEqualToConfirmPassword()) {
    			System.out.println("일치하지 않음");
    			return;
    		}
    		
    		try {
    			regSvc.regist(req);
    			System.out.println("등록했습니다.");
    			
    		} catch (DuplicateMemberException e) {
    			System.out.println("이미 존재하는 이메일 입니다.");
    		}
    	}
    	
    	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() {
    		System.out.println("잘못된 명령입니다!");
    	}
    }