스프링 5 프로그래밍 입문/3.스프링 DI
3.6 스프링의 DI 설정
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();
}