본문으로 바로가기

4. 스프링 어노테이션(Annotation)

category 개발/스프링 2020. 10. 9. 10:52
728x90

어노테이션 설정 기초

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 클래스
728x90

'개발 > 스프링' 카테고리의 다른 글

[Spring] ant_path_mathcher  (0) 2022.05.29
3. 스프링 의존관계 테스트  (0) 2020.10.09
2. 스프링의 시작_2  (0) 2020.10.09
1. 스프링 시작  (0) 2020.09.18