1. 어노테이션
자바에서 어노테이션은 특수한 의미를 부여하는 역할을 수행한다. 따라서 Java config를 활용하기 위해 몇 가지 어노테이션을 살펴보자.
@Configuration | 스프링 설정 클래스를 선언하는 어노테이션 |
@Bean | Bean을 정의하는 어노테이션 |
@ComponentScan | @Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록하는 어노테이션 |
@Component | ComponentScan의 대상이 되는 어노테이션 중 하나로 주로 유틸, 기타 지원 클래스에 붙이는 어노테이션 |
@Autowired | 주입 대상이되는 bean을 컨테이너에 찾아 주입하는 어노테이션 |
이때 우리는 두 가지 방식으로 나누어 Bean을 등록할 수 있다.
- @Configuration 활용
- @ComponentScan 활용
2. Configuration 활용
먼저 Configuration을 활용하는 방법부터 알아보자. 아래 코드를 살펴보자.
@Configuration
public class ApplicationConfig {
@Bean
public Car car(Engine e) {
Car c = new Car();
c.setEngine(e);
return c;
}
@Bean
public Engine engine() {
return new Engine();
}
}
@Configuration은 스프링 설정 클래스라는 의미를 가지며 JavaConfig로 설정을 할 클래스 위에 작성한다. 우리가 이후에 ApplicationContext 컨테이너를 가져오기 위해 AnnotationConfigApplicationContext 객체를 생성할 텐데 이때 해당 객체는 JavaConfig 클래스를 읽어서 IoC와 DI를 적용한다. 이후 JavaConfig 클래스내에서 @Bean을 사용해 Bean들을 등록할 수 있다. 이때 AnnotationConfigApplicationContext는 @Bean이 붙어있는 메서드들을 자동으로 실행하여 그 결과로 리턴하는 객체들을 싱글턴으로 관리한다. 아래와 같은 main문을 실행시키면 올바르게 작동하는 것을 확인할 수 있다. 추가적으로 ApplicationContext는 파라미터를 받아들이지 않는 Bean 생성 메서드를 먼저 실행하여 반환받은 객체를 관리한다. 그리고 파라미터에 생성된 객체들과 같은 타입이 있는 객체가 있는 경우 파라미터로 전달해준다.
public static void main(String[] args) {
ApplicationContext aContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Car car = (Car)aContext.getBean("car");
car.run(); // 결과: Execute Engine
}
위와 같이 AnnotationConfigApplicationContext는 설정을 가지고 있는 클래스를 읽어들이면 되므로 이전에 JavaConfig로 만든 ApplicationConfig 클래스를 넘겨주면 올바르게 작동한다. 또한 getBean의 전달 인자로 "car"과 같이 선언된 이름으로 가져올 수도 있지만 원하는 클래스 타입을 가져오기 위해서 Car.class를 넘겨줄수도 있다.
3. ComponentScan 활용
아래는 ComponentScan을 활용한 예시 코드다.
// JavaConfig 클래스
@Configuration
@ComponentScan("com.example.springExam")
public class ApplicationConfig2 {
}
// Engine 클래스
@Component
public class Engine {
public Engine() {
}
public void exec() {
System.out.println("Execute Engine");
}
}
// Car 클래스
@Component
public class Car {
@Autowired
Engine engine;
public Car() {
}
public void setEngine(Engine e) {
this.engine = e;
}
public void run() {
engine.exec();
}
}
위와 같이 ComponentScan을 사용하면 우리가 일일이 Bean 클래스를 알려주지 않아도 어노테이션이 붙어있는 것들을 찾아서 Bean으로 등록하게 된다. 단, ComponentScan을 사용할 때는 범위가 방대하기 때문 반드시 Package 이름을 알려줘야 한다. 추가적으로 @Autowired를 사용하면 컨테이너가 알아서 원하는 타입의 객체가 생성된 것이 있다면(Bean 클래스가 있다면) 해당 필드에 객체를 넣어주게 된다.
References
'BackEnd > Spring' 카테고리의 다른 글
[Spring JDBC] DataSource를 통해 데이터베이스 연결하기 (0) | 2023.01.27 |
---|---|
[Spring JDBC] Connection Pool, DataSource란? (0) | 2023.01.27 |
[Spring] xml 파일을 활용한 Bean 등록 방법 (0) | 2023.01.25 |
Maven에서 Spring 사용법 (pom.xml 설정) (0) | 2023.01.25 |
IoC/DI 컨테이너란? (0) | 2022.12.27 |