파게로그

Annotation을 이용할 때의 장점과 @Autowired 를 이용한 DI 본문

콤퓨타 왕기초/Spring

Annotation을 이용할 때의 장점과 @Autowired 를 이용한 DI

파게 2021. 4. 15. 13:37

Spring docs - Annotation-based container configuration

docs.spring.io/spring-framework/docs/5.3.x/reference/html/core.html#beans-annotation-config

 

Annotation으로 설정할 때의 모듈 변경 방법

UI --- S --- <<interface>> B --- B2 (implements B)

 

여기서 B2 대신 B3를 사용하고자 한다면, data.B2를 data.B3로 바꾸기만 하면 된다.

이렇게만 해도 충분히 편하지만, annotation을 통해 코드에 메타 데이터를 심으면 보다 편리하다.

 

B2가 @Component annotation을 통해 객체화되고 있을 때, 이를 지우고 B3로 대체하게 되면,  @Component를 가진 클래스는 B3밖에 없으므로 B3 객체가 생성된다. 요컨대, 설정 파일이 따로 없어도, 객체만 바꿔버리면 코드와 설정이 바뀐다.

 

 

 

@Autowired

<bean id="exam" class="admin.school.entity.MidTermExam" p:kor="80" p:eng="100" p:math="90" p:com="60" />
<bean id="console" class="admin.school.ui.InlineExamConsole">
    <property name="exam" ref="exam" />
</bean>

 

일단, @Autowired를 통해 3라인을 먼저 지워보자.

 

InlineExamConsole.java

@Autowired // 생성하고자 하는 객체는 @Autowired가 달린 setter를 자동으로 찾아서 바인딩됨
@Override
public void setExam(Exam exam) {
    this.exam = exam;
}

 

한편, XML에는, 객체를 생성할 때 객체 내부에 @Autowired가 있는지 확인하고 참조하도록 명령해야 한다.

 

1. setting.xml에서 아래를 추가한다.

🍰 <beans>에 아래를 추가

xmlns:context="http://www.springframework.org/schema/context"

🍰 <beans>의 xsi:schemaLocation 속성에 아래를 추가

http://www.springframework.org/schema/context

https://www.springframework.org/schema/context/spring-context.xsd

 

2. 객체들이 annotation을 가지고 있다는 것을 알려준다.

🍰 <bean> 태그들 위에 아래를 추가

<context:annotation-config />

 

🥝 @Autowired는 뭘 기준으로 찾나?

setter의 파라미터의 타입을 확인한다.

여기선 파라미터(exam)의 타입 Exam과 빈의 타입 admin.school.entity.MidTermExam을 확인해서 바인딩한다.

 

🥝 만약 IoC Container에 객체가 두개라면?

@Autowired가 작동하지 않는다.

ERROR: ...expected single matching bean but found 2...

<bean>에 id 속성 지정함으로써 해결할 수 있다. 이 때에는 파라미터의 변수명과 같은 id를 가진 객체를 찾는다.

 

🥝 하지만 bean 객체 이름이나 파라미터의 이름을 일일이 바꾸는 것은 말이 안 되지 않나?

예를 들어, setter와 <bean>이 다음과 같이 정의되어 있을 때에 이들을 계속해서 수정할 수는 없다.

- setter

setExam(Exam exam)

 

- <bean> 객체

<bean id="exam1" ... />

<bean id="exam2" ... />

 

→ @Qualifier("exam1") 을 통해 연결할 수 있음

 

 

 

@Autowired의 위치와 Required 옵션

1. setter 위

 

2. constructor 위

생성자의 파라미터가 2개 이상일 수 있어서 @Qualifier는 에러가 발생한다. 그래서 파라미터에다가 @Qualifier를 설정할 수 있다.

 

3. field 위

기본 생성자에서 객체를 바인딩(기본 생성자를 호출하면서 의존성 주입이 이루어짐. 기본 생성자가 없으면 에러가 발생한다.)한다.

 

 

 

만약 XML에서 객체를 찾지 못했을 때에도 오류가 아니라 어떤 작업을 처리해주려고 하면?

@Autowired(required = false)

위와 같이 속성을 지정하면 에러가 발생하지 않는다.

 

Comments