1. Annotation이란?
앞 강의에서 DI란 무엇인지와 생성자를 이용하여 의존성 주입을 하는 방법을 실습해 보았다면 이번 강의에서는 Annotation을 이용하여 의존성 주입을 해볼 예정이다.
먼저 에노테이션이란 기존 XML을 이용하여 의존성 주입을 하는 것이 아닌 @Required 같은 태그를 이용하여 의존성 주입을 하는 것을 의미한다. 의존성 주입 에노테이션으로는 다음과 같은 3가지가 있다
#1 @Required
XML의 Bean의 property에 해당하는 부분 중 필수적인 부분을 명시할 때 다음과 같이 사용한다. 쉽게 말해 XML에 bean중 property가 꼭 있어야 하니 없으면 에러가 발생한다고 생각하면 좋다 즉 @required를 사용할때 xml에 property에 name에 해당하는 부분이 반드시 있어야 에러가 발생하지 않는다.
public class Boy{
private String name;
@required
public void setName(String name){
this.name = name;
}
}
#2 @Autowired
이전 강의에서 의존성 주입을 할 때 bean에 property를 사용하여 세터를 통한 주입을 했었다. 하지만 Class의 기존 세터 부분을 지우고 @Autowired 에노테이션을 추가하면 자동으로 의존성 주입이 이루어진다. 이는 다음 코드처럼 Boy클래스는 property를 사용하여 세터를 통해 bean을 생성했고 college라는 bean은 propery를 통해 boy라는 bean을 의존성 주입 했지만 College클래스에 @Autowired 에노테이션을 추가하고 세터부분을 지우고, 마찬가지로 bean의 property부분을 지우면 자동으로 의존성 주입이 이루어지는것을 확인할 수 있다.
public class Boy {
private String name;
private int age;
// getters and setters ...
}
public class College {
@Autowired
private Boy student;
//이부분부터
public void setStudent(Boy aboy){
this.stuendt = aboy;
}
//이부분까지 삭제
}
<bean id=“boy” class=“Boy”>
<property name=“name” value=“Rony”/>
<property name=“age” value=“10”/>
</bean>
<bean id=“college” class=“College”>
<property name=“student” ref=“boy”/> //이부분 삭제
</bean>
#3 @Qualifier
만약 Autowired를 할때 다음과 같이 Boy 클래스의 bean이 두 개 있으면 어떤 걸 자동으로 Autowired를 할지 몰라 오류가 생긴다 따라서 이럴 때 @Qualifier를 사용한다. 다음과 같이 bean에는 qualifer의 value를 지정하고 Class에는 @Qualifier의 에노테이션과 함께 value를 설정하면 어떤 bean을 주입할지 정하게 된다
<bean id=“boy1” class=“Boy”>
<qualifier value=“rony”/>
<property name=“name” value=“Rony”/>
<property name=“age” value=“10”/>
</bean>
<bean id=“boy2” class=“Boy”>
<qualifier value=“tony”/>
<property name=“name” value=“Tony”/>
<property name=“age” value=“8”/>
</bean>
<bean id=“college” class=“College”>
</bean>
public class College {
@Autowired
@Qualifier(value=“tony”)
private Boy student;
// getters ...
}
#4 @Resource
@Qualifer가 value를 지정해서 의존성 주입을 시켜줬다면 Resource는 bean의 id로 의존성 주입을 해준다. 다음과 같이 사용할 수 있다.
public class College {
@Resource(name=“boy1”)
private Boy student;
// getters and setters ...
}
#5 @Component
@Component는 Bean.xml에 빈을 사용한다 명시 하지 않아도 자동으로 클래스를 Bean으로 만들어주는 에노테이션이다
@Component
public class College {
private Boy student;
// getters and setters ...
}
2. Annotation 실습
실습할 예제는 이전 DI강의에서 사용했던 프로젝트로 실습하겠습니다.
#1) animal.xml수정
먼저 animal.xml을 다음과 같이 수정합니다. 생성자로 주입했던 constructor-arg 부분을 지워 주고 애노테이션을 사용한다는 코드를 추가합니다
<?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-4.3.xsd">
<context:annotation-config></context:annotation-config>
<bean id="dog" class="kr.ac.hansung.helloDI.Dog">
<property name="myName" value="poodle"></property>
</bean>
<bean id="cat" class="kr.ac.hansung.helloDI.Cat">
<property name="myName" value="bella"></property>
</bean>
<bean id="petOwner" class="kr.ac.hansung.helloDI.PetOwner">
<constructor-arg ref="dog"></constructor-arg>
</bean>
</beans>
#2) @Autowired추가
PetOwner.java클래스의 생성자 부분을 지우고 다음과 같이 @Autowired에노테이션을 추가합니다
package kr.ac.hansung.helloDI;
import org.springframework.beans.factory.annotation.Autowired;
public class PetOwner {
@Autowired
private AnimalType animal;
public void play() {
animal.sound();
}
}
다음과 같이 코드를 수정하고 Run 하게 되면 다음과 같은 에러가 발생하는 것을 확인할 수 있습니다. 앞서 공부한 것처럼 2개의 bean 중 어떤 bean을 주입할지 모르기 때문에 다음과 같은 error가 발생하는 것입니다. 따라서 2가지 방법을 통해 해결해보도록 하겠습니다.
#3) @Qualifier추가 및 animal.xml수정
다음과 같이 Qualifier에노테이션을 사용하여 다음과 같이 어떤 빈을 주입할지 선택합니다.
PetOwner.java
package kr.ac.hansung.helloDI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class PetOwner {
@Autowired
@Qualifier(value="cat")
private AnimalType animal;
public void play() {
animal.sound();
}
}
animal.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-4.3.xsd">
<context:annotation-config></context:annotation-config>
<bean id="dog" class="kr.ac.hansung.helloDI.Dog">
<property name="myName" value="poodle"></property>
<qualifier value="dog"></qualifier>
</bean>
<bean id="cat" class="kr.ac.hansung.helloDI.Cat">
<property name="myName" value="bella"></property>
<qualifier value="cat"></qualifier>
</bean>
<bean id="petOwner" class="kr.ac.hansung.helloDI.PetOwner">
</bean>
</beans>
#4) 실행
수정을 완료하였다면 다음과 같은 실행 결과를 확인할 수 있다.
#5) @Resource 추가 및 animal.xml수정
@Qualifier대신 Resource에노테이션을 사용해보자 다음과 같이 animal.xml을 수정한다
PetOwner.java
package kr.ac.hansung.helloDI;
import javax.annotation.Resource;
public class PetOwner {
@Resource(name="dog")
private AnimalType animal;
public void play() {
animal.sound();
}
}
animal.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-4.3.xsd">
<context:annotation-config></context:annotation-config>
<bean id="dog" class="kr.ac.hansung.helloDI.Dog">
<property name="myName" value="poodle"></property>
</bean>
<bean id="cat" class="kr.ac.hansung.helloDI.Cat">
<property name="myName" value="bella"></property>
</bean>
<bean id="petOwner" class="kr.ac.hansung.helloDI.PetOwner">
</bean>
</beans>
#6) 실행
수정을 완료하고 실행하면 다음과 같은 결과를 확인할 수 있다.
3. 정리
@Autowired를 사용하여 bean의 의존성 주입을 하며, 여러 빈이 있을 경우 Qualifier에노테이션을 사용하여 빈을 선택하거나, bean의 id를 통해 의존성 주입을 하는 @Resource 에노테이션을 사용할 수 있다.
'프로그래밍 > Spring' 카테고리의 다른 글
[스프링 강의] #8 스프링 & MYSQL 연동 / JDBC, DBCP란? (0) | 2020.01.14 |
---|---|
[스프링 강의] #7 스프링 AOP(Aspect Oriented Programming)란? (0) | 2020.01.03 |
[스프링 강의] #5 의존성 주입, DI(Dependency Injection)란? (2) | 2019.12.16 |
[스프링 강의] #4 JSP를 활용한 MVC 아키텍처 구축 (0) | 2019.12.14 |
[스프링 강의] #3 JSP(Java Server Pages)란? / JSP와 Servlets의 차이 (0) | 2019.12.08 |