티스토리 뷰
1. 어노테이션(Anntotation) 방식 ?
저번엔 xml 방식에 대해 배웠고, 오늘은 Annotation 방식에 대해 작성하려 한다.
xml 방식은 최근에는 그다지 많이 사용되지 않는 방법이다. 개발 스타일이 'xml 설정 파일'에서 '어노테이션'으로 바뀌고 있다. 어노테이션은 클래스나 메소드, 필드 등의 선언문에 쓴 "@ 기호로 시작하는 텍스트"이다.
메소드나 클래스에 간단한 단어를 쓰는 것만으로 필요한 작업을 수행 할 수 있으므로 설정 파일에 사용하는 것에서 어노테이션 방식으로 전환되고 있다.
2. Bean 설정 클래스 생성
어노테이션 방식은 Bean 설정 파일을 사용하지 않고, Java의 클래스로 작성하는 방식이다.
Bean을 설정할 자바 클래스를 하나 생성한다.
package spring.di;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.di.entity.Exam;
import spring.di.entity.NewlecExam;
@Configuration
public class ConfigJava {
@Bean
public Exam exam1(){
return new NewlecExam();
}
}
- @Configuration : 이것은 클래스 선언 앞에 작성한다. 이 어노테이션은 해당 클래스가 Bean의 설정을 할 클래스라는 것을 나타낸다. Bean 설정 클래스는 꼭 이 어노테이션을 붙인다.
- @Bean : Bean을 작성하는 메소드 앞에 작성한다. 이 어노테이션은 해당 메소드를 Bean 인스턴스 생성을 위한 것으로 인식하기 위함이다. 이것을 붙인 메소드는 반드시 Bean 인스턴스를 반환 값으로 지정해야 한다. 함수명은 Bean의 id를 나타낸다. 위 코드에서는 Exam 인터페이스의 인스턴스를 Bean으로 생성하고 있다.
이제 Bean을 가져와 실행할 클래스에서 사용방법을 보자.
public class Program {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(ConfigJava.class);
Exam exam = context.getBean(Exam.class);
System.out.println(exam.total());
}
}
xml 설정 파일 방식을 사용했을 때는 ApplicationContext 클래스의 인스턴스로 ClassPathXmlApplicationContext 클래스의 인스턴스를 생성했다.
여기서는 설정파일 방식이 아닌 어노테이션 방식을 사용하기 때문에 AnnotationConfigApplicationContext 클래스 인스턴스를 생성한다.
인수로 설정 자바 클래스를 전달하면 된다.
이후에 Bean으로 생성했던 클래스 이름을 인수로 전달하는 getBean() 함수를 사용해 Bean을 얻을 수 있다.
3. 컴포넌트 (Component) 생성
Spring 프레임워크에는 고급 기능을 가진 클래스를 컴포넌트로 정의하고 Bean과 같은 방식으로 사용할 수 있다.
package spring.di.ui;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import spring.di.entity.Exam;
@Component("console")
public class InlineExamConsole implements ExamConsole{
@Autowired(required = false)
@Qualifier("exam1")
private Exam exam;
@Override
public void print() {
if(exam == null) System.out.printf("total is %d, avg is %f\n", 0, 0.0);
else System.out.printf("total is %d, avg is %f\n", exam.total(), exam.avg());
}
public InlineExamConsole() {
}
public InlineExamConsole(Exam exam) {
this.exam = exam;
}
@Override
public void setExam(Exam exam) {
this.exam = exam;
}
}
- @Component : 클래스 선언 앞에 @Component 어노테이션을 작성한다. 이것은 해당 클래스가 컴포넌트임을 나타 내기 위한 것이다.
- @Autowired : 자동으로 객체에 의존성 삽입하는 어노테이션이다. 현재 필드에 @Autowired를 붙였다. 설정 자바 클래스에서 생성된 Bean들 중에서 해당 인스턴스를 찾고 자동으로 이 필드에 할당해주는 것이다. 여기서 required를 false로 옵션을 주면 생성된 Bean들 중에서 해당 인스턴스가 없더라도 오류가 나지 않고 그냥 null값이 들어가도록 허용하는 것이다. 기본값은 true이기 때문에 따로 뒤에 더 작성해줘야한다.
- @qualifier : @qualifier 없이 @Autrowired 할때 두 개 이상의 매칭할 수 있는 객체가 있을때 원하는 객체를 지정해주는 어노테이션이다. 구체적인 이름을 적을 수 있다. 이는 설정 자바 클래스의 메소드의 이름과 같다.
@Autowired
xml 설정파일 방식에서도 그랬듯 객체를 할당 할 방식이 여러가지가 있다.
- 기본생성자가 호출
@Autowired
private Exam exam;
- 생성자가 호출
@Autowired
public InlineExamConsole(Exam exam) {
this.exam = exam;
}
- setter가 호출
@Autowired
@Override
public void setExam(Exam exam) {
this.exam = exam;
}
@ComponentScan
이제 생성한 컴포넌트에 Autowired가 있는지 내용을 스캔해보고 Autowired를 실행해야한다.
이 모든것을 자동으로 해줄 수 있도록 해당 컴포넌트를 스캔을 하도록 지정해줘야한다.
설정 자바 클래스에서 어노테이션을 하나 더 추가하도록 한다.
package spring.di;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import spring.di.entity.Exam;
import spring.di.entity.NewlecExam;
@ComponentScan("spring.di.ui")
@Configuration
public class ConfigJava {
@Bean
public Exam exam1(){
return new NewlecExam();
}
}
@ComponentScan : 스캔을 할 컴포넌트가 있는 package 경로를 작성해주면 자동으로 그 패키지에 있는 컴포넌트를 스캔하고 Autowired 등 처리할 일을 실행해준다.
@Value
xml 방식에서 property와 constructor-arg를 사용하여 변수 값을 초기화 해주었던 것처럼
Java 클래스 내에서는 Value 어노테이션을 사용하여 초기화 할 수 있다.
@Value("20")
private int kor;
@Value("20")
private int eng;
@Value("30")
private int com;
위의 코드들을 다음과 같이 사용할 수 있다.
ApplicationContext context =
new AnnotationConfigApplicationContext(ConfigJava.class);
Exam exam = context.getBean(NewlecExam.class);
System.out.println(exam);
ExamConsole console = (ExamConsole) context.getBean("console");
console.print();
'백엔드 및 서버' 카테고리의 다른 글
[ Spring ] Dispatcher Servlet 및 ViewResolver 설정 (0) | 2021.01.24 |
---|---|
[ Spring ] AOP 설명 및 구현방식(xml) (0) | 2021.01.23 |
[ Spring ] DI (Dependency Injection) xml 방식 설명 및 사용법 (0) | 2021.01.22 |
[ JSP / Servlet ] MVC 패턴이란? (0) | 2020.12.04 |
[ JSP / Servlet ] Filter 사용하기 (0) | 2020.12.02 |