hp0724 2023. 8. 8. 22:06

스프링은 Assembler 클래스의 생성자 코드처럼 필요한 객체를 생성하고 생성한 객체에 의존을 주입한다.

3.6.1 스프링을 이용한 객체 조립과 사용

@Configuration
public class AppCtx {
	@Bean
	pulbic MemberDao memberDao() {
		return new MemberDao();
	}
	
	@Bean 
	public MemberRegisterService memberRegSvc() {
		return new MemberRegisterService(memberDao());
	}
	@Bean 
	public ChangePasswordService changePwdSvc() {
		ChangePasswordService pwdSvc = new ChangePasswordService();
		pwdSvc.setMemberDao(memberDao());
		return pwdSvc;
	}
}

@Configuration : 스프링 설정 클래스

@Bean : 해당 메서드가 생성한 객체를 스프링 빈이라고 설정

MemberRegisterService(memberDao()); 생성자를 통해 주입

pwdSvc.setMemberDao(memberDao()); setter를 통해 주입

설정 클래스를 만들고 끝이 아니다. 객체를 생성하고 의존 객체를 주입하는것은 스프링 컨테이너 이므로 설정 클래스를 이용하여 컨테이너를 생성해야 한다 .

AnnotationConfigApplicationContext 클래스를 이용해서 스프링 컨테이너 생성

ctx = new AnnotationConfigApplicationContext(AppCtx.class);

스프링 컨테이너 생성 Assemlber는 직접 객체를 생성 AnnotationConfigApplicationContext 는 설정파일로부터 생성할 객체와 의존 주입 대상을 정한다.

MemberRegisterService regSvc = ctx.getBean("memberRegSvc",MemberRegisterService.class);

ChangePasswordService changePwdSvc = 
					 ctx.getBean("changePwdSvc",ChangePasswordService.class);

3.6.2 DI 방식 1 : 생성자 방식

public class MemberPrinter {
	
	public void print(Member member) {
		System.out.printf(
				"회원 정보 : 아이디=%d , 이메일=%s , 이름=%s ,등록일 =%tF\n",
				member.getId(),member.getEmail(),member.getName(),member.getRegisterDateTime());
		
	}

}
public class MemberListPrinter {
	private MemberDao memberDao ;
	private MemberPrinter printer; 
	
	public MemberListPrinter(MemberDao memberDao, MemberPrinter printer) {
		this.memberDao = memberDao;
		this.printer = printer;
	}
	
	public void printAll( ) {
		Collection<Member> members = memberDao.selectAll();
		members.forEach(m->printer.print(m));
	}
	
}
@Bean 
	public MemberPrinter memberPrinter() {
		return new MemberPrinter();
	}
	
	@Bean 
	public MemberListPrinter memberListPrinter() {
		return new MemberListPrinter(memberDao(), memberPrinter());
	}

MainForSpring

private static void processListCommand() {
			MemberListPrinter listPrinter = 
					ctx.getBean("memberListPrinter",MemberListPrinter.class);
			listPrinter.printAll();
		
		}

6.3 DI 방식 2: 세터 메서드 방식

생성자 외에 세터 메서드를 이용해서 객체를 주입받기도 한다.

일반적인 세터 메서드는 자바빈 규칙에 따라 작성

  • 메서드 이름이 set 으로 시작
  • set 뒤에 첫 글자는 대문자
  • 파라미터 1개
  • 리턴 타입 void
public class MemberInfoPrinter {
	private MemberDao memDao; 
	private MemberPrinter printer;
	
	public void printMemberInfo(String email ) {
		Member member = memDao.selectByEmail(email);
		if (member == null) {
			System.out.println("데이터 없음\n");
			return ;
			
		}
		printer.print(member);
		System.out.println();
	}

	public void setMemDao(MemberDao memDao) {
		this.memDao = memDao;
	}

	public void setPritner(MemberPrinter pritner) {
		this.printer = pritner;
	}
	
	
}

AppCtx

@Bean 
	public MemberInfoPrinter memberinfoPrinter() {
		MemberInfoPrinter memberInfoPrinter = new MemberInfoPrinter();
		memberInfoPrinter.setMemDao(memberDao());
		memberInfoPrinter.setPritner(memberPrinter());
		return memberInfoPrinter;
		
	}

MainForSpirng

private static void processInfoCommand(String[] arg) {
			if(arg.length!=2) {
				printHelp();
				return;
			}
			MemberInfoPrinter memberInfoPrinter = ctx.getBean("memberInfoPrinter",MemberInfoPrinter.class);
			memberInfoPrinter.printMemberInfo(arg[1]);

생성자 vs 세터 메서드

  • 생성자 방식 : 빈 객체를 생성하는 시점에 모든 의존 객체가 주입된다.
  • setter 메서드 방식 : 세터 메서드 이름을 통해 어떤 의존 객체가 주입되는지 알수있다.

6.4 기본 데이터 타입 값 설정

public class VersionPrinter {
	private int majorVersion;
	private int minorVersion;
	
	public void print() {
		System.out.printf("이 프로그램의 버전은 %d.%d입니다 \n\n",
				majorVersion,minorVersion);
	}

	public void setMajorVersion(int majorVersion) {
		this.majorVersion = majorVersion;
	}

	public void setMinorVersion(int minorVersion) {
		this.minorVersion = minorVersion;
	}
	
}
private static void processVersionCommand() {
			VersionPrinter versionPrinter = 
					ctx.getBean("versionPrinter",VersionPrinter.class);
			versionPrinter.print();
		
		}