본문 바로가기

Spring/Dependency Injection

[Spring Framework] 어노테이션과 @Autowired 사용하기

728x90
반응형

'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)

 

 

DI를 하는 방법에는 이전 강의에서 사용한 것처럼 xml이라는 외부 설정을 이용하는 방법과

어노테이션을 이용하는 방법이 있습니다.

이번 시간에는 어노테이션을 이용해서 DI를 하는 방식에 대해서 알아보려고 합니다.

 

이전에 xml을 사용하여 외부설정을 하는 이유는, 중간에 수정을 하고 싶을 때에 소스코드는 건드리지 않고,

외부 설정만 바꿈으로써 쉽게 DI를 하기 위함이었죠.

하지만 코드가 점점 길고 복잡해짐에 따라서 xml을 사용하는게 점점 복잡하고 어려워집니다.

 

따라서 xml이 아닌 어노테이션이라는 방식을 사용하여 코드 내에 설정을 심는 방식을 생각해내게 됩니다.

 

 

@Component

 

 

xml을 이용해서 DI를 진행했던 방식을 잘 떠올려보면,

1) 먼저 객체를 만든 다음에, 2) 만든 객체를 원하는 곳에 결합하는 방식을 사용했었죠.

이 때, Autowired 는 2번 방법을 위해서 사용되는 어노테이션입니다.

 

그러면 1번 방법을 위해서 사용하는 것은 무엇일까요?

바로 @Component입니다.

즉, 스프링이 Class의 코드를 보았을 때에 @Component라는 어노테이션이 발견되면 이를 객체화 하게 됩니다.

만약 A1이라는 객체를 생성하여 결합하고자 한다면, A1에 @Component 어노테이션을 붙여주고,

중간에 A2라는 객체를 A1 대신에 사용하고 싶으면, A1에 있던 어노테이션을 지우고 A2에 @Component라는 어노테이션을 붙여주는 것이죠.

 

Component 어노테이션에 대한 자세한 설명은 다음 포스팅에서 더 자세히 다뤄보겠습니다.

 

 

 

@Autowired

 

 

이제 생성된 객체를 연결하기 위해서 사용되는 @Autowired에 대해서 알아봅시다!

 

아래의 xml을 @Autowired를 이용하여 바꿔보도록 하겠습니다.

<bean id = "console" class = "spring.console.AnimalPrintName">
	<property name = "animal" ref = "animal"/>
</bean>

 

 

지금부터 setter을 이용하여 객체를 연결해주었던

<property name = "animal" ref = "animal"/> 부분을 @Autowired로 바꿔보도록 하겠습니다.

 

그 전에, autowried를 사용하기 위해서는 xml 파일에 아래와 같이 context namespace를 추가하고,

상단 부분에 <context:annotation-config /> 를 작성해주어야합니다.

 

 

 

- 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"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:util="http://www.springframework.org/schema/util"
	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.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
	
	<context:annotation-config/>
	<bean id = "animal" class = "spring.entity.Animal" p:name="BINGO" p:age="10"/>
	<bean id = "console" class = "spring.console.AnimalPrintName">
		
	</bean>
	
	<util:list id = "mylist" list-class = "java.util.ArrayList">
		<bean class = "spring.entity.Animal" p:name="ALEX" p:age="5"/>
		<ref bean="animal"/>
	</util:list>

</beans>

 

 

우선 autowired를 사용할 것이기 때문에 AnimalPrintName 부분의 setter가 빠진 것을 볼 수 있습니다.

또한, autowired 어노테이션을 사용하기 위해서는 위에 <context:annotation-config />를 작성해 주어야 하는데요.

그 이유는 console 이라는 id를 가진 AnimalPrintName 객체를 생성해 줄 때에,

해당 class 안에 객체를 연결해주는 autowired가 있으니 안에 들어가서 살펴보고

연결할만한 적절한 객체를 참조시켜달라고 말해주는 역할을 하기 때문이죠!

 

즉, IoC 컨테이너에는 animal 객체와 console 객체만이 있고

class 내부의 @Autowired가 IoC에서 만들어진 객체를 가져와 결합해주게 되는 것입니다.

 

 

- AnimalPrintName.java

package spring.console;

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

import spring.console.AnimalPrint;
import spring.entity.Animal;

public class AnimalPrintName implements AnimalPrint {

	Animal animal;
	
	public AnimalPrintName() {
		// TODO Auto-generated constructor stub
	}
	
	public AnimalPrintName(Animal animal) {
		this.animal = animal;
	}

	@Override
	public void print() {
		System.out.printf("Name is %s", animal.getName());

	}

	@Autowired
	@Override
	public void setAnimal(Animal animal) {
		this.animal = animal;
		
	}

}

 

 

setAnimal 부분에 @Autowired를 붙여주어서, 적절한 객체를 연결하도록 어노테이션을 붙여주었습니다!

 

돌렸을 때의 결과는 아래와 같이 잘 나오는 것을 확인할 수 있습니다.

 

 

 

잘 보면, 우리가 객체의 id를 넣어준 것도 아니고, 콕 찝어서 어떤 것을 연결하라고 말해준 것도 아닌데

알아서 animal이라는 id를 찾아서 객체와 결합을 했죠.

 

그 이유는 xml 파일 안에 인자로 받아야하는 Animal 이라는 객체가 오직 하나만 생성되어 있기 때문입니다.

따라서 해당 객체를 가져와서 연결 할 수 있었던 것이죠.

 

그러므로 객체가 여러개일 때에는 어떻게 해결하는지, 또 원하는 객체를 연결하려면 어떤 방식을 사용해야 하는지에 대해서 알아야합니다.

 

 

다음 포스팅에서는 Autowired의 동작 방식과 특정 객체와 연결할 수 있는 어노테이션에서 배워보겠습니다 :)

728x90
반응형