본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] XML 설정 방식을 Annotation으로 바꾸기

by 김코더 김주역 2022. 5. 6.
반응형

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

 

[Spring] web.xml 대신에 WebApplicationInitializer 사용하기

1. WebApplicationInitializer 소개 - Spring 3.1의 새로운 기능으로, 서블릿 3.0 환경 이상에서 사용 가능하다. <?xml version="1.0" encoding="UTF-8"?> - web.xml에서 다루는 주요 설정 방식을 모듈화 해서 관..

kimcoder.tistory.com

 

 

 

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

반응형

댓글