프로그래밍 이야기/SPRING BOOT 공부

@SpringBootApplication 자동구성, @EnableAutoConfiguration

글쓰는 개발자 김뉴네 2023. 9. 25. 06:36
728x90
반응형

xml로 빈 구성

<beans xmlns="https://www.springframwork.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:mvc="http://www.springframwork.org/schema/mvc"
 xsi:schemaLocation="http://www.sparingframwork.org/schema/beans
 http://www.sparingframwork.org/schema/beans/spring-beans.xsd
 http://www.sparingframwork.org/schema/mvc
 http://www.sparingframwork.org/schema/mvc/spring-mvc.xsd
 http://www.sparingframwork.org/schema/context
 http://www.sparingframwork.org/schema/context/spring-context.xsd">

 <context:component-scan base-package="com.sample.web"/>
 <mvc:annotation-driven/>
 <mvc:resources mapping="/static/**" location="/WEB-INF.static/"/>
 </beans>


- 스프링 부트에서 @Configuration 어노테이션을 사용하여 구성을 정의하면 된다 

- 컴포넌트 스캔은 메인 애플리케이션 클래스의 @SpringBootApplication 어노테이션을 사용하여 스캔 대상 패키지를 지정한다.

java Config로 bean 구성하기

//디폴트를 설정을 위해 아무것도 설정하지 않는다

@Configuration

public class ApplicationConfig implements WebMvcConfigurer{

}

@SpringBootApplication(ScanBasePackages ={"com.sample.web"})
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class.args);
}
}


- 스프링 부트는 설정을 변경하지 않으면 미리 정해진 디폴트 설정에 따라 동작한다

- 자동 구성 기능이 디폴트 동작을 설정한다.

- 자동구성을 사용하려면 @EnableAutoConfiguration  또는 @SpringBootApplication 어노테이션을 부여한다.

- @EnableAutoCofiguration은 여러번 부여 할 수 없기 때문에 기본 구성 클래스에 부여할 것을 권장한다.

- 자동구성은 개발자가 직접 명시한 구성을 덮어쓰지 않는다.

- 데이터 베이스에 대한 접속 설정을 정의하면 디폴트의 내장형 데이터 베이스는 자동 구성 대상에서 제외 되며 현재 어떤 자동 구성이 제외 되어있는지 알고 싶다면 인수에 -debug를 지정해 애플리케이션을 실행하면 자동 구성 보고서가 콘솔에 출력된다.

 

- 특정 자동 구성을 비활성화하려면 @EnableAutoConfiguration 어노테이션의 속성에서 제외할 구성 클래스를 지정한다.

- 설정파일의 spring.autoconfigure.exclude 속성으로도 제외가능하며 @SpringBootApplication을 이용할 때도 별칭인 exclude 속성으로 동일하게 처리할 수 있다.

특정자동구성비활성화

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude= {DataSourceAutoConfiguration.class})
public class MyConfiguration{

}


- 메인 애플리케이션 클래스는 스프링 부트의 애플리케이션을 실행하는 메서드를 호출한다.

- 자바 애플리케이션의 엔트리 포인트인 main 메서드 안에서 Spring Application  클래스의 run 메서드를 호출하면 내장된 톰캣이 실행되고 Spring Ioc 컨테이너가 초기화 된다.

- 자동 구성에 의해 @EnableAutoConfiguration이 부여된 클래스의 패키지를 기준으로 동작하기 때문에 메인 애플리케이션 클래스는 디폴트 패키지가 아닌 루트 패키지에 배치할 것을 권장한다.

 

전형적인 디렉토리 구성

- 루트 패키지에 메인 애플리케이션 클래스를 배치함으로써 @ComponentScan의 basePackage 속성을 명시적으로 저장할 필욘느 없으나 scanBasePackageClasses 속성에는 컴포넌트 스캔의 기준 패키지에 배치한 클래스를 지정할 것을 권장한다.  이로인하여 팩터링이 쉬워지고 기준 패키지가 어떤 패키지인지 쉽게 알 수 있다.

 

- 스프링 부트를 사용하는 어플리케이션에는 클래스 대부분 @Configuration, @EnableAutoConfiguration, @ComponentScan을 지정한다 이를 대신하는 어노테이션은 @SpringBootApplication이다.

- @SpringBootApplication은 @EnableAutoConfiguration과 @EnableAutoConfiguration과 @CompnentScan의 속성을 커스터마이즈하는 별칭을 가지고 있어서 대부분이 이 어노테이션을 지정하는 것만으로 대응 가능하다.

 

메인 어플리케이션 클래스

package com.sample.web;

import org.springframework.boot.*;
import org.springframework.boot.autoconfiguration.*;
import org.springframework.streotype.*;
import org.springframework.web.bind.annotation.*;

import com.sampe.ComponentScanBasePackage; // 상위 패키지를 스캔의 기준으로 한다.

//@Configuration, @EnableAutoConfiguration, @ComponentScan을 지정한 것과 동일
@SpringBootApplication(scanBasePackageClasses={ComponentScanBasePackage.class})
@RestController//원래 컨트롤러에 작성할 어노테이션

public class Application{
@RequestMapping("/")//원래 컨트롤러에 작성할 메서드
public String hello(){
return "Hello World";
}

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


컴포넌트 스캔의 기준이 되는 패키지 지정

 

728x90
반응형