어노테이션 이전의 방식
- 현재 많이 사용되는 어노테이션의 등장되기 전 어떠한 코드로 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 |