IoC/DI - 제어의 역전/의존성 주입(2)

김하영·2020년 11월 2일
0

스프링을 통한 의존성 주입

  • @Autowired
  • @Resource

@Autowired를 통한 속성 주입

[ 의사 코드 ]
운전자가 종합 쇼핑몰에서 자동차를 구매 요청합니다.
종합 쇼핑몰은 자동차를 생산합니다.
종합 쇼핑몰은 타이어를 생산합니다.
종합 쇼핑몰은 자동차에 타이어를 장착합니다.
종합 쇼핑몰은 운전자에게 자동차를 전달합니다.

  • XML 설정 파일
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
        
    <context:annotation-config />
    
    <bean id="tire" class="exSpringAutowired.KoreaTire"></bean>
    <bean id="americaTire" class="exSpringAutowired.AmericaTire"></bean>
    <bean id="car" class="exSpringAutowired.Car"></bean>
</beans>
  1. property 태그가 사라진 것을 확인할 수 있습니다.
  2. @Autowired를 통해 car의 property를 자동으로 엮어줄 수 있으므로(자동 의존성 주입) 생략이 가능해진 것입니다.
  • 스프링 프레임워크를 반영한 코드
package exSpringAutowired;

import org.springframework.beans.factory.annotation.Autowired;

public class Car {
    @Autowired
    Tire tire;
    
    public String getTireBrand() {
        return "장착된 타이어: " + tire.getBrand());
    }
}
  1. @Autowired는 type 기준 매칭을 합니다.
    만약 같은 타입을 구현한 클래스가 여러 개 있다면 그때 bean 태그의 id로 구분해서 매칭을 합니다.
    즉, @Autowired는 type과 id 중 type 구현에 우선순위가 있습니다.

메커니즘 정리

  • type을 구현한 빈이 있는가 ?
    예: 2번으로
    아니오: No matching bean 에러

  • 빈이 1개 인가?
    예: 유일한 빈을 객체에 할당
    아니오: id가 일치하는 하나의 빈이 있는가? (예: 해당 빈을 객체에 할당 / 아니오: no unique bean 에러)

DI 마무리

  • 의존 관계가 new라고 단순화해서 표현했지만, 사실 변수에 값을 할당하는 모든 곳에 의존 관계가 생깁니다.

  • 즉, 대입 연산자(=)에 의해 변수에 값이 할당되는 순간 의존이 생긴다는 말입니다.

  • 변수가 지역 변수이건 속성이건, 할당되는 값이 리터럴이건 객체이건 의존은 발생합니다.

  • 의존 대상이 내부에 있을 수도 있고, 외부에 있을 수도 있습니다.

  • DI는 외부에 있는 의존 대상을 주입하는 것을 의미합니다.

  • 의존 대상을 구현하고 배치할 때 SOLID와 응집도는 높이고 결합도는 낮추라는 기본 원칙에 충실해야
    프로젝트의 구현과 유지보수가 수월해집니다.

profile
Back-end Developer

0개의 댓글