728x90
반응형

Annotation을 사용하는 이유

  • XML 파일의 과도한 설정으로 인한 부담을 덜어준다.

 

Context 네임스페이스 추가

  • 어노테이션을 사용하기 위함.
  • 스프링 설정 파일(applicationContext.xml)

context 네임스페이스 추가하기.

[그림1] namespace context 추가

 

컴포넌트 스캔(component-scan)설정

  • 스프링 설정 파일에 사용할 객체들을 등록하지 않고 자동으로 생성
  • 스프링 설정 파일(applicationContext.xml)

<context:component-scan> 설정을 제외한 나머지 <bean> 설정은 삭제하거나 주석처리.

base-package는 해당 패키지로 시작하는 모든 클래스들을 스캔 대상으로 지정한다는 의미다.

[그림2] component-scan 설정하기

 

@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 속성을 지정하지 않으면 컨테이너가 자동으로 이름을 설정한다. 이때 규칙은 첫 글자가 소문자인 클래스 이름이다.

 

[그림3] applicationContext.xml id 추가

 

[그림4] LgTV Component 아이디 설정

 

실행 결과

[그림5] TVUser클래스 실행 결과

 

 

의존성 주입 어노테이션

어노테이션 설명
@Autowired 주로 변수 위에 설정해 해당 타입의 객체를 찾아서 할당한다.
org.springframework.beans.factory.annotation.Autowired
@Qualifier 특정 객체의 이름을 이용해 의존성 주입할 때 사용한다.
org.springframework.beans.factory.annotation.Qualifier
@Inject @Autowired와 동일한 기능을 제공한다.
javax.annotation.Resource
@Resource @Autowired와 @Qualifier의 기능을 결합한 어노테이션이다.
javax.inject.Inject

 

 

 

 

@Autowired

  • 생성자나 메소드, 멤버변수 위에 사용한다.
  • @Autowired를 확인하는 순간, 그 타입의 객체가 메모리에 존재하는지를 확인한 후에 그 객체를 변수에 주입한다.

LgTV클래스에 멤버변수 추가하고 의존관계설정

[그림6] LgTV 멤버변수와 의존관계 만들기

 

 

XML 설정

<bean id ="sony" class="polymorphism.SonySpeaker"/>

 

Annotation 설정

@Component("sony")
public class SonySpeaker implements Speaker{
	public SonySpeaker(){
    	System.out.println("====> SonySpeaker 객체생성");
    }
}

 

 

 

@Qualifier

  • 의존성 주입 대상 객체가 2개 이상일 경우 문제가 발생한다.
  • 예) AppleSpeaker와 SonySpeaker 객체가 생성된 경우

 

[그림7] AppleSpeaker에도 객체생성

 

에러메시지

WARN : org.springframework.context.support.GenericXmlApplicationContext 
- Exception encountered during context initialization
- cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'tv':
Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private polymorphism.Speaker polymorphism.LgTV.speaker;
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type [polymorphism.Speaker] is defined: 
expected single matching bean but found 2: apple,sony

 

이러한 문제를 해결하기위해 @Qualifier 어노테이션을 제공한다.

@Autowired와 @Qualifier를 다음과 같은 변수 위에 사용

 

[그림8] LgTV에 추가

 

실행 결과 - 정상 작동

[그림9] TVUser 실행 결과

 

 

@Resource

  • @Autowired는 변수의 타입을 기준으로 객체를 검색
  • @Resource는 객체의 이름을 기준으로 검색해 주입한다.

 

 

어노테이션과 XML 설정 병행해 사용하기

 

1. XML 설정

  • 장점 : 자바소스를 수정하지 않고 XML 파일의 설정만 변경하면 실행되는  Speaker를 교체할 수 있어 유지보수가 편하다.
  • 단점 :  XML 설정에 대한 부담이 존재한다.

2. 어노테이션 설정

  • 장점 : XML 설정에 대한 부담이 없고, 의존관계에 대한 정보가 자바소스에 들어있어 사용하기에 편리하다.
  • 단점 : 주입할 객체의 이름이 자바소스에 명시되어야 하므로 자바소스를 수정하지 않고 Speaker를 교체할 수 없다.

 

순서 

LgTV 클래스 speaker 변수를 원래대로 @Autowired 어노테이션만 설정 -> AppleSpeaker,SonySpeaker 클래스 @Component 제거해 객체가 자동으로 생성되는 것 차단 -> 둘 중 하나만 스프링 설정 파일에 <bean> 등록해 처리하면 완료

 

Autowired만 남겨놓기

[그림10] Autowired 이외 제거

 

Component 제거

[그림11] Component 제거
[그림12] Component 제거

 

Sony와 Apple중 하나만 남겨놓기

[그림13] SonySpeaker로 설정

 

 

추가 어노테이션

어노테이션 위치 의미
@Service XXXServicelmpl 비즈니스 로직을 처리하는 Service 클래스
@Repository XXXDAO 데이터베이스 연동을 처리하는 DAO 클래스
@Controller XXXController 사용자 요청을제어하는 Controller 클래스

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기