KyungHwan's etc.

스프링(Spring)을 통한 의존성(DI) 주입 본문

Java/스프링프레임워크

스프링(Spring)을 통한 의존성(DI) 주입

KyungHwan_0 2018. 5. 31. 17:11

스프링을 통한 의존성 주입

1.XML을 통한 의존성 주입

expert.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"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">
   
   
 <bean **id="koreaTire"** class="expert003.KoreaTire"></bean>
   
 <bean id="americaTire" class="expert003.AmericaTire"></bean>
   
 <bean id="car" class="expert003.Car">
      <property name="tire" ref="koreaTire"**></property>**
 </bean>
</beans>

2. @Autowired 통한 속성주입

Car 라고 하는 클래스에 tire 라고 하는 속성을 만든다고 한다. 그럼 대부분 아래와 같은 코드를 만들게 된다.

Tire tire;

public Tire getTire() {     return tire;
}  

public void setTire(Tire tire) {     this.tire = tire;
                              }

get /set 메서드를 꼭 만들어야 할까? Eclipse 의 Source > Generate Getters and Setters...메뉴를 사용하면 get/set 메서드를 아주 쉽게 만들어 주지만 Spring 개발팀은 더 창조적으로 어노테이션을 이용하는 방법을 사용하기 시작하여 아래와 같은 코드로 변경하였다.


import org.springframework.beans.factory.annotation.Autowired;
@Autowired
Tire tire;

변경된 Spring 설정파일(여기서는 expert.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="expert004.KoreaTire"></bean>
 <bean id="americaTire" class="expert004.AmericaTire"></bean>
 <bean id="car" class="expert004.Car"></bean>

</beans>

빨간색 부분이 기존 Spring 설정 파일 대비 추가되는 부분이다.expert.xml 의 context menu 에서 Open With > Spring Config Editor 를 선택한다. 편집기가 열리면 하단의 Namespaces 탭을 클릭해 준다. 그 중에 context 를 체크해 주시면 위의 빨간줄 중에 위쪽의 3 줄이 자동으로 삽입된다. 그 후에 Source 탭으로 돌아와 <context:annotaion-config /> 만 입력하고 저장해 주시면 된다.

@Autowird는 Spring 설정 파일을 보고 자동으로 속성의 set 메서드에 해당하는 역할을 해주겠다는 의미이다. xml 파일에서 뭔가가 수정되었다.

기존 소스

<bean id="car" class="expert003.Car">

    <property name="tire" ref="koreaTire"></property> </bean>

새로운 소스

 <bean id="car" class="expert004.Car"></bean>

@Autowird 통해서 자동으로 car property 찾아줄 있음으로 생략이 가능해 졌다.

Car.java expert.xml
@Autowired Tire tire;

<bean id="tire" class="expert004.AmericaTire"></bean>

그런데 아래와 같이 작성되어도 제대로 매핑이 된다.

Car.java expert.xml
@Autowired Tire tire; <bean class="expert004.AmericaTire"></bean>

Spring 의 마법은 아래 코드에 있다.

Car.java @Autowired Tire tire;
expert.xml <bean class="expert004.AmericaTire"></bean>
AmericaTire.java public class AmericaTire implements Tire

바로 interface 의 구현 여부 이다. Spring 마법은 type 기준 매핑이 먼저이고, 같은 type**을 구현한 여러 개의 클래스가 있다면 bean id 구분해서 매핑하게 된다.

그럼 여기서 하나의 실험을 더해 보자 아래는 정상 구동할까?

Car.java expert.xml
@Autowired Tire tire;

<bean id="usaTire" class="expert004.AmericaTire"></bean>

정상구동한다.

Car.java expert.xml
@Autowired Tire tire; <bean class="expert004.KoreaTire"></bean> <bean class="expert004.AmericaTire"></bean>

역시 정상 구동한다. Spring 은 id 기준 매핑보다 type 매핑이 우선순위가 있기 때문에 정상 구동한다.

Car.java expert.xml
@Autowired Tire tire;

<bean id="tire" class="expert004.KoreaTire"></bean> <bean class="expert004.AmericaTire"></bean>

KoreaTire 로 잘 작동하는 걸 확인할 수 있다.

Car.java expert.xml
@Autowired Tire tire;

<bean id="wheel" class="expert004.KoreaTire"></bean>

역시 정상 구동한다. Spring 은 id 기준 매핑보다 type 매핑이 우선순위가 있기 때문에 정상 구동한다.

Reference

http://expert0226.tistory.com/193?category=479268

Comments