Spring설정 - Xml과 @Configuration

지니·2023년 8월 19일
1

spring

목록 보기
3/13

스프링에서 환경설정을 위해 사용하는 xml과 @Configuration 에 대해서 알아보자


1. Xml을 사용한 Spring 환경설정

  • Spring Framework는 SpringBoot가 나오기 이전부터 사용되어온 대표적인 Java 기반의 엔터프라이즈 애플리케이션 개발 프레임워크이다. 전통적인 Spring Framework에서는 설정을 위해 XML 파일을 주로 사용했다. 이 XML 파일에는 Bean의 정의, 의존성 정보, 각종 설정 등이 포함되어 있었다.

작성예시

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="helloWorld" class="com.example.HelloWorld">
        <property name="message" value="Hello World!"/>
    </bean>

</beans>
  • 위의 예시에서 beans 태그는 루트 엘리먼트이다.

  • bean 태그는 Spring에서 관리하는 객체인 빈(bean)을 정의하는 것이다. bean 태그 안의 id는 빈의 식별자이며, class는 빈의 타입을 나타내는 완전한 클래스 이름이다.

  • property 태그는 빈의 속성을 설정하는 데 사용되며, name은 속성의 이름이고 value는 설정할 값이다.

1-1. 스프링의 XML을 통한 Bean의 의존성 주입처리방식

  • 스프링은 XML 설정을 통해 빈 간의 의존성 주입을 처리한다. constructor-arg 태그나 property 태그에 ref 속성을 사용하면 다른 빈을 참조할 수 있다.
<bean id="helloService" class="com.example.HelloService">
    <property name="helloWorld" ref="helloWorld" />
</bean>

1-2. XML을 사용한 스프링 설정방식의 장점

  • 분리된 설정:
    설정이 코드와 분리되어 있기 때문에, 설정 변경시 애플리케이션 코드를 수정하지 않아도 된다. 이는 설정 변경에 따른 코드의 재컴파일 및 재배포를 최소화한다.

  • 환경별 구성 용이:
    동일한 애플리케이션 코드를 사용하면서도, XML 설정 파일만 변경하면 다양한 환경(개발, 테스트, 운영 등)에 대한 구성을 손쉽게 할 수 있다.

  • 유연성:
    XML은 매우 유연한 설정 방식을 제공한다. 예를 들어, 애플리케이션의 다양한 부분에 대한 세부적인 설정을 쉽게 조정할 수 있다.

1-3. XML을 사용한 스프링 설정방식의 단점

  • 복잡성:
    XML은 복잡한 구조를 가질 수 있다. 특히, 크고 복잡한 프로젝트에서는 XML 설정 파일이 매우 방대하고 복잡해질 수 있다.
  • 유효성 검사의 어려움:
    XML 설정 파일의 문법적 오류는 종종 실행 시간에만 발견될 수 있다. 이는 개발 과정에서 시간을 소모하고, 디버깅을 어렵게 만든다.

  • 타입 안전성 부재:
    XML은 타입을 검사하지 않으므로, 런타임 오류를 발생시킬 수 있는 잘못된 타입의 값을 쉽게 입력할 수 있다.

  • 필요한 추가 작업:
    클래스 경로를 명시적으로 작성해야하며, 수정을 할 때마다 파일을 다시 로드해야 하는 등 추가 작업이 필요하다.

  • 이런 문제점들로 인해, Spring 3.0부터 Java 기반의 설정을 지원하기 시작했다.이때 사용되는 주요 어노테이션은 @Configuration다. 이 어노테이션을 사용하면 Java 코드 내에서 설정을 직접 기술할 수 있다.

2. @Configuration 어노테이션을 활용한 스프링 환경설정

  • Spring 3.0부터는 XML 기반의 설정 방식 외에도 Java 코드를 이용한 설정을 지원하기 시작했다. 이를 위해 주로 사용되는 어노테이션 중 하나가 @Configuration이다. @Configuration을 사용하면, 애플리케이션의 설정 정보를 담은 Java 클래스를 정의할 수 있다.

2-1. @Configuration 어노테이션을 사용하는 방법

  • 설정 클래스를 만들고 위에 @Configuration 어노테이션을 붙여 해당 클래스를 설정 클래스로 지정한다.
@Configuration
public class AppConfig {

}
  • 설정 클래스 내부에서 @Bean 어노테이션을 이용해 빈(bean)을 정의한다. @Bean 어노테이션이 붙은 메서드가 반환하는 객체가 스프링 컨테이너에 등록되는 빈이다.
@Configuration
public class AppConfig {
    @Bean
    public HelloWorld helloWorld() {
        return new HelloWorld();
    }
}
  • 빈의 의존성을 주입하려면 @Autowired 어노테이션을 사용할 수 있다. 또한, 설정 클래스 내부의 메서드를 통해 의존성 주입을 수행할 수도 있다.
@Configuration
public class AppConfig {
    @Bean
    public HelloWorld helloWorld() {
        return new HelloWorld();
    }

