어노테이션 설정 기초
Annotation을 사용하는 이유
- XML 파일의 과도한 설정으로 인한 부담감소
컴포넌트 스캔 설정(component-scan)
- 스프링 설정 파일에 사용할 객체들을 등록하지 않고 자동으로 생성
- 스프링 설정 파일(applicationContext.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:component-scan base-package="polymorphism"></context:component-scan>
<!--
<bean id="tv" class="polymorphism.SamsungTV">
<property name="speaker" ref="apple"></property>
<property name="price" value="1800000"></property>
</bean>
<bean id="sony" class="polymorphism.SonySpeaker"></bean>
<bean id="apple" class="polymorphism.AppleSpeaker"></bean>
-->
</beans>
@Component
: 클래스 선언부 위에 설정
XML 설정 |
<bean id="tv" class="polymorphism.LgTV"> </bean>
Annotation 설정 |
@Component(“tv”)
public class LgTV implements TV{
public LgTV(){
System.out.println("===> LgTV 객체생성");
}
}
** id, name 속성을 지정하지 않으면 컨테이너가 자동으로 이름을 설정. 이때 규칙은 첫 글자가 소문자인 클래스 이름
@Autowired
- 생성자나 메소드, 멤버변수 위에 사용
- @Autowired를 확인하는 순간, 그 타입의 객체가 메모리에 존재하는 지를 확인후 그 객체를 변수에 주입
… 중략 …
@Component("tv")
public class LgTV implements TV{
@Autowired
private Speaker speaker;
… 중략 …
public void volumeUp(){
speaker.volumeUp();
System.out.println("LgTV---소리 울린다.");
}
public void volumeDown(){
speaker.volumeDown();
System.out.println("LgTV---소리 내린다.");
}
}
XML 설정 |
<bean id=“sony” class=“polymorphism.SonySpeaker”></bean>
Annotation 설정 |
@Component(“sony”)
public class SonySpeaker implements Speaker{
public SonySpeaker(){
System.out.println(“===> SonySpeaker 객체생성”);
}
}
@Qualifier
- 의존성 주입 대상 객체가 2개 이상일 때 문제가 발생함
ex) AppleSpeaker와 SonySpeaker 객체가 생성된 경우
package polymorphism;
import org.springframework.stereotype.Component;
@Component("apple")
public class AppleSpeaker implements Speaker {
public AppleSpeaker() {
System.out.println("===> AppleSpeaker 객체 생성");
}
public void volumeUp() {
System.out.println("AppleSpeaker---소리 올린다.");
}
public void volumeDown() {
System.out.println("AppleSpeaker---소리 내린다.");
}
}
… 중략 …
@Component("tv")
public class LgTV implements TV{
@Autowired
@Qualifier(“apple”)
private Speaker speaker;
… 중략 …
public void volumeUp(){
speaker.volumeUp();
System.out.println("LgTV---소리 울린다.");
}
public void volumeDown(){
speaker.volumeDown();
System.out.println("LgTV---소리 내린다.");
}
}
@Resource
- @Autowired는 변수 타입 기준으로 객체 검색
- @Resource는 객체 이름을 기준으로 검색하여 주입
… 중략 …
@Component("tv")
public class LgTV implements TV{
@Resource(name=“apple”)
private Speaker speaker;
… 중략 …
public void volumeUp(){
speaker.volumeUp();
System.out.println("LgTV---소리 울린다.");
}
public void volumeDown(){
speaker.volumeDown();
System.out.println("LgTV---소리 내린다.");
}
}
어노테이션과 XML 설정 병행하여 사용하기
1. XML 설정
- 장점 : 자바 소스를 수정하지 않고 XMl 파일의 설정만 변경하면 실행되는 Speaker를 교체할 수 있어 유지보수가 편함
- 단점 : XML 설정에 대한 부담 존재
2. 어노테이션 설정
- 장점 : XML 설정에 대한 부담이 없고, 의존관계에 대한 정보가 자바소스에 들어있어 사용하기 편리
- 단점 : 중비할 객체의 이름이 자바소스에 명시되어야 하므로 자바소스를 수정하지 않고 Speaker를 교체 불가
추가 어노테이션
: 시스템을 구성하는 모든 클래스에 @Component를 할당하면 어떤 클래스가 어떤 역할을 수행하는지 파악이 어려움
@Component를 상속한 어노테이션
어노테이션 | 위치 | 의미 |
@Service | XXXServicelmpl | 비즈니스 로직을 처리하는 Service 클래스 |
@Repository | XXXDAO | 데이터베이스 연동을 처리하는 DAO 클래스 |
@Controller | XXXController | 사용자 요청을 제어하는 Controller 클래스 |
'기타 > 스프링' 카테고리의 다른 글
[Spring] ant_path_mathcher (0) | 2022.05.29 |
---|---|
3. 스프링 의존관계 테스트 (0) | 2020.10.09 |
2. 스프링의 시작_2 (0) | 2020.10.09 |
1. 스프링 시작 (0) | 2020.09.18 |