Auto-wiring
: DI를 명시적으로 설정하지 않아도 container가 bean의 타입이나 이름을 이용하여 DI를 자동으로 수행하는 기능
XML 기반 설정
예시)
- byName (setter-based injection)
: property와 같은 name(또는 id) 값을 갖는 bean을 찾아 주입한다.
- byType (setter-based injection)
: property와 같은 타입을 갖는 bean을 찾아 주입한다.
단, Instrument 객체가 하나만 존재할 경우에만 쓸 수 있다.
- Constructor (constructor-based injection)
: 생성자 호출 시, argument와 같은 타입을 갖는 bean을 찾아 전달한다.
단, 해당 객체가 유일하게 존재할 경우에만 쓸 수 있다.
Auto-wiring과 명시적 설정의 혼합
자동 설정을 이용하되, 일부 preperty에 대해 명시적으로 <property>나 <constructor-arg>를 이용해 DI 설정 가능하다.
주의) 명시적 설정이 자동 설정보다 우선적으로 적용된다.
주의할 점
- byName, byType 방식 : 주입 가능한 bean이 없을 경우, DI 수행을 안 함
- byType, constructor 방식 : 주입 가능한 bean이 여러 개일 경우, exception 발생
(NoUniqueBeanDefinitionException)
- constructor 방식 : 자동 주입에 사용 가능한 생성자가 여러 개일 경우 exception 발생
- Auto-wiring은 다양한 타입의 bean 객체들이 다수 존재하고, 특정 타입의 bean객체가 한 개씩만 존재할 때 효과적이다.
- 그러나 객체 간의 의존 관계를 명확히 파악하기 어렵고 부작용이 발생할 위험이 있다.
참고 : 부모 Bean을 통한 설정 재사용
Bean들 사이에 중복되는 설정이 많을 경우 추상 bean을 정의하고 그 설정을 재사용(상속)
- abstract : true값을 갖는 경우, 추상 bean 생성(객체 생성 불가)
예1)
예2)
Java Code 기반 설정
@Configuration, @Bean annotation 사용
@Configuration : 이 클래스를 Spring bean의 설정 정보로 사용한다.
@Bean : 이 메서드가 생성 및 반환하는 객체를 bean 객체로 등록한다. method 이름을 bean의 id로 사용한다.
or name 속성을 통해 bean의 id를 지정 가능하다.
- 생성자 기반 의존 관계 설정 (DI)
- Setter-method 기반 의존 관계 설정 (DI)
Collection Wiring
: Collection(List, Set, Map, Properties, ...) 객체 생성 및 주입
주의! 생성되는 bean들은 기본적으로 singleton 객체이다.
같은 메서드를 여러 번 호출해도 객체는 내부적으로 한 번만 생성되고 호출된다.
Java code 기반 설정 사용 방법
AnnotationConfigApplicationContext class를 container로 사용한다.
여러 개의 JavaConfig 클래스 사용
방법 1 :@Autowired를 이용해 설정 클래스의 객체를 주입한다.
방법 2 : @Autowired를 통해 필요한 의존 객체들을 자동 주입한다.
방법 3 : 모든 설정 클래스를 파라미터로 전달
방법 4 : @import annotation를 이용한 설정정보 결합
Annotaion 기반 설정
- XML 설정을 해줘야 함 !!
@Required
: property에 대한 setter method 앞에 사용
@Autowired
- 생성자, property, method에 대해 적용 가능
: setter 뿐만 아니라 일반 메서드에도 적용 가능
- bean들 사이의 의존 관계를 type을 이용하여 자동 설정
* 만약 할당 가능한 타입의 bean 객체가 존재하지 않을 경우, NoSuchBeanDefinitionException
* 만약 하당 가능한 타입의 bean 객체가 여러 개일 경우, NoUniqueBeanDefinitionException
- required 속성
: 의존 객체 주입이 반드시 필요한지 여부를 나타낸다.
: required = false로 하면 할당가능한 bean이 존재하지 않더라도 exception을 발생시키지 않는다.
- XML 설정
- Java Code 기반 설정
Collection Type property
원소 타입의 모든 bean을 모아서 하나의 collection 객체를 생성 및 주입한다.
- 주의사항
1) autowired를 property에 직접 적용할 경우, setter method가 존재하지 않아도 DI가 실행된다.
2) @Autowired를 property나 setter method, 일반 method에 적용할 경우,
Default 생성자를 통해 객체가 생성되고, 의존 객체가 주입된다.
* Default 생성자가 없고 인자가 있는 생성자가 존재할 경우 exception 발생 !
@Nullable
: @Autowired + @Nullable 사용시 할당 가능한 Bean이 존재하지 않는 경우 null을 주입한다.
@Qualifier
자동 주입 가능한 bean이 여러 개일 때, 특정 bean에 대해 한정자를 붙이거나 특정 bean을 선택하기 위해 사용한다.
- XML 이용 시,
- Java Config 이용 시,
- Bean 클래스에서 정의 시,
@Value
int, boolean, float, String 등의 값을 전달함
@Resource
: @Autowired + @Qualifier
- 주의사항
: name 속성이 생략되면 property 이름을 사용한다.(autowiring by name)
만약 이름이 같은 bean을 찾지 못하면, autowiring by type으로 전환
만약 할당 가능한 bean이 없거나 여러 개이면 exception 발생 !
참고 : JSR - 330 Annotations
Bean Scan
Annotation을 이용한 자동 bean 탐색 및 등록
1) 특정 어노테이션이 붙은 클래스에 대해 자동으로 bean을 등록하는 기능
@Component, @Controller, @Service, @Repository, @Aspect, @Configuration
속성으로 bean의 id 지정 가능, 지정하지 않았다면 클래스 이름으로(첫글자소문자) 지정
2) XML 또는 JavaConfig 클래스에서 명시적인 Bean 설정 생략 가능하다.
예시)
XML 설정 방법
<context:component-scan />
JavaConfig 설정 방법 : @ComponentScan
참고) beanScan 범위 설정
include-filter : 포함시킬 클래스
exclude-filter : 제외시킬 클래스
설정 방식의 장단점
XML
장점 : 클래스들과 설정 정보를 분리할 수 있고, 관심사의 분리
단점 : 값이 모두 String 타입이므로 type-safe 하지 않음(즉 오타가 있을 때 debugging의 어려움)
Annotation 기반 설정 + bean scan
장점 : Java code 설정하므로 type-safe하고, 적용이 빠름
단점 : 설정이 클래스들과 결합(분산)되어 관리나 관심사의 분리가 어려움
Java Code 기반 설정
장점 : 클래스들과 설정을 분리할 수 있고 관심사의 분리 가능, java code로 설정하므로 type-safe
'Programming > Spring' 카테고리의 다른 글
05. Spring MVC (0) | 2021.04.18 |
---|---|
04. bean life-cycle관리 / 외부설정 property / message source (0) | 2021.04.13 |
02. SpringDI / 생성자 * setter 방식 / SpEL (0) | 2021.04.06 |
01. Spring Framework 개요 (0) | 2021.04.04 |
BoostCourse 7) DTO, DAO (0) | 2021.01.07 |