개발일지/SPRING

[SPRING] DI(Dependency Injection) 설정 방법

양쏘쏘 2021. 6. 12. 13:00
728x90
반응형

DI 설정 방법

 

1. XML 기반

- xml 파일을 사용하여 <Bean>요소를 정의

- applicationContext.xml에 beans, c, context 네임스페이스 추가

 

1) 생성자 기반 의존성 주입(Constructor based dependency Injection)

 - 생성자 인수를 통해 의존성 주입

 - xml에 <constructor-arg>태그를 사용하여 컴포넌트 주입 설정

2) 설정자 기반 의존성 주입(Setter based dependency Injection)

 - 메서드 인수를 통해 의존성 주입

 - xml에 <property> 요소의 name 속성에 주입할 컴포넌트 이름 설정 

<bean id="testDAO" class="com.tistory.yangsosolife.persistence.TestDAOImpl">
</bean>

<!-- Constructor based Injection -->
<bean id="testService" class="com.tistory.yangsosolife.service.TestServiceImpl">
	<constructor-arg ref="testDAO"/>
</bean>

<!-- Setter based Injection -->
<bean id="testService" class="com.tistory.yangsosolife.service.TestServiceImpl">
	<property name="testDAO" ref="testDAO"/>
</bean>

2. Annotation 기반

애너테이션을 클래스에 사용해서 DI컨테이너가 빈 자동 등록

 

- @Autowired

 : 컨테이너가 빈과 다른 빈과의 의존성을 자동으로 주입

 

- @Component

 : 컨테이너가 인젝션을 위한 빈을 설정

  @Controller : 프레젠테이션 층 스프링 MVC용 애노테이션

  @Service : 비즈니스 로직 층 Service용 애너테이션

  @Repository : 데이터 액세스 층의 DAO용 애노테이션

  @Configuration : JavaConfig용 애너테이션

 

- <context:annotation-config/>

  : @Autowired, @Resource, @Required를 이용할 때 선언

    xml에 이미 등록된 빈들의 애노테이션 기능을 적용해줌

    예) DAO를 xml에 빈으로 등록해두고 Service에서 DAO를 사용하는 경우

 

<!-- ApplicationConetxt.xml -->
<bean id="testDAO" class="com.tistory.yangsosolife.persistence.TestDAOImpl">
</bean>
<bean id="testService" class="com.tistory.yangsosolife.service.TestServiceImpl">
</bean>
<context:annotation-config />
//TestServiceImpl.java
public class TestServiceImpl implements TestService {
      @Autowired
      private TestDAO dao;
      
      public void addTest(TestVO vo) throws Exception {
      		dao.add(vo);
      }
}

- <context:component-scan base-package = "패키지명"/>

  : @Component, @Service, @Repository, @Controller 등 이용할 때 선언

    특정 패키지 내 클래스를 검색해서 자동으로 DI 컨테이너에 빈 등록

    예) xml에 persistence와 service 패키지를 등록해두고 DAO와 Service에서 각각 @Component 선언

<!-- ApplicationContext.xml -->
<context:component-scan base-package="com.tistory.yangsosolife.persistence"></context:component-scan>
<context:component-scan base-package="com.tistory.yangsosolife.service"></context:component-scan>
//TestDAOImpl.java
@Component
public class TestDAOImpl implements TestDAO{
	private Map<String,TestVO> map = new HashMap<String,TestVO>();
    
    public void add(TestVO vo) throws Exception{
    	map.put(vo.getId(), vo);
    }
}

//TestServiceImpl.java
@Component
public class TestServiceImpl implements TestService {
      @Autowired
      private TestDAO dao;
      
      public void addTest(TestVO vo) throws Exception {
      		dao.add(vo);
      }
}

3. Java 기반

- @Configuration 애너테이션을 자바 클래스에, @Bean 애너테이션을 매서드에 사용해서 빈 등록

- 자바 코드로 빈 설정

- TypeSafe, Refactoring하다는 장점

- @Configuration 

   : 빈 설정 메타 정보를 담고있는 클래스 선언

- @Bean

   : 클래스 내의 매서드 정의하여 새로운 빈 객체 정의할 때 사용

 

//JavaConfig.java
@Configuration
public class JavaConfig{
  @Bean
  public TestDAO testDAO(){
      return new TestDAOImpl();
  }
  @Bean
  public TestService testService(){
      return TestServiceImpl(testDAO());
  }
}
<!-- applicationContext.xml -->
<bean id="testDAO" class="com.tistory.yangsosolife.persistence.TestDAOImpl">
</bean>

<bean id="testService" class="com.tistory.yangsosolife.service.TestServiceImpl">
	<constructor-arg ref="testDAO"/>
</bean>
728x90