@Configuration

코딩냥이·2024년 9월 10일

Annotation

목록 보기
10/34

@Configuration

@Configuration은 스프링 프레임워크에서 Java 기반 구성 클래스를 정의하는 데 사용되는 핵심 어노테이션입니다.

기능

  • 해당 클래스가 하나 이상의 @Bean 메소드를 선언하고 스프링 컨테이너에 의해 처리되어야 함을 나타냅니다.
  • XML 구성을 대체하는 Java 기반 구성을 가능하게 합니다.
  • 스프링의 IoC 컨테이너에 빈 정의의 소스로 작용합니다.

사용 방법

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }

    @Bean
    public EmailService emailService() {
        return new EmailServiceImpl();
    }
}

주요 특징

  1. 중앙 집중식 구성: 애플리케이션의 구성을 한 곳에서 관리할 수 있습니다.
  2. 타입 안전성: Java 코드로 작성되므로 컴파일 시점에 타입 체크가 가능합니다.
  3. 모듈화: 여러 @Configuration 클래스를 만들어 모듈화된 구성이 가능합니다.
  4. 프로그래밍 방식의 구성: 조건문, 반복문 등을 사용한 동적인 빈 구성이 가능합니다.

@Configuration vs @Component

@Configuration@Component의 특화된 형태입니다:

  • @Component: 일반적인 스프링 관리 컴포넌트
  • @Configuration: 빈 정의를 포함하는 구성 클래스

주요 차이점:
1. @Configuration은 CGLIB 프록시를 사용하여 @Bean 메소드의 일관성을 보장합니다.
2. @Configuration 클래스 내의 @Bean 메소드 간 참조가 가능합니다.

빈 의존성 관리

@Configuration 클래스 내에서 빈 간의 의존성을 쉽게 관리할 수 있습니다:

@Configuration
public class AppConfig {

    @Bean
    public UserService userService(EmailService emailService) {
        return new UserServiceImpl(emailService);
    }

    @Bean
    public EmailService emailService() {
        return new EmailServiceImpl();
    }
}

조건부 구성

@Conditional 어노테이션과 함께 사용하여 조건부 구성이 가능합니다:

@Configuration
public class DatabaseConfig {

    @Bean
    @Conditional(MySQLDatabaseCondition.class)
    public DataSource mysqlDataSource() {
        // MySQL DataSource 구성
    }

    @Bean
    @Conditional(PostgreSQLDatabaseCondition.class)
    public DataSource postgresqlDataSource() {
        // PostgreSQL DataSource 구성
    }
}

프로파일 기반 구성

@Profile 어노테이션을 사용하여 환경별 구성을 할 수 있습니다:

@Configuration
@Profile("development")
public class DevelopmentConfig {
    // 개발 환경 전용 빈 정의
}

@Configuration
@Profile("production")
public class ProductionConfig {
    // 운영 환경 전용 빈 정의
}

중첩 클래스 사용

@Configuration 클래스 내에 중첩된 @Configuration 클래스를 정의할 수 있습니다:

@Configuration
public class ParentConfig {

    @Configuration
    public static class ChildConfig {
        @Bean
        public ChildService childService() {
            return new ChildServiceImpl();
        }
    }

    @Bean
    public ParentService parentService() {
        return new ParentServiceImpl();
    }
}

테스트

@Configuration 클래스의 테스트는 다음과 같이 할 수 있습니다:

@SpringBootTest
class AppConfigTest {

    @Autowired
    private UserService userService;

    @Autowired
    private EmailService emailService;

    @Test
    void configurationTest() {
        assertNotNull(userService);
        assertNotNull(emailService);
        // 추가적인 검증 로직
    }
}

베스트 프랙티스

  1. 모듈화: 관련 있는 빈들을 하나의 @Configuration 클래스로 그룹화하세요.
  2. 명확한 이름 지정: 구성 클래스와 빈 메소드에 명확한 이름을 사용하세요.
  3. 의존성 주입 활용: 생성자 주입을 통해 빈 간의 의존성을 명확히 표현하세요.
  4. 프로파일 활용: 환경별 구성이 필요한 경우 @Profile을 활용하세요.
  5. 조건부 구성 사용: 특정 조건에 따라 빈을 구성해야 할 때는 @Conditional을 사용하세요.

결론

@Configuration 어노테이션은 스프링의 Java 기반 구성의 핵심입니다. XML 구성의 대안으로, 타입 안전성과 리팩토링의 용이성을 제공합니다. 적절히 사용하면 애플리케이션의 구조를 명확히 하고, 유지보수성을 높일 수 있습니다. 스프링 부트 애플리케이션에서는 자주 사용되며, 자동 구성과 함께 사용자 정의 구성을 제공하는 강력한 도구입니다.

연관 포스팅

@Component
@Bean
@Autowired
@Value

profile
HelloMeow~!

0개의 댓글