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
참고: 스프링이 로딩되는 과정은 복잡해서 MemoryCondition 이 여러번 호출될 수 있다. 이 부분은 크게 중요하지 않으니 무시하자.
참고
스프링은 외부 설정을 추상화해서 Environment로 통합했다. 그래서 다음과 같은 다양한 외부 환경 설정을 Environment 하나로 읽어 들일 수 있다. 여기에 대한 더 자세한 내용은 뒤에서 다룬다.
#VM Options
#java -Dmemory=on -jar project.jar
-Dmemory=on
#Program arguments
# -- 가 있으면 스프링이 환경 정보로 사용
#java -jar project.jar --memory=on
--memory=on
#application.properties
#application.properties에 있으면 환경 정보로 사용
memory=on
@ConditionalOnXxx
스프링은 @Conditional 과 관련해서 개발자가 편리하게 사용할 수 있도록 수 많은 @ConditionalOnXxx 를 제공한다.
대표적인 몇가지를 알아보자.
- `@ConditionalOnClass` , `@ConditionalOnMissingClass`
- 클래스가 있는 경우 동작한다. 나머지는 그 반대
- `@ConditionalOnBean` , `@ConditionalOnMissingBean`
- 빈이 등록되어 있는 경우 동작한다. 나머지는 그 반대
- `@ConditionalOnProperty`
- 환경 정보가 있는 경우 동작한다.
- `@ConditionalOnResource`
- 리소스가 있는 경우 동작한다.
- `@ConditionalOnWebApplication`,`@ConditionalOnNotWebApplication`
- 웹 애플리케이션인 경우 동작한다.
- `@ConditionalOnExpression`
- SpEL 표현식에 만족하는 경우 동작한다.
참고 @Conditional 자체는 스프링 부트가 아니라 스프링 프레임워크의 기능이다. 스프링 부트는 이 기능을 확장해서 @ConditionalOnXxx 를 제공한다.
정리
스프링 부트가 제공하는 자동 구성 기능을 이해하려면 다음 개념을 이해해야 한다.
@Conditional : 특정 조건에 맞을 때 설정이 동작하도록 한다.
@AutoConfiguration : 자동 구성이 어떻게 동작하는지 내부 원리 이해
지금까지 @Conditional 에 대해서 알아보았으니, 지금부터는 @AutoConfiguration 을 알아보자.
8. 순수 라이브러리 만들기
@AutoConfiguration 을 이해하기 위해서는 그 전에 먼저 라이브러리가 어떻게 사용되는지 이해하는 것이 필요하다.
여러분이 만든 실시간 자바 Memory 조회 기능이 좋다고 소문이 나서, 여러 프로젝트에서 사용하고 싶어한다. 이 기능을 여러곳에서 사용할 수 있도록 라이브러리로 만들어보자.
참고로 라이브러리를 만들 때는 스프링 부트 플러그인 기능을 사용하지 않고 진행한다.
프로젝트 설정 순서
memory-v1-start 의 폴더 이름을 memory-v1으로 변경하자.
프로젝트 임포트
File -> Open -> 해당 프로젝트의 build.gradle 을 선택하자. 그 다음에 선택창이 뜨는데, Open as Project를 선택하자.
build.gradle 확인
plugins {
id 'java'
}
group = 'memory'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:3.0.2'
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
testImplementation 'org.springframework.boot:spring-boot-starter-test:3.0.2'
}
test {
useJUnitPlatform()
}
스프링 부트 플러그인을 사용하게 되면 앞서 설명한 실행 가능한 Jar 구조를 기본으로 만든다.
여기서는 실행 가능한 Jar가 아니라, 다른곳에 포함되어서 사용할 순수 라이브러리 Jar를 만드는 것이 목적이므로 스프링 부트 플러그인을 사용하지 않았다.
그런데 라이브러리를 사용하는 클라이언트 개발자 입장을 생각해보면, 라이브러리 내부에 있는 어떤 빈을 등록해야하는지 알아야 하고, 그것을 또 하나하나 빈으로 등록해야 한다. 지금처럼 간단한 라이브러리가 아니라 초기 설정이 복잡하다면 사용자 입장에서는 상당히 귀찮은 작업이 될 수 있다.
이런 부분을 자동으로 처리해주는 것이 바로 스프링 부트 자동 구성(Auto Configuration)이다.
11. 자동 구성 라이브러리 만들기
우리가 만든 라이브러리를 사용해주는 고마운 고객 개발자를 위해, 프로젝트에 라이브러리를 추가만 하면 모든 구성이 자동으로 처리되도록 해보자. 쉽게 이야기해서 스프링 빈들이 자동으로 등록되는 것이다. 여기에 추가로 memory=on 옵션도 적용할 수 있게 해보자.
이렇게 하려면 메모리 라이브러리의 기능을 업그레이드 해야한다.
기존 프로젝트를 유지하기 위해 프로젝트를 복사하고 일부 수정하자
run() 에 보면 AutoConfigApplication.class 를 넘겨주는데, 이 클래스를 설정 정보로 사용한다는 뜻이다. AutoConfigApplication 에는 @SpringBootApplication 애노테이션이 있는데, 여기에 중요한 설정 정보들이 들어있다.
여기서 우리가 주목할 애노테이션은 @EnableAutoConfiguration 이다. 이름 그대로 자동 구성을 활성화 하는 기능을 제공한다. @EnableAutoConfiguration
@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {…}
@Import 는 주로 스프링 설정 정보(@Configuration )를 포함할 때 사용한다.
그런데 AutoConfigurationImportSelector 를 열어보면 @Configuration 이 아니다.
이 기능을 이해하려면 ImportSelector 에 대해 알아야 한다.
15. 자동 구성 이해2 - ImportSelector
@Import 에 설정 정보를 추가하는 방법은 2가지가 있다.
- 정적인 방법: @Import (클래스) 이것은 정적이다. 코드에 대상이 딱 박혀 있다. 설정으로 사용할 대상을 동적으로 변경할 수 없다.
- 동적인 방법: @Import (ImportSelector ) 코드로 프로그래밍해서 설정으로 사용할 대상을 동적으로 선택할 수 있다.
정적인 방법
스프링에서 다른 설정 정보를 추가하고 싶으면 다음과 같이 @Import 를 사용하면 된다.
자동 구성이 내부에서 컴포넌트 스캔을 사용하면 안된다. 대신에 자동 구성 내부에서 @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.
Uh oh!
There was an error while loading. Please reload this page.
-
6. @conditional
@Conditional이다.지금부터
@Conditional에 대해서 자세히 알아보자. 이름 그대로 특정 조건을 만족하는가 하지 않는가를 구별하는 기능이다.이 기능을 사용하려면 먼저
Condition인터페이스를 구현해야 한다. 그전에 잠깐Condition인터페이스를 살펴보자.Condition
matches()메서드가true를 반환하면 조건에 만족해서 동작하고,false를 반환하면 동작하지 않는다.ConditionContext: 스프링 컨테이너, 환경 정보등을 담고 있다.AnnotatedTypeMetadata: 애노테이션 메타 정보를 담고 있다.Condition인터페이스를 구현해서 다음과 같이 자바 시스템 속성이memory=on이라고 되어 있을 때만 메모리 기능이 동작하도록 만들어보자.MemoryCondition
memory=on이라고 되어 있는 경우에만true를 반환한다.참고: 환경 정보와 관련된 부분은 뒤에서 아주 자세히 다룬다.
MemoryConfig - 수정
@Conditional(MemoryCondition.class)MemoryConfig의 적용 여부는@Conditional에 지정한MemoryCondition의 조건에 따라 달라진다.MemoryCondition의matches()를 실행해보고 그 결과가true이면MemoryConfig는 정상 동작한다. 따라서memoryController,memoryFinder가 빈으로 등록된다.MemoryCondition의 실행결과가false이면MemoryConfig는 무효화 된다. 그래서memoryController,memoryFinder빈은 등록되지 않는다.먼저 아무 조건을 주지 않고 실행해보자.
실행
결과
memory=on을 설정하지 않았기 때문에 동작하지 않는다.다음 로그를 통해서
MemoryCondition조건이 실행된 부분을 확인할 수 있다. 물론 결과는false를 반환한다.이번에는
memory=on조건을 주고 실행해보자.실행
- http://localhost:8080/memory
결과
다음 로그를 확인할 수 있다.
참고: 스프링이 로딩되는 과정은 복잡해서
MemoryCondition이 여러번 호출될 수 있다. 이 부분은 크게 중요하지 않으니 무시하자.참고
스프링은 외부 설정을 추상화해서
Environment로 통합했다. 그래서 다음과 같은 다양한 외부 환경 설정을Environment하나로 읽어 들일 수 있다. 여기에 대한 더 자세한 내용은 뒤에서 다룬다.7. @conditional - 다양한 기능
지금까지
Condition인터페이스를 직접 구현해서MemoryCondition이라는 구현체를 만들었다. 스프링은 이미 필요한 대부분의 구현체를 만들어두었다. 이번에는 스프링이 제공하는 편리한 기능을 사용해보자.MemoryConfig - 수정
@Conditional(MemoryCondition.class)를 주석처리하자@ConditionalOnProperty(name = "memory", havingValue = "on")를 추가하자memory=on이라는 조건에 맞으면 동작하고, 그렇지 않으면 동작하지 않는다.@ConditionalOnProperty
실행
- http://localhost:8080/memory
실행해보면 앞서 만든 기능과 동일하게 동작하는 것을 확인할 수 있다.
@ConditionalOnXxx
스프링은
@Conditional과 관련해서 개발자가 편리하게 사용할 수 있도록 수 많은@ConditionalOnXxx를 제공한다.대표적인 몇가지를 알아보자.
ConditionalOnXxx 공식 메뉴얼
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-auto-configuration.condition-annotations
이름이 직관적이어서 바로 이해가 될 것이다.
@ConditionalOnXxx는 주로 스프링 부트 자동 구성에 사용된다.다음 자동 구성 클래스들을 열어서 소스 코드를 확인해보면
@ConditionalOnXxx가 아주 많이 사용되는 것을 확인할 수 있다.JdbcTemplateAutoConfiguration,DataSourceTransactionManagerAutoConfiguration,DataSourceAutoConfiguration참고
@Conditional자체는 스프링 부트가 아니라 스프링 프레임워크의 기능이다. 스프링 부트는 이 기능을 확장해서@ConditionalOnXxx를 제공한다.정리
스프링 부트가 제공하는 자동 구성 기능을 이해하려면 다음 개념을 이해해야 한다.
@Conditional: 특정 조건에 맞을 때 설정이 동작하도록 한다.@AutoConfiguration: 자동 구성이 어떻게 동작하는지 내부 원리 이해지금까지
@Conditional에 대해서 알아보았으니, 지금부터는@AutoConfiguration을 알아보자.8. 순수 라이브러리 만들기
@AutoConfiguration을 이해하기 위해서는 그 전에 먼저 라이브러리가 어떻게 사용되는지 이해하는 것이 필요하다.여러분이 만든 실시간 자바 Memory 조회 기능이 좋다고 소문이 나서, 여러 프로젝트에서 사용하고 싶어한다. 이 기능을 여러곳에서 사용할 수 있도록 라이브러리로 만들어보자.
참고로 라이브러리를 만들 때는 스프링 부트 플러그인 기능을 사용하지 않고 진행한다.
프로젝트 설정 순서
memory-v1-start의 폴더 이름을memory-v1으로 변경하자.File -> Open -> 해당 프로젝트의
build.gradle을 선택하자. 그 다음에 선택창이 뜨는데, Open as Project를 선택하자.build.gradle 확인
spring-boot-starter-web라이브러리를 선택했다.앞서 개발한 것과 같은 실시간 메모리 조회 기능을 추가하자
Memory
MemoryFinder
MemoryController
MemoryFinderTest
빌드하기
- 다음 명령어로 빌드하자.
-
./gradlew clean build- 빌드 결과
-
build/libs/memory-v1.jar- 다음 명령어를 사용해서 압축을 풀어서 내용을 확인해보자.
-
jar -xvf memory-v1.jarJAR를 푼 결과
-
META-INF-
MANIFEST.MF-
memory-
MemoryFinder.class-
MemoryController.class-
Memory.classmemory-v1.jar는 스스로 동작하지는 못하고 다른 곳에 포함되어서 동작하는 라이브러리이다. 이제 이 라이브러리를 다른 곳에서 사용해보자.9. 순수 라이브러리 사용하기1
프로젝트 설정 순서
project-v1-start의 폴더 이름을project-v1으로 변경하자.File -> Open -> 해당 프로젝트의
build.gradle을 선택하자. 그 다음에 선택창이 뜨는데, Open as Project를 선택하자.build.gradle 확인
Lombok,Spring Web프로젝트가 동작하는지 확인하기 위해 간단한 컨트롤러를 하나 추가하자
HelloController
실행
http://localhost:8080/hello
결과
hello10. 순수 라이브러리 사용하기2
앞서 만든
memory-v1.jar라이브러리를project-v1에 적용해보자.라이브러리 추가
project-v1/libs폴더를 생성하자.memory-v1프로젝트에서 빌드한memory-v1.jar를 이곳에 복사하자.project-v1/build.gradle에memory-v1.jar를 추가하자.files로 지정하면 된다.주의
lib가 아니라libs인 점을 주의하자!프로젝트 임포트
File -> Open -> 해당 프로젝트의
build.gradle을 선택하자. 그 다음에 선택창이 뜨는데, Open as Project를 선택하자.라이브러리 설정
라이브러리를 스프링 빈으로 등록해서 동작하도록 만들어보자.
MemoryConfig
스프링 부트 자동 구성을 사용하는 것이 아니기 때문에 빈을 직접 하나하나 등록해주어야 한다.
메모리 조회 기능이 잘 동작하는지 확인해보자.
서버 실행 로그
실행
http://localhost:8080/memory
결과
{"used": 38174528, "max": 8589934592}메모리 조회 라이브러리가 잘 동작하는 것을 확인할 수 있다.
정리
11. 자동 구성 라이브러리 만들기
우리가 만든 라이브러리를 사용해주는 고마운 고객 개발자를 위해, 프로젝트에 라이브러리를 추가만 하면 모든 구성이 자동으로 처리되도록 해보자. 쉽게 이야기해서 스프링 빈들이 자동으로 등록되는 것이다. 여기에 추가로
memory=on옵션도 적용할 수 있게 해보자.이렇게 하려면 메모리 라이브러리의 기능을 업그레이드 해야한다.
기존 프로젝트를 유지하기 위해 프로젝트를 복사하고 일부 수정하자
memory-v1프로젝트를 복사해서memory-v2를 만들자.settings.gradle - 수정
자동 구성 추가
MemoryAutoConfig
@AutoConfiguration@ConditionalOnPropertymemory=on이라는 환경 정보가 있을 때 라이브러리를 적용한다. (스프링 빈을 등록한다.)자동 구성 대상 지정
파일 생성
src/main/resources/META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.importsorg.springframework.boot.autoconfigure.AutoConfiguration.imports
memory.MemoryAutoConfig를 패키지를 포함해서 지정해준다.org.springframework.boot.autoconfigure.AutoConfiguration.imports의 정보를 읽어서 자동 구성으로 사용한다. 따라서 내부에 있는MemoryAutoConfig가 자동으로 실행된다.빌드하기
./gradlew clean buildbuild/libs/memory-v2.jar스프링 부트 자동 구성 기능이 포함된
memory-v2.jar를 이제 프로젝트에 적용해보자.12. 자동 구성 라이브러리 사용하기1
기존 프로젝트를 유지하기 위해 새로운 프로젝트에 자동 구성 라이브러리를 적용해보자. 앞서 만든
project-v1과 비슷한 프로젝트이다.프로젝트 설정 순서
project-v2-start의 폴더 이름을project-v2으로 변경하자.File -> Open -> 해당 프로젝트의
build.gradle을 선택하자. 그 다음에 선택창이 뜨는데, Open as Project를 선택하자.build.gradle 확인
plugins { id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' id 'java' } group = 'hello' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }Lombok,Spring Web프로젝트가 동작하는지 확인하기 위해 간단한 컨트롤러를 하나 추가하자
HelloController
실행
http://localhost:8080/hello
결과
hello13. 자동 구성 라이브러리 사용하기2
앞서 만든
memory-v2.jar라이브러리를project-v2에 적용해보자.라이브러리 추가
project-v2/libs폴더를 생성하자.memory-v2프로젝트에서 빌드한memory-v2.jar를 이곳에 복사하자.project-v2/build.gradle에memory-v2.jar를 추가하자.dependencies { implementation files('libs/memory-v2.jar') //추가 implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' }files로 지정하면 된다.주의
lib가 아니라libs인 점을 주의하자!프로젝트 임포트
File -> Open -> 해당 프로젝트의
build.gradle을 선택하자. 그 다음에 선택창이 뜨는데, Open as Project를 선택하자.라이브러리 설정
project-v1에서는memory-v1을 사용하기 위해 스프링 빈을 직접 등록했다.project-v2에서 사용하는memory-v2라이브러리에는 스프링 부트 자동 구성이 적용되어 있다. 따라서 빈을 등록하는 별도의 설정을 하지 않아도 된다.memory-v2의 자동 구성에는 다음과 같이 설정했기 때문에memory=on조건을 만족할 때만 실행된다.memory=on조건을 주고 실행해보자.-Dmemory=on를 사용해야 한다.메모리 조회 기능이 잘 동작하는지 확인해보자.
서버 실행 로그
실행
결과
{"used": 38174528, "max": 8589934592}메모리 조회 라이브러리가 잘 동작하는 것을 확인할 수 있다.
memory=on조건을 끄면 라이브러리를 사용하지 않는 것도 확인할 수 있다.정리
@ConditionalOnXxx덕분에 라이브러리 설정을 유연하게 제공할 수 있다.14. 자동 구성 이해1 - 스프링 부트의 동작
스프링 부트는 다음 경로에 있는 파일을 읽어서 스프링 부트 자동 구성으로 사용한다.
resources/META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports우리가 직접 만든
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)스프링 부트는 보통 다음과 같은 방법으로 실행한다.
AutoConfigApplication
run()에 보면AutoConfigApplication.class를 넘겨주는데, 이 클래스를 설정 정보로 사용한다는 뜻이다.AutoConfigApplication에는@SpringBootApplication애노테이션이 있는데, 여기에 중요한 설정 정보들이 들어있다.@SpringBootApplication
@EnableAutoConfiguration이다. 이름 그대로 자동 구성을 활성화 하는 기능을 제공한다.@EnableAutoConfiguration
@Import는 주로 스프링 설정 정보(@Configuration)를 포함할 때 사용한다.AutoConfigurationImportSelector를 열어보면@Configuration이 아니다.이 기능을 이해하려면
ImportSelector에 대해 알아야 한다.15. 자동 구성 이해2 - ImportSelector
@Import에 설정 정보를 추가하는 방법은 2가지가 있다.- 정적인 방법:
@Import(클래스) 이것은 정적이다. 코드에 대상이 딱 박혀 있다. 설정으로 사용할 대상을 동적으로 변경할 수 없다.- 동적인 방법:
@Import(ImportSelector) 코드로 프로그래밍해서 설정으로 사용할 대상을 동적으로 선택할 수 있다.정적인 방법
스프링에서 다른 설정 정보를 추가하고 싶으면 다음과 같이
@Import를 사용하면 된다.AConfig,BConfig가 코드에 딱 정해진 것이 아니라, 특정 조건에 따라서 설정 정보를 선택해야 하는 경우에는 어떻게 해야할까?동적인 방법
ImportSelector인터페이스를 제공한다.ImportSelector
이해를 돕기 위해 간단하게
ImportSelector를 사용하는 예제를 만들어보자.ImportSelector 예제
다음 예제들은 모두
src/test하위에 만들자HelloBean
HelloConfig
HelloBean을 스프링 빈으로 등록한다.HelloImportSelector
ImportSelector인터페이스를 구현했다.hello.selector.HelloConfig설정 정보를 반환한다.ImportSelectorTest
staticConfig()
staticConfig()는 이해하는데 어려움이 없을 것이다. 스프링 컨테이너를 만들고,StaticConfig.class를 초기 설정 정보로 사용했다. 그 결과HelloBean이 스프링 컨테이너에 잘 등록된 것을 확인할 수 있다.selectorConfig()
selectorConfig()는SelectorConfig를 초기 설정 정보로 사용한다.SelectorConfig는@Import(HelloImportSelector.class)에서ImportSelector의 구현체인HelloImportSelector를 사용했다.HelloImportSelector를 실행하고,"hello.selector.HelloConfig"라는 문자를 반환 받는다.hello.selector.HelloConfig이 설정 정보로 사용된다.HelloBean이 스프링 컨테이너에 잘 등록된 것을 확인할 수 있다.@EnableAutoConfiguration 동작 방식
이제
ImportSelector를 이해했으니 다음 코드를 이해할 수 있다.@EnableAutoConfiguration
AutoConfigurationImportSelector는ImportSelector의 구현체이다. 따라서 설정 정보를 동적으로 선택할 수 있다.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
그리고 파일의 내용을 읽어서 설정 정보로 선택한다.
스프링 부트 자동 구성이 동작하는 방식은 다음 순서로 확인할 수 있다.
@SpringBootApplication->@EnableAutoConfiguration->@Import(AutoConfigurationImportSelector.class)->resources/META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports파일을 열어서 설정 정보 선택16. 정리
스프링 부트의 자동 구성을 직접 만들어서 사용할 때는 다음을 참고하자.
@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