Section 1. Annotation DI
1. Annotation
코드 사이에 주석처럼 쓰여 특별한 의미를 부여해 특정 기능을 수행하도록 하는 기술
프로그램에게 추가적인 정보를 제공해주는 메타데이터
2. XML DI vs Annotaion DI
- 코드를 수정하지 않고 외부 설정 파일(XML)을 수정하여 컴파일 및 재배포하지 않고 서비스를 업데이트
- 프로그램의 규모가 커지면서 외부 설정 파일 또한 복잡해짐 -> 가독성 ↓
- 설정 파일을 확장하지 않고 코드내에 어노테이션으로 코드화 하여 자동으로 DI 수행
- 직관적으로 어떤 추가적인 기능을 수행하는지 알 수 있음
- 일부는 컴파일 및 재배포 하지만 다른 일부는 런타임 시 변경 가능한 것 같음
3. @AutoWired
- 자동으로 객체를 연결 (의존성 주입)하도록 멤버변수, 생성자, setter 메서드 등에 지정하는 어노테이션
- context Namespace 불러오기
- 멤버변수, 생성자, setter 메서드 등에 @Autowired 지정하면 XML 내에서 property 태그 생략 가능
(오버로딩 된 생성자가 존재할 경우 기본 생성자 정의해야함)
- Spring Bean Configuration File (XML) 에 어노테이션을 이용했다고 Spring 에게 알림
- 설정 파일에 존재하는 bean 객체를 생성할 때 어노테이션이 설정된 setter를 찾음
<context:annotation-config />
4. @AutoWired 동작 원리
- @Autowired 지정된 setExam 메서드의 매개변수 타입으로 참조가 가능한 클래스 객체가 XML 파일에 하나만 존재할 경우 자동으로 해당 객체를 DI
- 두 개 이상일 때는 매개변수의 이름과 bean의 id 값이 일치하는 것을 찾음
5. @AutoWired required 옵션
- 해당하는 bean 객체를 찾을 수 없는 경우에는 에러가 발생함
- 에러를 발생시키지 않고 null 값으로 그대로 프로그램을 실행 시키려면 false 설정
6. @Qualifier
- id 값이 일치하는 것을 찾도록 설정하는 어노테이션
- 오버로딩된 생성자에는 매개변수 앞에 붙여줘야함 (기본생성자와 setter와 다르게 여러개 가능)
Section 2. Annotation 객체 생성
1. @Component
- XML 설정 파일에서 bean으로 객체를 생성하지 않고 코드 내에 @Component 지정하여 생성
- 생성하려는 객체의 클래스 정의 위에 @Component 지정
<context:component-scan base-package="spring.di.ui, spring.di.entity"/> // 지정된 경로에 Component 붙은 클래스를 생성해라
// 생략 가능
2. @Value
- @Component 어노테이션으로 객체를 생성할 때 멤버변수를 초기화
3. Component 의 종류
- Component 요소를 좀 더 특화된 이름으로 어노테이션 지정할 수 있음
- MVC 웹 개발과 관련되어 있는 어노테이션