1. 자바 코드에 의한 설정이 편리한 점
- 컴파일러나 IDE를 통한 타입 검증이 가능
- IDE의 자동완성 기능의 이용 가능
- 이해의 편리함
- 복잡한 bean 설정이나 초기화 작업을 쉽게 적용 가능
2. 컨텍스트 설정 변경
- 처음부터 프로젝트를 Spring Boot로 만들었을 경우에는 해당 과정을 생략할 수 있다.
- web.xml에서 루트 컨텍스트와 서블릿 컨텍스트의 contextClass 파라미터 값을 모두 AnnotationConfigWebApplicationContext으로 설정하고, contextLocations 파라미터 값을 설정 클래스 또는 스캔 대상 패키지로 설정하면 된다.
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>[클래스 또는 패키지]</param-value>
</context-param>
- 다음과 같이 bean을 자동으로 등록하도록 작성된 xml 설정은 그 아래에 있는 자바 코드로 대체하면 되고, 이 설정 클래스를 web.xml의 contextConfigLocation 값으로 지정해주면 된다.
<beans ...>
<context:component-scan base-package="com.example.demo" />
</beans>
@Configuration
@ComponentScan("com.example.demo")
public class AppConfig {
...
}
- 아예 web.xml 파일도 사용하지 않고 web.xml 설정 내용을 자바 코드로 대체하고 싶다면 WebApplicationInitializer을 구현하면 되는데, 자세한 내용은 아래 포스팅을 참고하자.
https://kimcoder.tistory.com/511
3. Test Context
- 테스트용 XML 설정 파일 대신, 설정용 클래스인 @Configuration 클래스를 사용할 수 있다.
- @Configuration 클래스도 bean으로 등록되며, 어느 인터페이스의 구현체가 될 수도 있다.
- @Configuration을 추가하면 bean 후처리기가 자동으로 등록된다.
(Before) XML 설정 방식
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/testApplicationContext.xml")
public class ATest {
...
}
(After) Annotation 설정 방식
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=TestApplicationContext.class)
public class ATest {
...
}
<TestApplicationContext.java>
@Configuration
public class TestApplicationContext {
...
}
※ 설정 클래스에 @ImportResource("[XML 설정 파일]")를 추가하여 xml 설정 방식과 혼용할 수 있다. 테스트가 아닌 환경에서도 가능하다.
※ 설정 클래스에 @Import([클래스 파일])를 추가하여 클래스로 된 다른 설정 정보(bean)를 불러올 수 있다.
4. <Bean> 전환
- @Bean은 @Configuration이 붙은 설정 클래스에서 주로 사용되는 어노테이션으로, 메소드를 이용하여 bean을 생성할 수 있게 해준다.
- @Bean 메소드는 반드시 public으로 만들어주고 이름은 <bean>의 id값으로 한다. 리턴 타입은 인터페이스를 따르는 것이 바람직하다.
- @Bean 메소드 내부 속성들의 타입은 구현 클래스 타입에 맞게 지정한다.
- XML 설정 방식에서는 <bean> parent 속성을 이용하여 상속이 가능했지만, @Bean 메소드로 전환할 때에는 속성값들을 모두 넣어야 한다.
- 속성에 다른 bean을 주입하는 경우에는 해당 bean을 @Autowired 또는 @Resource로 가져와서 주입하면 된다.
※ @Autowired는 필드의 타입을 기준으로 bean을 찾으며, 중복되는 필드 타입이 있다면 필드의 이름을 기준으로 bean을 찾는다. 그리고 @Resource는 필드의 이름을 기준으로 bean을 찾는다.
(Before) XML 설정 방식
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/mydb?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
(After) Annotation 설정 방식
@Bean
public DataSource dataSource() {
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass(Driver.class); // import com.mysql.jdbc.Driver
dataSource.setUrl("jdbc:mysql://localhost/mydb?characterEncoding=UTF-8");
dataSource.setUsername("root");
dataSource.setPassword("1234");
return dataSource;
}
5. 전용 태그 전환
- Spring 3.1은 XML에서 자주 사용되는 전용 태그를 대체할 수 있는 @Enable~ 어노테이션들을 제공한다.
※ 예) @EnableTransactionManagement : <tx:annotation-driven/>
- XML 에디터의 자동완성 기능을 이용할 수 있다.
6. @Component
1) 클래스에 적용하는 경우
- @Component이 붙은 클래스는 Bean 스캐너에 의해 스캔되어 bean으로 등록된다.
- Bean의 이름은 따로 지정하지 않았다면 클래스 이름의 첫 글자를 소문자로 바꿔서 사용한다. Bean의 이름을 따로 지정하고 싶다면 아래와 같이 명시하면 된다.
@Component("[Bean 이름]")
- @Configuration 설정 클래스에 @ComponentScan 어노테이션을 추가하여, 특정 패키지 아래(서브 패키지 포함)에서만 @Component 어노테이션을 찾을 수 있도록 지정함으로써 bean 스캐너의 부담을 줄일 수 있다. 여러 패키지를 지정할 수도 있다.
@Configuration
@ComponentScan(basePackages="com.example.demo")
public class TestApplicationContext {
...
}
그리고, marker 클래스 및 인터페이스를 지정함으로써 해당 파일이 있는 패키지가 스캔 대상이 되게 할 수 있다. marker 클래스를 이용하면 패키지를 텍스트로 직접 입력하는 것보다 IDE의 도움으로 오타의 위험성이 낮아진다.
@Configuration
@ComponentScan(basePackageClasses=ServiceMarker.class)
public class AppConfig {
...
}
그리고, 특정 어노테이션이 붙은 클래스를 스캔에서 제외시킬 수도 있다. 이 방법으로 자기 자신이 스캔되는 상황을 피할 수 있다. 예를 들어, @Configuration 어노테이션이 붙은 클래스를 제외시키려면 다음과 같이 작성하면 된다.
@Configuration
@ComponentScan(basePackages="com.example.demo", excludeFilters=@Filter(Configuration.class))
public class AppConfig {
...
}
그리고, 특정 클래스를 스캔에서 제외시킬 수도 있다. 아래 예시는 자기 자신이 스캔되는 상황을 피하기 위해 자신을 스캔 대상에서 제외한 것이다.
@Configuration
@ComponentScan(basePackages="com.example.demo",
excludeFilters=@Filter(type=FilterType.ASSIGNABLE_TYPE, value=AppConfig.class))
public class AppConfig {
...
}
2) 어노테이션에 적용하는 경우
- 메타 어노테이션은 어노테이션의 정의에 부여된 어노테이션을 말한다. 특정 어노테이션의 정의에 @Component을 추가하면 해당 어노테이션을 추가하는 클래스도 bean 등록 대상이 된다.
@Component
public @interface FileConnector {
...
}
- DAO bean을 생성할 때는 @Repositroy 어노테이션을 사용하도록 권장되며, @Repository 역시 @Component를 메타 어노테이션으로 가지고 있다.
● 참고 자료 : 토비의 스프링 3.1 Vol.1
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] @Autowired의 4가지 사용 방법 (0) | 2022.06.17 |
---|---|
[Spring] IoC 컨테이너를 통해 애플리케이션이 만들어지는 방식 (0) | 2022.06.07 |
[Spring] 리소스 추상화 (0) | 2022.05.01 |
[Spring] Static 멤버 클래스를 Bean으로 등록하기 (0) | 2022.04.14 |
[Spring] 여러 AOP 및 트랜잭션 기법들 (0) | 2022.04.01 |
댓글