@Configuration란?

예린·2024년 11월 27일

SpringBoot

목록 보기
3/3

이번 글에서는 @Configuration이 무엇인지, 왜 필요한지, 어떻게 사용하는지를 자세히 알아봅시다 ~~


🛠️ @Configuration란?

@Configuration은 Spring에서 설정 클래스임을 나타내는 어노테이션입니다. 이 어노테이션이 붙은 클래스는 Spring 컨테이너에 의해 설정 정보를 제공하는 역할을 합니다.

스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용합니다. 여기서 @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록합니다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 합니다.

  • Spring 설정 클래스: 빈(Bean)을 정의하고 의존성을 설정할 수 있는 클래스
  • Spring 컨테이너와의 연결: @Configuration 클래스 내부의 메서드를 통해 객체를 빈으로 등록, 관리

🎯 @Configuration의 역할

1️⃣ Spring Bean 등록

@Configuration을 사용하면 메서드에 @Bean 어노테이션을 붙여 Spring 컨테이너에 객체를 직접 등록할 수 있습니다.

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemberRepository();
    }
}

위 코드의 동작:

  • memberService와 memberRepository가 Spring 컨테이너에 Bean으로 등록됩니다.
  • Spring은 이를 관리하며, 의존성 주입을 자동으로 처리합니다.

2️⃣ Bean의 싱글톤 보장

  • Spring 컨테이너는 기본적으로 Bean을 싱글톤으로 관리합니다.
  • @Configuration 클래스는 메서드가 여러 번 호출되어도 동일한 Bean 객체를 반환합니다.

예제

@Configuration
public class AppConfig {
    @Bean
    public MemberRepository memberRepository() {
        System.out.println("MemberRepository 객체 생성");
        return new MemberRepository();
    }
}

호출 코드

MemberRepository repo1 = appConfig.memberRepository();
MemberRepository repo2 = appConfig.memberRepository();

결과

MemberRepository 객체 생성
  • 출력은 한 번만 발생하며, repo1과 repo2는 동일한 객체를 참조합니다.

3️⃣ 외부 라이브러리 설정

외부 라이브러리의 객체를 Spring Bean으로 등록하고 싶을 때, @Configuration을 활용하면 편리합니다.

예제: Jackson의 ObjectMapper 등록

@Configuration
public class ExternalConfig {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
}
  • 이제 ObjectMapper는 Spring 컨테이너에서 관리되며, 필요한 곳에 의존성 주입을 통해 사용할 수 있습니다.

🧩 @Configuration과 XML 설정의 차이

과거에는 XML을 사용해 Spring 설정을 작성했지만, 자바 기반 설정이 더 직관적이고 유지보수에 유리합니다.

XML 설정 방식

<beans>
    <bean id="memberService" class="com.example.MemberService">
        <constructor-arg ref="memberRepository"/>
    </bean>
    <bean id="memberRepository" class="com.example.MemberRepository"/>
</beans>

자바 기반 설정 방식

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemberRepository();
    }
}

자바 기반 설정의 장점

  • 타입 안전성: 코드 기반이므로 IDE에서 타입 오류를 쉽게 잡아낼 수 있음
  • 가독성: XML보다 간결하고 직관적임
  • 유지보수성: 메서드 호출을 통해 복잡한 의존성 관계를 명확히 표현할 수 있음

💡 언제 사용하면 좋을까?

  1. Bean을 직접 정의하고 관리하고 싶을 때

    • 복잡한 의존성을 수동으로 조작해야 하는 경우 유용함
  2. 외부 라이브러리를 Bean으로 등록할 때

    • 예: ObjectMapper, RestTemplate, 데이터베이스 설정 등
  3. 유연하고 가독성 높은 설정을 원할 때

    • Java Config 방식은 설정이 명확하고 코드 기반으로 관리할 수 있어 유지보수에 유리함

📝 @Configuration 사용 시 주의할 점

  1. 싱글톤 보장

    • @Configuration은 내부적으로 싱글톤을 보장하므로 동일한 객체가 반환됨
  2. @Component와의 관계

    • @Configuration은 내부적으로 @Component를 포함하고 있어, 자동으로 Spring 컨테이너에 등록됨
  3. XML 설정과의 혼용

    • Spring에서는 XML 설정과 자바 설정을 함께 사용할 수도 있지만, 한 가지 방식으로 통일하는 것이 유지보수에 더 좋음

🔑 요약

  • @Configuration은 Spring 설정 클래스를 정의하는 어노테이션
  • 주요 역할:
    • Spring Bean 등록 (@Bean)
    • Bean의 싱글톤 보장
    • 외부 라이브러리 및 설정 객체 관리
  • 장점:
    • 타입 안전성
    • 가독성과 유지보수성
    • XML 설정 대비 직관적

Spring 프로젝트에서 @Configuration을 활용하면 더 유연하고 명확한 설정을 작성할 수 있고, 의존성 관리와 코드 품질 모두를 개선할 수 있습니다. 😊

0개의 댓글