You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
run() 에서 보면 AutoConfigApplication.class 를 넘겨주는데, 이 클래스를 설정 정보로 사용한다는 뜻이다. AutoConfigApplication 에는 @SpringBootApplication 애노테이션이 있는데, 여기에 중요한 설정 정보들이 들어있다.
자동 구성이 내부에서 컴포넌트 스캔을 사용하면 안된다. 대신에 자동 구성 내부에서 @Import는 사용할 수 있다.
자동 구성을 언제 사용하는가?
AutoConfiguration은 라이브러리를 만들어서 제공할 때 사용하고, 그 외에는 사용하는 일이 거의 없다. 왜냐하면 보통 필요한 빈들을 컴포넌트 스캔하거나 직접 등록하기 때문이다. 하지만 라이브러리를 만들어서 제공할 때는 자동 구성이 유용하다. 실제로 다양한 외부 라이브러리들이 자동 구성을 함께 제공한다.
보통 이미 만들어진 라이브러리를 가져다 사용하지, 반대로 라이브러리를 만들어서 제공하는 경우는 매우
드물다. 그럼 자동 구성은 왜 알아두어야 할까?
자동 구성을 알아야 하는 진짜 이유는 개발을 진행 하다보면 사용하는 특정 빈들이 어떻게 등록된 것인지 확인이 필요할 때가 있다. 이럴 때 스프링 부트의 자동 구성 코드를 읽을 수 있어야 한다. 그래야 문제가 발생했을 때 대처가 가능하다. 자동화는 매우 편리한 기능이지만 자동화만 믿고 있다가 실무에서 문제가 발생했을 때는 파고 들어가서 문제를 확인하는 정도는 이해해야 한다. 이번에 학습한 정도면 자동 구성 코드를 읽는데 큰 어려움은 없을 것이다.
남은 문제
그런데 이런 방식으로 빈이 자동 등록되면, 빈을 등록할 때 사용하는 설정 정보는 어떻게 변경해야 하는지 의문이 들 것이다. 예를 들어서 DB 접속 URL, ID, PW 같은 것 말이다. 데이터소스 빈을 등록할 때 이런 정보를 입력해야 하는데, 빈이 자동으로 다 등록이 되어 버린다면 이런 정보를 어떻게 입력할 수 있을까? 다음 장을 통해 알아보자
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
0x08. 자동 구성 이해
8.1. 자동 구성 이해1 - 스프링 부트의 동작
스프링 부트는 다음 경로에 있는 파일을 읽어서 스프링 부트 자동 구성으로 사용한다.
우리가 직접 만든
memory-v2라이브러리와 스프링 부트가 제공하는spring-boot-autoconfigure라이브러리의 다음 파일을 확인해보면 스프링 부트 자동 구성을 확인할 수 있다.memory-v2 - org.springframework.boot.autoconfigure.AutoConfiguration.imports
spring-boot-autoconfigure - org.springframework.boot.autoconfigure.AutoConfiguration.imports
이번에는 스프링 부트가 어떤 방법으로 해당 파일들을 읽어서 동작하는지 알아보자.
이해를 돕기 위해 앞서 개발한
autoconfig프로젝트를 열어보자.스프링 부트 자동 구성이 동작하는 원리는 다음 순서로 확인할 수 있다.
@SpringBootApplication→@EnableAutoConfiguration→@Import(AutoConfigurationImportSelector.class)스프링 부트는 보통 다음과 같은 방법으로 실행한다.
AutoConfigApplicationrun()에서 보면AutoConfigApplication.class를 넘겨주는데, 이 클래스를 설정 정보로 사용한다는 뜻이다.AutoConfigApplication에는@SpringBootApplication애노테이션이 있는데, 여기에 중요한 설정 정보들이 들어있다.@SpringBootApplication@EnableAutoConfiguration
AutoConfigurationImportSelector를 열어보면@Configuration이 아니다.이 기능을 이해하려면
ImportSelector에 대해 알아야 한다.8.2. 자동 구성 이해2 - ImportSelector
@Import에 설정 정보를 추가하는 방법은 2가지가 있다.@Import(클래스) 이것은 정적이다. 코드에 대상이 딱 박혀 있다. 설정으로 사용할 대상을 동적으로 변경할 수 없다.@Import(ImportSelector) 코드로 프로그래밍해서 설정으로 사용할 대상을 동적으로 선택할 수 있다.(1) 정적인 방법
스프링에서 다른 설정 정보를 추가하고 싶으면 다음과 같이
@Import를 사용하면 된다.AConfig,BConfig가 코드에 딱 정해진 것이 아니라, 특정 조건에 따라서 설정 정보를 선택해야 하는 경우에는 어떻게 해야할까?(2) 동적인 방법
ImportSelector인터페이스를 제공한다.이해를 돕기 위해 간단하게
ImportSelector를 사용하는 예제를 만들어보자.(3) ImportSelector 예제
다음 예제들은 모두
src/test하위에 만들자.HelloBean
HelloConfig
HelloBean을 스프링 빈으로 등록한다.HelloImportSelector
ImportSelector인터페이스를 구현했다.hello.selector.HelloConfig설정 정보를 반환한다.ImportSelectorTest
selectorConfig()는SelectorConfig를 초기 설정 정보로 사용한다.SelectorConfig는@Import(HelloImportSelector.class)에서ImportSelector의 구현체인HelloImportSelector를 사용했다.HelloImportSelector를 실행하고,"hello.selector.HelloConfig"라는 문자를 반환받는다.hello.selector.HelloConfig이 설정 정보로 사용된다.HelloBean이 스프링 컨테이너에 잘 등록된 것을 확인할 수 있다.(4) @EnableAutoConfiguration 동작 방식
이제 ImportSelector를 이해했으니 다음 코드를 이해할 수 있다.
@EnableAutoConfiguration
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsmemory-v2 - org.springframework.boot.autoconfigure.AutoConfiguration.imports
spring-boot-autoconfigure - org.springframework.boot.autoconfigure.AutoConfiguration.imports
그리고 파일의 내용을 읽어서 설정 정보로 선택한다.
스프링 부트 자동 구성이 동작하는 방식은 다음 순서로 확인할 수 있다.
org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일을 열어서 설정 정보 선택
0x09. 정리
스프링 부트의 자동 구성을 직접 만들어서 사용할 때는 다음을 참고하자.
@AutoConfiguration에 자동 구성의 순서를 지정할 수 있다.@AutoConfiguration도 설정 파일이다. 내부에@Configuration이 있는 것을 확인할 수 있다.resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports@AutoConfiguration을 제외하는AutoConfigurationExcludeFilter필터가 포함되어 있다.@SpringBootApplication@Import는 사용할 수 있다.자동 구성을 언제 사용하는가?
AutoConfiguration은 라이브러리를 만들어서 제공할 때 사용하고, 그 외에는 사용하는 일이 거의 없다. 왜냐하면 보통 필요한 빈들을 컴포넌트 스캔하거나 직접 등록하기 때문이다. 하지만 라이브러리를 만들어서 제공할 때는 자동 구성이 유용하다. 실제로 다양한 외부 라이브러리들이 자동 구성을 함께 제공한다.드물다. 그럼 자동 구성은 왜 알아두어야 할까?
남은 문제
그런데 이런 방식으로 빈이 자동 등록되면, 빈을 등록할 때 사용하는 설정 정보는 어떻게 변경해야 하는지 의문이 들 것이다. 예를 들어서 DB 접속 URL, ID, PW 같은 것 말이다. 데이터소스 빈을 등록할 때 이런 정보를 입력해야 하는데, 빈이 자동으로 다 등록이 되어 버린다면 이런 정보를 어떻게 입력할 수 있을까? 다음 장을 통해 알아보자
Beta Was this translation helpful? Give feedback.
All reactions