    @Bean
    public HelloService helloService() {
        return new HelloService(helloWorld());
    }
}

2-2. @Configuration과 @Bean을 사용하는 Java 기반 설정 방식의 주요 장점은 다음과 같다.

  1. IDE의 도움을 받아 코드를 작성하고 디버깅할 수 있다. 이는 XML 기반 설정보다 훨씬 편리하다.

  2. 컴파일 시간에 설정 오류를 잡아낼 수 있다. XML 기반 설정에서는 실행 시간에만 발견할 수 있는 오류를 미리 방지할 수 있다.

  3. 코드의 재사용성과 모듈화가 향상된다. 설정 클래스를 재사용하거나 필요에 따라 다른 설정 클래스를 사용할 수 있다.

2-3. @Configuration 방식의 장점

  • 코드 지원 도구 활용:
    IDE들은 자바 코드에 대해 강력한 지원을 제공한다. 이를 통해 설정 파일 작성, 리팩토링, 디버깅 등이 더욱 용이하다.

  • 타입 안전성:
    자바는 정적 타입 언어이므로 컴파일 시점에 타입 오류를 잡아낼 수 있다. 이를 통해 런타임 에러를 줄일 수 있다.

  • 조건부 설정:
    @Conditional 어노테이션 등을 이용해 런타임에 따라 다른 빈을 생성하는 등, 조건에 따른 설정이 가능하다.

  • 코드를 통한 설정:
    프로그래밍 코드를 통해 복잡한 빈 초기화, 의존성 설정 등이 가능하다.

2-4. @Configuration 방식의 단점

  • 설정과 코드의 결합:
    설정 정보가 자바 코드에 포함되어 있으므로, 설정을 변경하려면 코드를 수정하고 다시 컴파일 해야 한다.

  • 환경별 설정의 어려움:
    환경별(개발, 테스트, 운영 등)로 다른 설정을 적용하려면 별도의 자바 설정 클래스를 만들거나, 프로파일 기능 등을 활용해야 한다. XML 설정에 비해 이 부분이 약간 복잡할 수 있다.

  • 학습 곡선:
    XML에 비해 자바 설정은 다소 복잡하고, 어노테이션과 기능에 대한 이해가 필요하다. 따라서 학습 곡선이 다소 가파를 수 있다.

  • 위와 같은 장단점을 감안하여, 프로젝트의 요구사항과 팀원들의 스킬 수준, 프로젝트의 복잡도 등을 고려하여 Java 기반 설정을 선택할지, 아니면 XML 기반 설정을 사용할지 결정하면 된다.

3. Xml vs @Configuration

XML 기반 설정과 Java 기반 설정(@Configuration)은 Spring Framework를 설정하는 두 가지 주요 방법이다. 이들은 몇 가지 중요한 차이점을 가지고 있다.

  • 먼저, XML 기반 설정은 설정과 코드를 완전히 분리하는 데 유리하다.
    이는 설정 변경이 코드의 재배포를 필요로 하지 않는다는 의미이다. 반면에, Java 기반 설정은 설정 정보가 코드 내부에 포함되어 있으므로, 설정을 변경하려면 코드를 수정하고 재배포해야 한다.

  • 둘째로, XML 기반 설정은 특히 다양한 환경에 대한 설정을 관리하는 데 유용하다.
    이는 설정 파일만 변경하면 다양한 환경(개발, 테스트, 운영 등)에 대한 설정을 쉽게 관리할 수 있음을 의미한다. 반면에, Java 기반 설정은 환경별 설정을 관리하기 위해 추가적인 작업이 필요할 수 있다. 예를 들어, 별도의 설정 클래스를 만들거나, 프로파일 기능을 활용해야 한다.

  • 세 번째로, XML 설정은 복잡한 빈 생성과 초기화를 위한 유연성을 제공한다.
    그러나 이로 인해 XML 파일이 복잡해질 수 있고, 이를 관리하는 것이 어려울 수 있다. 반면에, Java 기반 설정은 코드를 통해 설정을 관리하므로, IDE의 도움을 받아 타입 검사, 코드 작성, 디버깅 등이 가능하다.

  • 네 번째로, XML 설정은 실행 시간에 오류를 발견하는 반면, Java 기반 설정은 컴파일 시간에 설정 오류를 잡아낼 수 있다.
    이는 Java가 정적 타입 언어이기 때문에 가능하며, 이로 인해 런타임 에러를 줄일 수 있다.

따라서, 이들 각각의 특징을 고려하여 프로젝트의 요구사항에 가장 적합한 설정 방식을 선택해야 한다.

예를 들어, 설정의 유연성과 복잡성이 중요한 요구사항이라면 XML 기반 설정을, 타입 안전성과 IDE의 지원이 중요하다면 Java 기반 설정을 선택할 수 있다.

profile
탐구하는 Backend 개발자

0개의 댓글

관련 채용 정보