Gidhub BE Developer

Spring 프레임워크 핵심 기술 - Bean 설정 방법 : @SpringBootApplication 애노테이션

2019-09-17
goodGid

이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.

개요

  • Application에 Baen 설정 파일을 어떻게 설정하는지

    여러 가지 방법을 통해 알아보자.

  • 글의 순서는 큰 상관은 없지만

    가능하다면 순서로대 보는걸 추천한다.

  1. XML 파일에 직접 Bean 등록 방식

  2. XML 파일에 Component Scan 방식

  3. Java 설정 파일에 직접 Bean 등록 방식

  4. Java 설정 파일에 Component Scan 방식

  5. @SpringBootApplication


머릿말

  • 앞선 글에서 다뤘던 설정 방법은

    프로그래머가 설정을 해줘야했다면

    @SpringBootApplication 애노테이션은

    스프링 부트 자체적으로 기본적인 설정을 해주게 된다.


@SpringBootApplication

  • 기존에 Application.java의 코드는 다음과 같다.
public class Application {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        String[] beans = context.getBeanDefinitionNames();
        System.out.println(Arrays.toString(beans));
        BookService bookService = (BookService) context.getBean("bookService");
        System.out.println(bookService.bookRepository != null);
    }
}
  • Component Scan을 하기 위해서

    기존엔 Config 파일 혹은 xml 파일이 필요했다.


  • 하지만 Spring Boot 환경에선

    @SpringBootApplication 애노테이션을 사용하게 되면

    그러한 파일들이 불필요해진다.

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
    }
}
  • @SpringBootApplication의 정의를 보자.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration // [1]
@EnableAutoConfiguration
@ComponentScan( // [2]
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    ...
}

[1] : @SpringBootConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
  • @SpringBootConfiguration안에

    @Configuration 애노테이션이 달려 있기 때문에

    ComponentScan과 마찬가지로

    Config 파일 혹은 XML 파일을 생성하지 않아도 된다.


[2] : @ComponentScan

  • 메타 애노테이션에서 @ComponentScan를 볼 수 있다.

  • 즉 기존에 Component Scan을 위해

    Config 파일 혹은 XML 파일이 필요했지만

    @SpringBootApplication 애노테이션에 이미

    포함되어 있기 때문에 Config 파일 혹은 XML 파일을 생성하지 않아도 된다.


Example Code

Business Code

BookRepository

@Repository
public class BookRepository {
}

BookService

@Service
public class BookService {
    BookRepository bookRepository;

    public void setBookRepository(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

Component Scan 설정 파일

Java 설정 파일을 사용할 경우 : ApplicationConfig.java

@Configuration // Bean 설정파일이다를 알려주기 위해서
//@ComponentScan(basePackages = "goodgid.study.spring") // Type Safe 하지 않다.
@ComponentScan(basePackageClasses = Application.class) // Type Safe 하다.
public class ApplicationConfig {
}

XML 설정 파일을 사용할 경우 : Application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  <context:component-scan base-package="goodgid.study.spring"/>
</beans>
  • @SpringBootApplication 애노테이션 사용하게 되면

    Component Scan을 위한 설정 파일들이 불필요해진다.


Summary

  • Business Code와

    Application.java 파일만 있으면

    Application이 정상적으로 동작하는 것을 확인할 수 있다.

  • 즉 @SpringBootApplication 애노테이션을 사용하기 때문에

    Config 파일 혹은 XML 파일들이 불필요해진다.


Reference


Recommend

Index