의존성 관리 -2

2022. 7. 15. 15:16Spring

728x90

(아래의 코드들은 이어집니다)

 

어노테이션 추가 방법 : Context 네임스페이스 추가

 

어노테이션을 사용하면 일일이 XML에 <bean>을 등록하지 않고서 자동으로 객체를 생성할 수 있다.

사용방법은 아래와 같다.

 

  1. <bean>을 등록하지 않고 자동으로 생성하려면 <context : component-scan>태그를 이용해서 base-package 속성에 스프링이 클래스를 검색할 패키지를 지정하면 된다.
  2. 해당 클래스 @Component , @Repository, @Service, @Controller등의 어노테이션을 추가하면 된다.

위의 어노테이션들은 객체를 생성하는 역할을 명심해야한다.

 

예)

<context:component-scan base-package = "sonny.spring.polymorphism"></context:component-scan>

base-package 속성 : 스프링이 클래스를 검색할 패키지 지정 -> 스캔 대상에 포함

 

 

@Component("tv")
public class LgTV implements TV {
	
	public LgTV() {
		System.out.println("LgTV 객체 생성");
	}
	
	@Override
	public void powerOn() {
		System.out.println("LgTV 전원을 켠다.");
		
	}

    ...
}

@Component 는 <bean id = "tv" class ="sonny.spring.polymorphism.LgTV"> 와 같다.

 

 

 

참고)   <context : component-scan> 태그는 어노테이션과 관련해서 아래의 BeanPostProcessor를 함께 등록해준다.

 

  • RequiredAnnotationBeanPostProcessor
  • AutowiredAnnotationBeanPostProcessor
  • CommonAnnotationBeanPostProcessor
  • ConfigurationClassPostProcessor

=> 따라서, @Required , @Autowired와 같은 어노테이션이 함께 적용된다.

 

의존성 주입 설정 - 어노테이션

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

 

  • @Autowired 어노테이션

@Autowired 어노테이션은 생성자,필드,메서드 세 곳에 적용 가능하다.

@Autowired 어노테이션은 타입을 이용한 프로퍼티 자동설정 기능을 제공한다.

@Autowired 어노테이션을 적용한 타입의 빈 객체가 존재하지 않거나 , 두 개 이상인 경우 예외를 발생시킨다.

- > 두 개 이상인 경우 @Qualifier 어노테이션을 사용해 해결한다.

 

@Component("tv")
public class LgTV implements TV {
	
	@Autowired
	private Speaker speaker;
	
	public LgTV() {
		System.out.println("LgTV 객체 생성");
	}
	
	
	@Override
	public void powerOn() {
		System.out.println("LgTV 전원을 켠다.");
		
	}

	...
}
@Component("sony")
public class SonySpeaker implements Speaker {
	
	public SonySpeaker() {
		System.out.println("===> SonySpeaker 객체 생성");
	}
	
	public void volumeUp() {
		System.out.println("SonySpeaker --> 소리를 올린다.");
	}
	
	public void volumeDown() {
		System.out.println("SonySpeaker --> 소리를 내린다.");
	}
}

 

 

  • @Qualifier 어노테이션

위에서 언급했듯이, @Autowired 어노테이션을 적용한 타입의 객체가 두개 이상인 경우에 @Qualifier 어노테이션을 사용한다.

 

@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 LgTV() {
		System.out.println("LgTV 객체 생성");
	}
	
	
	@Override
	public void powerOn() {
		System.out.println("LgTV 전원을 켠다.");
		
	}

	...
}

예외 발생

이때, @Qualifier 어노테이션 사용

 

 

  • @Resource 어노테이션

@Resource(name="빈 객체의 이름")

@Component("tv")
public class LgTV implements TV {
	
	@Resource(name="apple")
	private Speaker speaker;
	
	public LgTV() {
		System.out.println("LgTV 객체 생성");
	}
	
	
	@Override
	public void powerOn() {
		System.out.println("LgTV 전원을 켠다.");
		
	}

	...
}

 

 

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

 

어노테이션 기반 설정은 XML 설정처럼 부담도 없고 의존관계에 대한 정보가 자바 소스코드에 포함되어 있어 사용하기 편하다. 하지만 의존성 주입할 객체의 이름이 자바 소스코드에 명시되어 있어 소스코드를 수정해야 객체를 변경할 수 있다는 문제점이 있다. (위의 예에서는 Speaker)

따라서, XML설정과 어노테이션의 장점을 혼합하여 사용해야한다.

 

	
	<context:component-scan base-package = "sonny.spring.polymorphism"></context:component-scan>
	
	<bean id = "sony" class ="sonny.spring.polymorphism.SonySpeaker"></bean>

AppleSpeaker 클라스와 SonySpeaker 클라스의 @Component 어노테이션을 지운다.

@Component("tv")
public class LgTV implements TV {
	
	@Autowired
	private Speaker speaker;
	
	public LgTV() {
		System.out.println("LgTV 객체 생성");
	}
	
	
	@Override
	public void powerOn() {
		System.out.println("LgTV 전원을 켠다.");
		
	}

	...
}

 

결론 : 변경되지 않는 객체는 어노테이션을 사용하고 변경될 여지가 있는 것은 XML 설정을 하는 것이 효율적이다.

 

 


 

스프링 MVC 에서의 @Component를 상속하는 어노테이션

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

 

 

 

이상입니다~!

 

728x90

'Spring' 카테고리의 다른 글

Spring - 트랜잭션 처리  (0) 2022.07.21
Spring - AOP  (0) 2022.07.19
의존성 관리-1  (0) 2022.07.14
스프링 XML 설정  (0) 2022.07.14
스프링 프레임 워크를 배우기 전 용어 정리  (0) 2022.07.08