라이브러리는 도서관 아닌가요

DI 3 - Annotation을 사용한 Spring 의존성 주입 @Autowired 본문

Java/DI

DI 3 - Annotation을 사용한 Spring 의존성 주입 @Autowired

veryhi 2021. 12. 17. 09:26

 

이전 포스트( https://verycrazy.tistory.com/38?category=1027221 )의 내용에서

 

어노테이션을 붙여 더욱 간결하게 DI를 진행해보자.

 

 

 

Java 상에서 @와 합쳐진 문자열을 Annotation이라고 한다.

 

여기서 사용할 어노테이션은 @Autowired이다.

 

기존에 java코드를 건드리지 않고 xml을 이용해서 DI를 진행했다.

 

 

 

하지만 이것은 java로 개발하는 것과 다소 거리가 느껴져,

 

이러한 설정을 java 코드 상에서 직관적으로 다룰 수 있도록

 

결국에는 java에 @Autowired라는 어노테이션을 가져온다.

 

그리고 이것이 Spring 개발의 트렌드다.

 

 

 

사용 방법을 살펴보자

 

설정자 메서드의 속성이 되는 객체에 @Autowired를 붙여놓고

 

기존 xml 파일에 존재하는 <property> 태그를 없앤다.

 

해당 property 태그가 의존성을 해결하는 녀석이니 말이다.

 

다시 말해 이제는 설정 옵션을 java에서 가져와 지시하겠다는 것이다.

 

 

 

Laptop.java 코드는 아래와 같다.

// myPackage.Laptop
import org.springframework.beans.factory.annotation.Autowired;

public class Laptop{
	@Autowired
	Keyboard keyboard;

	public Keyboard getKeyboard(){
		return keyboard;
	}

	 // 아래의 코드가 없어진다. 놔둬도 상관은 없다.
//     public void setKeyboard(Keyboard keyboard){
//          this.keyboard = keyboard;
//     }

	public String showInputBrand(){
		return "연결된 키보드= " + keyboard.getKeyboardBrand();
	}
}

객체가 생성되는 저 부분 이외에도 setter 역할을 하는 메서드에 설정해주어도 된다.

 

 

 

Main.java는 그대로다.

package myPackage;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("myPackage/setting.xml");
		
		Laptop aLaptop = context.getBean("aLaptop", Laptop.class);
		System.out.println(aLaptop.showInputBrand());
	}
}

 

 

 

그 다음 xml 파일을 변경해야 한다만, 문제가 있다.

예전에는 setting.xml 설정 파일을 마우스로 우클릭 후

open with에서 spring config editor를 찾아 namespace를 지정해줄 수 있었지만,

새로운 spring tools 공개 이후 안되는 것 같다.

 

 

 

따라서 setting.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
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.1.xsd"
	xmlns:context="http://www.springframework.org/schema/context">
	
	<context:annotation-config />
	
	<!-- Keyboard 타입인 aKeyboard가 해당 경로에 존재하니 참조해라 -->
	<bean id="aKeyboard" class="myPackage.KoreaKeyboard" />

	<!-- Laptop 타입인 aLaptop이 해당 경로에 존재하니 참조해라 -->
	<bean id="aLaptop" class="myPackage.Laptop">
		<!-- Keyboard aKeyboard = new KoreaKeyboard(); -->
		<!-- aLaptop.setKeyboard(aKeyboard); -->
		<!-- <property name="keyboard" ref="aKeyboard"></property> -->
	</bean>
	


</beans>

<property> 태그도 이제 필요 없어졌다.

 

 

 

흥미로운 점은 무엇을 근거로 부품 객체가 Autowired가 됐을까하는 것이다!

 

전에는 bean의 id를 property 태그에서 ref를 통해 바인딩했다. (이게 한글인가 영어인가...?)

 

올바르게 DI를 하려면 이 기준을 상세히 알아야 한다.

 

다음 포스트에서 이어가겠지만, 힌트를 남기자면 '타입'이다.

Comments