@Autowired @Quelifier @Component @Value


어노테이션 이전의 방식

 

  • 현재 많이 사용되는 어노테이션의 등장되기 전 어떠한 코드로 IoC를 관리 해왔는지 어느정도 알아보면 어노테이션을 이용한 방식이 편한지 알 수 있다. 
  • 이전의 방식은 .xml파일에 직접적으로 빈의 정보를 입력 하여야 한다. 
  • Maven 프로젝트의 경우 그러한 Bean 관리를 root-context.xml에서 관리 하고 있다. 

 

 

  • 위와 같은 의존성을 가지려고 하면 xml에는 아래와 같이 Bean을 추가하여야 한다.
<bean id="b" class ="data.B2" />
<bean id="console" class="service.S" >
	<property name="b" ref="b" />
</bean>

 

  • 그렇다면 B2의 클래스를 B3로 변경하려면 한다면 xml에서 코드를 아래와 같이 변경해야 할 것이다.

 

 

<bean id="b" class="data.B3" />
<bean id="console" class="service.S" >
	<property name="b" ref="b" />
</bean>

어노테이션의 사용

 

  • 최초의 Spring의 등장시에는 저러한 방식도 매우 편리한 방식의 코드 였다.
  • 하지만 사람이라는 것은 더 편한 것을 찾기 마련이었고 그 방안으로 어노테이션을 이용한 Bean 관리 였다.

@Autowired

 

  • Spring이 실행시 .xml에 있는 내용을 읽어 들여 IoC 컨테이너에 각 빈들을 저장하고 있음. 
  • 거기서 ui 를 담당하는 bean이 설정된 값을 참조할 때 property라는 태그를 사용하였는데 그 역할을 대신 해주는 어노테이션이다.
<!-- ExamConsole console = new GridExamConsole() -->
<bean id="console" class="spring.di.ui.InlineExamConsole">
	<!-- console.setExam(exam); -->
    <property name="exam" ref="exam" /> <---- 해당부분을 @Autowired가 대신함.

</bean>

 

  • 실제 클래스 에 가면 아래와 같이 되어져 있다. 
  • 여기서 @Autowired가 Exam값을 들고 올 수 있는 것은 Bean에 설정된 id 값이 같아서가 아니라 인터페이스를 구현하고 있는 것을 들고 오는 것이다. 
	@Autowired
	@Override
	public void setExam(Exam exam) {
		// TODO Auto-generated method stub
		this.exam = exam;
	}

 

  • @Autowired 어노테이션은 꼭 메소드위에 두지 않고 사용이 가능하다. 
  • 즉, 필드 멤버에 두고 사용해도 무방함. 우리가 흔히 보는 방식임.
  • 하지만 해당 방식을 사용할 때는 꼭 기본 생성자가 필요하다는 것을 인지 하여야함. 
@Autowired
private Exam exam;
    
public InlineExamConsole() {
// TODO Auto-generated constructor stub
}

@Autowired(required = false)

 

  • Autowired에 required 에 대하여 False를 해두면 해당하는 bean이 존재 하지 않아도 프로그램에서 예외처리 하지 않게 하는 것이다. 
  • 더 정확하게는 bean을 null로 지정하는 것이다. 

@Qualifier

 

  • 그렇다면 하나의 인터페이스에 두개의 클래스가 구현이 되었다면은 어떻게 되는 것일까?
  • 당연하게도 에러가 난다. 왜냐하면 어떤 것을 원하고 있는 클래스인지 모르기 때문이다. 
  • 그 문제를 해결하고 사용하는 어노테이션이 @Qualifier 이다.
  • 아래와 같이 두 개의 bean이 있다고 보자. 
<bean id="exam1" class="spring.di.entity.NewlecExam" p:kor="10" />
<bean id="exam2" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="20" />

 

  • exam1인 bean을 사용하고자 하면 아래 와 같이 어노테이션을 쓰면된다. 
	@Autowired
	@Qualifier("exam1")
	@Override
	public void setExam(Exam exam) {
		// TODO Auto-generated method stub
		this.exam = exam;
	}

 

  • 그렇다면 매개변수가 생성자에서는 어떻게 사용되는 것인지 확인해보자. 
  • 같은 인터페이스의 매개변수 같은 경우에도 컴파일러가 인식을 할 수 없다 그러므로 매개변수 앞에 @Qualifier를 작성해주어야 한다. 
@Autowired
public InlineExamConsole(@Qualifier("exam1") Exam exam1,
        				@Qualifier("exam2") Exam exam2) {
    this.exam = exam1;
}

@Component

 

  • xml에서 우리가 변경해야하는 bean이 생길 경우 직접 class에 있는 이름을 변경해주어야 했다.
  • 하지만 그러한 작업을 대신 하는 @Component 어노테이션을 이용하여 해결을 하였다. 
  • @Component 를 사용하면 IoC에 자동으로 등록이되며 원하는 클래스만 뽑아서 쓰면된다. 

 

 

  • 해당 @Component기능을 사용하려면 bean에 속성값을 하나 넣어 줘야 하는데 Component가 어디에 위치하고 있는지 알려주는 값이라고 생각하면 된다. 
<context:component-scan base-package="spring.di.ui, spring.di.entity"></context:component-scan>

@Value

 

  • 원하는 Component요소의 멤버변수에 값을 지정할 때 사용하는 어노테이션이다.   
@Component
public class NewlecExam implements Exam {
	
	@Value("20")
	private int kor;
	@Value("20")
	private int eng;
	@Value("20")
	private int math;
	@Value("20")
	private int com;
    
}

@Controller @Service @Repository

 

  • @Component가 Bean에 등록 해주는 어노테이션이라는 것을 알았다면 그것을 좀 더 상세하게 세분화를 해놓은 것이 MVC 모델용 어노테이션이다. 

'Backend > Spring' 카테고리의 다른 글

AOP(Aspect Oriented Programming)  (0) 2023.02.26
MVC 모델과 DispatcherServlet  (0) 2023.01.25
Bean을 .xml 통해 만들어 보기  (0) 2023.01.07
Spring이란? (DI 와 IOC)  (0) 2023.01.04
모델(Model)  (0) 2022.11.29