Annotation 기반 Bean 설정

 

- Annotation의 사용으로 설정파일을 간결화하고 객체 또는 메소드의 맵핑을 명확하게 할 수 있다.

- Java code로 설정을 하기 때문에 type safe하며, Spring이 빠르게 container를 설정하게 한다.

- Annotation이 클래스 (또는 메소드) 상단에 추가되면서 설정이 구성되기 때문에 클래스 파일만 보아도 어떤 스프링 설정이 적용된 클래스인지 한눈에 알 수 있다.

- 설정이 변경될 경우 Application code 클래스 파일까지 수정해 주어야 한다.

- 애노테이션을 이용한 의존성 주입 Field Injection, Setter Injection, Constructor Injection

 

애노테이션을 이용한 이용한 의존성 주입(Dependency Injection)

1) Field Injection

- 필드를 통한 의존성 주입

- 사용 예

public class Sample {
	@Autowired
    private Example example;
}

 

2) Setter Injection(수정한 주입)

- setter 메소드를 통한 의존성 주입

- 사용 예

public class Sample {
	private Example example;
    @Autowired
    public void setExample(Example example) {
    this.example = example;
    }
}

 

3) Constructor Injection(생성자 주입)

- 생성자를 통한 의존성 주입

- 권장 방식

- 사용 예

public class Sample {
	private Example example;
    @Autowired
    public Sample(Example example) {
    	this.example = example;
    }
}

 

<context:annotation-config/>

- 애노테이션(Annotation)은 기본적으로 활성화되지 않기 때문에 xml에 명시적인 활성화 작업이 필요하다.

- Application Context 안에 이미 등록된 bean들의 Annotation을 활성화 하기 위해 사용 한다.

즉, 스프링 컨텍스트에 의해 생성되어 저장된 bean들에 대해서 @Autowired와 @Qualifier 등의 Annotation 을 인식할 수 있다.

- <context:component-scan> 은 Bean을 등록하고 @Autowired와 @Qualifier 등의 Annotation을 활성화 할 수 있지만 <context:annotation-config/>는 Bean을 등록하지는 못한다.

- <context:annotation-config/> 로 활성화 할 수 있는 Annotation

@Autowired, @Qualifier, @Resource, @PostConstruct, @PreDestroy 등

 

의존성 주입 애노테이션

1) @Autowired

- @Autowired는 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.

- @Autowired는 필드, 생성자, Setter 메소드, 일반 메소드에 붙일 수 있다.

- 필드에 붙이면 Setter를 통해 주입되며, Setter가 없으면 컴파일 과정에서 자동으로 추가된다.

- @Autowired를 필드, Setter 메소드에 붙여서 사용할 경우 반드시 기존 생성자가 정의되어 있어야 한다.

 

2) @Qualifier

- 동일한 타입한 타입의 빈 객체가 여러 개 정의되어 있는 경우 특정 빈을 주입할 수 있도록 설정한다.

@Qualifier는 <bean> 태그 하위에 <qualifier> 태그를 설정하여 특정 빈을 삽입할 수 있게 설정한다.

- @Autowired 애노테이션이 적용된 주입 대상에 @Qualifier 애노테이션을 설정한다.

@Qualifier는 단독으로 사용할 수 없으며 @Autowired애노테이션과 함께 사용한다.

- 형식

 @Autowired

 @Qualifier("beanName")

 

3) @Resource

- @Resource는 주입하려고 하는 객체의 이름<id>이 일치하는 객체를 자동으로 주입한다.

- @Resource는 Java제공 애노테이션이며 필드, 입력 파라미터가 하나인 Setter 메소드에 붙일 수 있다. 생성자에는 붙일 수 없다.

- 필드에 직접 정의하는 경우 Setter를 정의하지 않아도 된다.

- @Autowired와 마찬가지 반드시 기본 생성자가 정의되어 있어야 한다.

- 형식

 name 속성을 지정하지 않은 경우 : 필드명과 동일한 이름의 빈을 주입한다.

@Resource

 name 속성을 지정한 경우 : name 속성의 빈 이름과 동일한 빈을 주입한다.

@Resource(name="beanName")

 

4) @Inject

- @Inject는 @Autowired와 유사하며, 주입하려고 하는 객체의 타입이 일치한 객체를 자동으로 주입한다.

- @Inject는 Java 제공 애노테이션이며 필드, 생성자, Setter에 붙일 수 있다.

- @Inject를 사용하기 위해서는 javax.inject의존성을 추가한다.

 

5) @Named

- @Autowired의 @Qualifier와 같이 사용할 수 있는 것이 @Inject에서는 @Named 이다.

- @Named에 빈 이름(id)를 지정한다.

- 형식

 @Named("beanName")

 

기타 의존성주입 관련 애노테이션

1) @Required

 - setter에 붙여 반드시 주입 해야하는 프로퍼티로 설정하는 애노테이션

- Spring 5.1 버전부터 Deprecated 되었다. 반드시 주입해야 할 프로퍼티는 생성자 주입을 이용한다.

- 스프링 5.1이상을 사용하거나 자바 파일 bean을 등록했을 경우 무시된다.

 

2) @Value

- 기본 자료형과 문자열의 값을 필드에 주입하기 위해 사용되며, 필드나 생성자와 메소드는 매개 변수 수준에서 적용할 수 있다.

- 생성자 주입 시 자동으로 주입되지 않는 기본 자료형과 문자열의 값을 설정한다.

- 사용 예 : 생성자

public class Sample {
	private int num;
    @Autowired
    public Sample(@Value("10") int num) {
    	this.num = num;
    }
}

 

<context:component-scan/>태그

1) 개요

- Component Scan을 지원하는 태그

- Bean이 될 수 있는 모든 Componenet를 자동으로 찾아 Bean Container에 등록한다.

- 설정 과정을 XML로 선언하는 방식보다 이해하기 쉽고 직관적이다. 

 @Component, @Repository, @Service, @Controller를 선언하고자 하는 Java 코드에 용도에 맞게 직관적으로 선언을 하기 때문에 알아보기 쉽고, 코드를 이해하기도 편하다.

- <context:component-scan>을 이용하게 되면 <context:annotation-config>의 사용이 불필요하다. 즉, @Autowired, @Qualifier, @Resource 같은 애노테이션도 활성화되므로 사용이 불필요하다.

 

+ Recent posts