본문 바로가기

Spring

1-5. 스프링 어노테이션 기반 설정

링 프레임크는 XML 정이 중요니다.
하지만 XML에 과도 설정을 피하기 해 어노테션 설정을 지원합니다.

applicationContext.xml 파의 Namespaces를 고 context에 크합다.

넌트 스캔 설정을
애플리이션에서 사할 객체들을 스프링 정 파일에 <bean>으 등록하지 않고 자으로 생성합니다.
이 설정 스프링 테이너는 클래스 패스에 있 클래스들을 스캔해 
@Component가 설정된 클스들을 자동으로 객체 성합니다.

위와 이 스프링 설정 파일 클래스에 @Component 언을 동시에 하게 되면 모리에는 LgTV 객체가 개 생성됩니다.
또한 설정두 해당 클래스에 본 생성자가 있어야 컨테너가 객를 생성 수 있습니다.
라이언트 로그램에서 LgTV 객체를 요하기에는 추 설정이 필요합니다.
클라이트가 프링 컨테이가 생성한 체를 요청하면,
요청할 사용할 아이디나 름이 반드시 설되어야 합니.

id나 name을 정하지 았다면 클래스 름의 첫 글자를 소자로 변경해 테이너가 자동으 설정합니다.
applicationContext.xml 의 component-scan 설@Component 어노이션 설정 TVUser 래스를 실행합다.

이제 @Autowired를 사용 의존성 주입을 정합니다.
대부 멤버변수 위에 선언여 사용하며
스프링 컨이너는 버 변수 위에 붙은 @Autowired를 인하고 해당 수의 타을 체크합니다.
입의 객체가 모리에 존하는지 확인 후, 그 체를 변수에 주입합니다.


약 @Autowired가 붙은 체가 메모리에다면 
컨테너가 NoSuchBeanDefinitionException을 발생키며
@Autowired 대상 객모리에 존재하지 않다는 의입니다.

package polymorphism;

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

@Component("tv")
public class LgTV implements TV {
	
	@Autowired
	private Speaker speaker; // Speaker 타입 변수 추가
	
	public LgTV() {
		System.out.println("Lg 객체 생성");
	}
	public void powerOn() {
		System.out.println("LgTV 전원 켠다.");
	}
	
	public void powerOff() {
		System.out.println("LgTV 전원 끈다.");
	}
	
	public void volumeUp() {
		speaker.volumeUp(); // Speaker 객체 메소드 추가
	}
	
	public void volumeDown() {
		speaker.volumeDown(); // Speaker 객체 메소드 추가
	}
}

재 작성한 Speaker 클래스는 SonySpeaker이
해당 Speaker 객체 의존성 입을 하기 해선
아래 두지 방법 중 한 가지를 용해야 러가 발생하 않습니다.

메모에 생성된 Speaker 타입의 객체가 개 이상일 때 컨테이너는 @Autorwired 로 언되어 는 변수에
어떤 객체를 당할지 판단지 못 해 러를 발생시니다.

AppleSpeaker@Component 어노테이을 사해 TVUser 실행켰더니
NoUniqueBeanDefinitionException을 발생시습니다.

@Autowired 밑에 @Qualifier를 사용해 AppleSpekaer를 주입해주습니다.
존성 주입될 체의 아이디나름을 지정할 있습니다.

어노테션과 XML 정을 병행하여 용하면 점을 보하여 자바 스를 변경하지 않고 용할 수 있게 합다.

현재 SonySpeaker와 AppleSpeaker에 @Component가 선언어 있어
LgTV에서 @Autowired로 Speaker 체를 주입할 때 에러가었습니다. (@Qualifier 선언 제거)
SonySpeaker와 AppleSpeaker에 언된 어노테이션을 지줍니다.

위 설대로하면 SonySpeaker가 LgTV의 Speaker에 주입됩니다.
이후 AppleSpeaker로 변할 때 자 소스 변경 없이 XML만 수정면 교체할 수 있습니다.

즉, 클이언트가 요청할 LgTV는 @Component 어노테션으로 처리고 의성 주입을 @Autowired로 처합니다.
될 가능성이 있는 의존이 주입될 객를 스링 설정 파일(applicationContext.xml)에 <bean> 으 등록하여
자바 드 수정 없이 XML 수정으로 Speaker를 교체 수 있습다.

가 직접 개한 클래스는 노테이션 및 XML 사용할 수 있지만 라브러리 형태로 제공는 클래스(서 파티)는 반드 XML 설을 통해서만 사이 가능합니다.

프레테이션 레이는 사자와 뮤니케션을 담당하고 (Controller, View)
비즈니 레이어는 사자의 요청에 대한 비즈스 로직 처를 담합니다. (Service:ServiceImpl, Repository:DAO)

컨트러는 사자의 요을 제어하며
ServiceImpl래스는 실질인 비즈니스 로직 처리하
DAO는 데이베이스 연을 담당합니다.

모든 래스에 @Component를 할당게 되면 어떤 클스가 어떤 역할 수행하는지 파하기 어렵니다.
또한 노테이을 나누면 설정된 노테이션에 따라 별한 기능이 추가되 있습니.