Spring_19) 내가 작성하지 않은 어노테이션, 함부로 지우면 안 되는 이유
2025. 12. 30. 17:02

Topic (오늘의 주제)

@SpringBootApplication은 Spring Boot 애플리케이션의 메인 클래스에 붙이는 어노테이션으로, 세 가지 핵심 기능을 하나로 통합한 편의 어노테이션이다. 이 어노테이션은 필수는 아니지만, Spring Boot의 자동 구성과 컴포넌트 스캔을 활성화하기 위해 거의 항상 사용된다.


Why (왜 사용하는가? 왜 중요한가?)

  • @SpringBootApplication 없이도 Spring Boot 애플리케이션을 만들 수 있지만, 세 가지 어노테이션(@Configuration, @EnableAutoConfiguration, @ComponentScan)을 각각 붙여야 하며 코드가 복잡해집니다. 또한 자동 구성과 컴포넌트 스캔이 활성화되지 않아 Spring Boot의 핵심 기능을 활용할 수 없습니다.

  • @SpringBootApplication을 사용하면 한 줄의 어노테이션으로 Spring Boot의 핵심 기능을 모두 활성화할 수 있습니다. 자동 구성, 컴포넌트 스캔, 설정 클래스 지정을 한 번에 처리하여 코드를 간결하게 만들고, Spring Boot의 편의 기능을 최대한 활용할 수 있습니다.

  • @SpringBootApplication의 구성 요소, 각 구성 요소의 역할, @SpringBootApplication 없이 사용하는 방법, 그리고 언제 꼭 필요한지 이해해야 합니다.


1. @SpringBootApplication이란?

@SpringBootApplication의 정의

@SpringBootApplication은 Spring Boot 애플리케이션의 메인 클래스에 붙이는 편의 어노테이션(Convenience Annotation)입니다.

기본 사용 예시:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication의 구성

@SpringBootApplication은 실제로 세 가지 어노테이션을 합친 것입니다:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration  // @Configuration과 동일
@EnableAutoConfiguration    // 자동 구성 활성화
@ComponentScan              // 컴포넌트 스캔 활성화
public @interface SpringBootApplication {
    // ...
}

즉, 다음과 같이 분해할 수 있습니다:

@SpringBootApplication
= @SpringBootConfiguration  // @Configuration과 동일
+ @EnableAutoConfiguration  // 자동 구성 활성화
+ @ComponentScan            // 컴포넌트 스캔 활성화

2. @SpringBootApplication의 구성 요소

2.1 @SpringBootConfiguration

@SpringBootConfiguration@Configuration과 동일한 기능을 합니다.

역할:

  • 클래스를 스프링 설정 클래스로 지정
  • @Bean 메서드를 가질 수 있게 함
  • 스프링 컨테이너가 이 클래스를 설정 정보로 인식

예시:

@SpringBootConfiguration  // 또는 @Configuration
public class Application {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

@SpringBootConfiguration vs @Configuration:

  • 기능적으로는 동일
  • @SpringBootConfiguration은 Spring Boot 전용 설정 클래스임을 명시
  • 일반적으로 @Configuration을 사용해도 무방

2.2 @EnableAutoConfiguration

@EnableAutoConfiguration은 Spring Boot의 자동 구성을 활성화합니다.

역할:

  • 클래스패스에 있는 라이브러리를 기반으로 자동으로 Bean을 등록
  • spring-boot-autoconfigure 패키지의 자동 구성 클래스들을 활성화
  • 조건부로 Bean을 등록 (클래스패스에 특정 클래스가 있을 때만)

자동 구성 예시:

// 클래스패스에 H2 Database가 있으면 자동으로 DataSource 생성
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        // 자동으로 DataSource 생성
        return new HikariDataSource();
    }
}

자동 구성이 등록하는 Bean들:

  • DataSource: 데이터베이스 연결
  • JdbcTemplate: JDBC 작업
  • EntityManager: JPA 작업
  • DispatcherServlet: 스프링 MVC
  • ViewResolver: 뷰 리졸버
  • 기타 자주 사용하는 Bean들

2.3 @ComponentScan

@ComponentScan은 지정한 패키지와 그 하위 패키지에서 @Component가 붙은 클래스를 찾아서 스프링 빈으로 자동 등록합니다.

역할:

  • @Component, @Service, @Repository, @Controller 등이 붙은 클래스를 스캔
  • 자동으로 스프링 빈으로 등록
  • 기본적으로 @ComponentScan이 붙은 클래스의 패키지와 하위 패키지를 스캔

스캔 대상:

@Component
public class UserValidator { }

@Service
public class UserService { }

@Repository
public class UserRepository { }

@Controller
public class UserController { }

기본 스캔 범위:

@SpringBootApplication  // com.example 패키지에 있다면
public class Application {
    // com.example와 그 하위 패키지를 자동으로 스캔
}

3. @SpringBootApplication 없이 사용하기

@SpringBootApplication은 필수가 아니다

@SpringBootApplication은 편의 어노테이션이므로, 세 가지 어노테이션을 각각 사용해도 동일한 효과를 얻을 수 있습니다.

대체 방법 1: 세 가지 어노테이션을 각각 사용

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

결과:

  • @SpringBootApplication과 동일하게 동작
  • 코드가 약간 더 길어짐

대체 방법 2: @SpringBootConfiguration 사용

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

결과:

  • @SpringBootApplication과 동일하게 동작
  • @SpringBootConfiguration은 @Configuration과 동일

