3. 스프링 DI(Dependency Injection) #2 객체 조립

2021. 7. 2. 12:34JAVA/Spring

본 글은 최범균 저자의 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 도서의 내용을 복습하기 위해 작성된 글입니다.

4. 예제 프로젝트 만들기

예제 프로젝트 클래스 구성

  • 회원 데이터 관련 클래스
    • Member
    • WrongIdPasswordException
    • MemberDao
  • 회원 가입 처리 관련 클래스
    • DuplicateMemberException
    • RegisterRequest
    • MemberRegisterService
  • 암호 변경 관련 클래스
    • MemberNotFoundException
    • ChangePasswordService

예제 프로젝트 클래스 소스코드

https://github.com/yonghwankim-dev/spring5/tree/master/sp5-chap03/src/main/java/spring

 

yonghwankim-dev/spring5

최범균 저, 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 예제. Contribute to yonghwankim-dev/spring5 development by creating an account on GitHub.

github.com

 

5. 객체 조립기

앞서 DI(Dependency Injection)을 설명할 대 객체 생성에 사용할 클래스를 변경하기 위해(그 객체를 사용하는 코드를 변경하지 않고) 객체를 주입하는 코드 한 곳만 변경하면 된다고 하였다. 그렇다면 실제 객체를 생성하는 코드는 어디에 있을까? 답은 메인 메서드에서 객체를 생성하면 될 것이다.

public class Main{
	public static void main(String[] args){
    	MemberDao memberDao = new MemberDao();
        MemberRegisterService regSvc = new MemberRegisterService(memberDao);
        ChangePasswordService pwdSvc = new ChangePasswordService();
        pwdSvc.setMemberDao(memberDao);
        ...// regSvc와 pwdSvc를 사용하는 코드
    }
}

main 메서드에서 의존 대상 객체를 생성하고 주입하는 방법도 나쁘지 않다. 이 방법보다좀 더 나은 방법은 객체를 생성하고 의존 객체를 주입해주는 클래스를 따로 작성하는 것이다. 의존 객체를 주입한다는 것은 서로 다른 두 객체를 조립한다고 생각할 수 있는데, 이런 의미에서 이 클래스를 조립기라고도 표현한다.

 

조립기 클래스 정의

package assembler;

import spring.ChangePasswordService;
import spring.MemberDao;
import 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 getMemberRegisterService() {
		return regSvc;
	}

	public ChangePasswordService getChangePasswordService() {
		return pwdSvc;
	}	
}

위와 같이 Assembler 클래스의 생성자를 통해서 MemberDao 객체를 생성하고 의존 주입을 수행한다.

 

조립기(Assembler) 클래스의 생성 및 사용

Assembler assembler = new Assembler();
ChangePasswordService changePwdSvc = assembler.getChangePasswordService();
changePwdSvc.changePassword("madvirus@madvirus.net","1234","newpwd");

 

MemberDao -> CachedMemberDao 클래스의 변경

public Assembler()
{
	memberDao = new CachedMemberDao();
	regSvc = new MemberRegisterService(memberDao);
	pwdSvc = new ChangePasswordService();
	pwdSvc.setMemberDao(memberDao);
}

 

5.1 조립기 사용 예제

MainForAssembler.java 메인 클래스 작성

https://github.com/yonghwankim-dev/spring5/blob/master/sp5-chap03/src/main/java/spring/MainForAssembler.java

 

yonghwankim-dev/spring5

최범균 저, 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 예제. Contribute to yonghwankim-dev/spring5 development by creating an account on GitHub.

github.com

 

실행결과

 

References

초보 웹 개발자를 위한 스프링5 프로그래밍 입문, 최범균 저