bong-u/til

Spring 개념 - DI (Dependency Injection)

수정일 : 2024-11-15

의존 주입 (DI : Dependency Injection)을 하는 방법

  1. Assembler라는 별도의 클래스 생성

     1public class Assembler {
     2    private MemberDao memberDao;
     3    private MemberRegisterService regSvc;
     4
     5    public Assembler() {
     6        memberDao = new MemberDao();
     7        regSvc = new MemberRegisterService(memberDao);
     8    }
     9
    10    public MemberDao getMemberDao() {
    11        return memberDao;
    12    }
    13
    14    public MemberRegisterService getMemberRegisterService() {
    15        return regSvc;
    16    }
    17}
    
  2. Spring에서 지원하는 DI 사용

     1@Configuration
     2public class AppCtx {
     3    @Bean
     4    public MemberDao memberDao() {
     5        return new MemberDao();
     6    }
     7    @Bean
     8    public MemberRegisterService memberRegSvc() {
     9        return new MemberRegisterService(memberDao());
    10    }
    11}
    

DI 방식

  1. Constructor 방식
    1@Bean
    2    public MemberListPrinter listPrinter() {
    3        return new MemberListPrinter(memberDao(), memberPrinter());
    4    }
    
  2. Setter method 방식
    1@Bean
    2public MemberInfoPrinter infoPrinter() {
    3	MemberInfoPrinter infoPrinter = new MemberInfoPrinter();
    4	infoPrinter.setMemberDao(memberDao());
    5	infoPrinter.setPrinter(memberPrinter());
    6	return infoPrinter;
    7}
    
  • constructor 방식이 훨씬 깔끔해보인다.
  • java bean에서는 getter와 setter를 이용해서 property를 정의한다고 한다.

두 개 이상의 Configuration 파일 사용 : @Autowired 활용

  • AppConf1.java

    1@Configuration
    2public class AppConf1 {
    3	...
    4}
    
    • AppConf2.java
     1import org.springframework.beans.factory.annotation.Autowired;
     2
     3@Configuration
     4public class AppConf2 {
     5	@Autowired
     6	private MemberDao memberDao;
     7	@Autowired
     8	private MemberPrinter memberPrinter;
     9
    10	...
    11}
    
  • MainForSpring.java

    1ctx = new AnnotationConfigApplicationContext(AppConf1.class, AppConf2.class);
    
  • Autowired annotation을 통해 다른 설정 파일의 객체를 가져올 수 있다.

두 개 이상의 Configuration 파일 사용 : @Import 활용

  • AppConfImport.java

    1import org.springframework.context.annotation.Import;
    2
    3@Configuration
    4@Import(AppConf2.class)
    5public class AppConfImport {
    
  • MainForSpring.java

    1ctx = new AnnotationConfigApplicationContext(AppConfImport.class);
    2// 클래스 한 개만 명시해줘도 가능
    

타입만으로 빈을 구할 수 있다

1VersionPrinter versionPrinter = ctx.getBean(MemberPrinter.class);
  • 다만, 같은 타입의 빈 객체가 2개 이상 존재한다면 에러 발생