대체 방법 3: 일부 기능만 사용

@Configuration
@ComponentScan
// @EnableAutoConfiguration 없음
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

결과:

  • 자동 구성이 비활성화됨
  • 모든 Bean을 수동으로 등록해야 함
  • Spring Boot의 편의 기능을 활용할 수 없음

4. @SpringBootApplication이 꼭 필요한 경우

Spring Boot의 핵심 기능을 사용하려면 필수

@SpringBootApplication 없이도 애플리케이션을 만들 수 있지만, Spring Boot의 핵심 기능을 사용하려면 @EnableAutoConfiguration이 필요합니다.

필수인 이유

  1. 자동 구성 활성화

    • @EnableAutoConfiguration이 없으면 자동 구성이 비활성화됨
    • DataSource, JdbcTemplate, DispatcherServlet 등을 수동으로 등록해야 함
    • Spring Boot의 편의 기능을 활용할 수 없음
  2. 컴포넌트 스캔 활성화

    • @ComponentScan이 없으면 @Component, @Service, @Repository, @Controller가 자동으로 등록되지 않음
    • 모든 클래스를 수동으로 Bean으로 등록해야 함
  3. 설정 클래스 지정

    • @Configuration이 없으면 설정 클래스로 인식되지 않음
    • @Bean 메서드를 사용할 수 없음

실제 비교 예시

@SpringBootApplication 사용 (권장)

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Service
public class UserService {
    // 자동으로 스프링 빈으로 등록됨
}

장점:

  • ✅ 한 줄의 어노테이션으로 모든 기능 활성화
  • ✅ 코드가 간결함
  • ✅ Spring Boot의 모든 편의 기능 활용 가능

@SpringBootApplication 없이 사용 (비권장)

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Service
public class UserService {
    // 자동으로 스프링 빈으로 등록됨
}

결과:

  • 기능적으로는 동일하게 동작
  • 코드가 약간 더 길어짐
  • 가독성이 떨어짐

자동 구성 없이 사용 (비권장)

@Configuration
@ComponentScan
// @EnableAutoConfiguration 없음
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    // 모든 Bean을 수동으로 등록해야 함
    @Bean
    public DataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("jdbc:h2:mem:testdb");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    // ... 수많은 Bean 설정
}

문제점:

  • ❌ Spring Boot의 자동 구성 기능을 활용할 수 없음
  • ❌ 모든 Bean을 수동으로 등록해야 함
  • ❌ 설정 코드가 복잡해짐
  • ❌ Spring Boot를 사용하는 의미가 없어짐

5. @SpringBootApplication의 커스터마이징

컴포넌트 스캔 범위 지정

@SpringBootApplication(scanBasePackages = "com.example")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

설명:

  • 기본적으로 @ComponentScan이 붙은 클래스의 패키지와 하위 패키지를 스캔
  • scanBasePackages로 스캔 범위를 명시적으로 지정 가능

특정 자동 구성 제외

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

설명:

  • 특정 자동 구성을 제외하고 싶을 때 사용
  • 예: DataSource를 수동으로 설정하고 싶을 때

여러 자동 구성 제외

@SpringBootApplication(exclude = {
    DataSourceAutoConfiguration.class,
    JdbcTemplateAutoConfiguration.class
})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

6. @SpringBootApplication vs 개별 어노테이션

비교표

방식 코드 길이 가독성 기능 권장도
@SpringBootApplication 짧음 좋음 동일 ⭐⭐⭐⭐⭐
개별 어노테이션 길음 보통 동일 ⭐⭐⭐
자동 구성 없이 매우 길음 나쁨 제한적

언제 개별 어노테이션을 사용하나?

일반적으로는 @SpringBootApplication을 사용하지만, 다음과 같은 경우에는 개별 어노테이션을 사용할 수 있습니다:

  1. 명시적으로 각 기능을 구분하고 싶을 때

    @Configuration
    @EnableAutoConfiguration
    @ComponentScan
    public class Application { }
  2. 일부 기능만 사용하고 싶을 때

    @Configuration
    @ComponentScan
    // @EnableAutoConfiguration 없음
    public class Application { }
  3. 레거시 코드와의 통합

    • 기존 Spring Framework 코드와 통합할 때

7. 실제 사용 예시

기본 사용 (가장 일반적)

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

커스터마이징된 사용

@SpringBootApplication(
    scanBasePackages = "com.example",
    exclude = {DataSourceAutoConfiguration.class}
)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

개별 어노테이션 사용

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = "com.example")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

요약

  • @SpringBootApplication@Configuration, @EnableAutoConfiguration, @ComponentScan을 합친 편의 어노테이션입니다.
  • @SpringBootApplication의 구성 요소:
    • @SpringBootConfiguration (또는 @Configuration): 설정 클래스 지정
    • @EnableAutoConfiguration: 자동 구성 활성화
    • @ComponentScan: 컴포넌트 스캔 활성화
  • @SpringBootApplication은 필수가 아니지만, Spring Boot의 핵심 기능을 사용하려면 거의 항상 필요합니다.
  • 대체 방법: 세 가지 어노테이션을 각각 사용해도 동일한 효과를 얻을 수 있지만, 코드가 복잡해집니다.
  • 권장 사항: Spring Boot 애플리케이션에서는 @SpringBootApplication을 사용하는 것이 가장 간결하고 명확합니다.
  • 커스터마이징: scanBasePackages, exclude 등의 속성으로 동작을 커스터마이징할 수 있습니다.

참고 자료