ํ๋ ์์ํฌ ์์ ํด๋์ค
๋ชจ๋ Spring Boot ํ๋ก์ ํธ์๋ @SpringBootApplication.
@SpringBootApplication
๊ณต์ฉ ํด๋์ค Application {
public static void main (String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
๋ฉ์๋๋ฅผ ์ง์ ์ดํด๋ณด๋ฉด SpringApplication.run์ ์ฒด ์์ ํ๋ก์ธ์ค๊ฐ SpringBootApplication ์์ฑ์ ์ run ๋ฉ์๋ ์คํ์ด๋ผ๋ ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด์ ธ ์์์ ์ ์ ์์ต๋๋ค .
public static ConfigurableApplicationContext run (Class<?>[] PrimarySources, String[] args) {
return new SpringApplication (primarySources).run(args);
}
ํต์ฌ ์ฃผ์
์ฃผ์์ ์ด๋ฉด @SpringBootApplication์ฌ๋ฌ ์ฃผ์์ด ํ์๋์ง๋ง ์ธ ๊ฐ์ง ํต์ฌ ์ฃผ์์ ์ง์คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
@SpringBootConfiguration
- ๋ณธ์ง์ ์ผ๋ก ์ด๋ ์ฃผ์์ ๋ํผ์ ๋๋ค @Configuration. JavaConfig๋ฅผ ํตํด Bean์ ๊ตฌ์ฑํ๊ณ ํ์ฌ ํด๋์ค๋ฅผ ๊ตฌ์ฑ ํด๋์ค๋ก ํ์ํฉ๋๋ค.
@EnableAutoConfiguration
- ์ฃผ์์ ์ด๋ฉด AutoConfigurationPackage ๋ฐ @Import(AutoConfigurationImportSelector.class)๋ผ๋@EnableAutoConfiguration ๋ ๊ฐ์ง ํต์ฌ ์ฃผ์์ด ํ์๋ฉ๋๋ค.
- @AutoConfigurationPackage์ฃผ์ ๊ณผ ์๋ฏธ๊ฐ ์ ์ฌํฉ๋๋ค @Component. ํ๋๋ ์๋ ๊ตฌ์ฑ ํด๋์ค๋ฅผ ๋ก๋ํ๊ธฐ ์ํด ์ฃผ์์ ์๋์ผ๋ก ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๋ค๋ฅธ ํ๋๋ ์ง์ ๋ ๊ฒฝ๋ก๋ฅผ ์ค์บํ์ฌ Bean์ ์ฃผ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. @AutoConfigurationPackage๋จ์ผ ๊ฒฝ๋ก์ ๋ก๋ํ ์๋ ๊ตฌ์ฑ ํด๋์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ฃผ์์ ์ฌ์ฉํ๋ฉด ๊ฐ ํด๋์ค๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ถ๊ฐํ ํ์๊ฐ ์์ผ๋ฏ๋ก @Import๊ฐ๋จํ ํจํค์ง ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ ํธ๋ฆฌํด์ง๋๋ค. @ComponentScan์๋ฅผ ๋ค์ด ์ผ๋ถ Bean์ด SpringBootApplication๊ณผ ๋์ผํ ๊ฒฝ๋ก์ ์์ง ์์ ๊ฒฝ์ฐ ํจํค์ง ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- @Import(AutoConfigurationImportSelector.class)AutoConfigurationImportSelectorํด๋์ค, ํนํ ํด๋น ๋ฉ์๋๋ฅผ ํฌํจํฉ๋๋ค getCandidateConfigurations(). ์ด ๋ฉ์๋๋ SpringFactoriesLoader.loadFactoryNames()META-INF/spring.factories ํ์ผ์ ๋์ด๋ ๋ชจ๋ ์๋ ๊ตฌ์ฑ ํด๋์ค๋ฅผ ์ฐพ์ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
@ComponentScan
- ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ํจํค์ง์ ํด๋น ํ์ ํจํค์ง๋ฅผ ๊ฒ์ฌํฉ๋๋ค. @Component, @Controller, @Service, ๋ฑ ์ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ @Repository์ปจํ ์ด๋์ ๋ฑ๋กํ์ฌ ์ฌ์ฉํฉ๋๋ค.
์์ ์ฃผ์์ ํ์ํ ํด๋์ค๋ฅผ ํด๋์ค ๊ฒฝ๋ก์ ๋ก๋ํ ๋ฟ์ ๋๋ค. ํด๋์ค๋ฅผ ํ๋ํ๊ณ ์ด๋ฅผ Bean์ผ๋ก ๋ณํํ๋ ์ค์ ํ๋ก์ธ์ค๋ run ๋ฉ์๋์์ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ๋ํ ์ง๋ฌธ์ ๋ตํ ๋ ๋จผ์ ํต์ฌ ์ฃผ์์ ์ธ๊ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ธฐ๋ณธ ์์ ํ๋ก์ธ์ค๋ ์ฌ์ ํ SpringBootApplcation ํด๋์ค์ ์์ฑ์์ ์คํ ๋ฉ์๋๋ฅผ ์ค์ฌ์ผ๋ก ์งํ๋ฉ๋๋ค.
์์ฑ์ ๋ฉ์๋
public SpringApplication (ResourceLoaderresourceLoader, Class<?>...primarySources) {
this .resourceLoader =resourceLoader;
Assert.notNull(primarySources, "PrimarySources๋ null์ด ์๋์ด์ผ ํฉ๋๋ค." );
this .primarySources = new LinkedHashSet <>(Arrays.asList(primarySources));
// ์น ํ๊ฒฝ์ธ์ง ํ์ธํ๊ธฐ ์ํด ์๋ธ๋ฆฟ ํด๋์ค๊ฐ ๋ก๋๋์๋์ง ํ์ธํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ ๊ฒฐ์ ํฉ๋๋ค.
this .webApplicationType = WebApplicationType.deduceFromClasspath();
this .bootstrappers = new ArrayList <>(getSpringFactoriesInstances(Bootstrapper.class));
// META-INFO/spring.factories ํ์ผ์ ์ฝ๊ณ ํด๋น ApplicationContextInitializer๋ฅผ ์ปฌ๋ ์
์ผ๋ก ์ด์
๋ธํฉ๋๋ค.
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
// ๋ชจ๋ ๋ฆฌ์ค๋ ์ค์
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// ๋ฉ์ธ ๋ฉ์๋ ์ถ๋ก
this .mainApplicationClass = deduceMainApplicationClass();
}
์์ฑ์ ๋ฉ์๋๋ ์ฃผ๋ก ๋ค์ ์์ ์ ์ํํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
- ์๋ธ๋ฆฟ ํด๋์ค๊ฐ ๋ก๋๋์๋์ง ํ์ธํ์ฌ ์น ํ๊ฒฝ์ธ์ง ํ๋จํฉ๋๋ค.
- ApplicationContextInitializer์๋ ์ ํ์ ํด๋์ค๋ฅผ ๊ฒ์ํ์ฌ ๋ชจ๋ ์ด๊ธฐํ ํ๋ก๊ทธ๋จ์ ์ป์ต๋๋ค META-INF/spring.factories. ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๋ฅผ ํ๋ํ๊ณ Spring ์ธ์คํด์ค ์์ ์ ํ์ ์ฝ๋ฐฑ ์์ ์ ์ํํฉ๋๋ค.
- ๊ตฌ์ฑ์ ์ค์บํ๊ณ ํด๋น ํด๋์ค ์ธ์คํด์ค๋ฅผ ๋ก๋ํ์ฌ ์ง์ 2์ ์ ์ฌํ ๋ชจ๋ ๋ฆฌ์ค๋๋ฅผ ํ๋ํฉ๋๋ค.
- ์ฃผ์ ๋ฉ์๋๋ฅผ ์ฐพ์ต๋๋ค.
runโ
/**
* Spring ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ์ฌ ์๋ก์ด
* { @link ApplicationContext}๋ฅผ ์์ฑํ๊ณ ์๋ก ๊ณ ์นฉ๋๋ค.
*
* @param์ ์ ํ๋ฆฌ์ผ์ด์
์ธ์๋ฅผ ์ธ์ํฉ๋๋ค(์ผ๋ฐ์ ์ผ๋ก Java ๊ธฐ๋ณธ ๋ฉ์๋์์ ์ ๋ฌ๋จ)
* @return a running { @link ApplicationContext}
*/
public ConfigurableApplicationContext run (String... args) {
// ํ๋ก์ ํธ ์์ ์๊ฐ์ ์ธก์ ํ๊ธฐ ์ํด ์คํฑ์์น๋ฅผ ์์ํฉ๋๋ค.
StopWatch stopWatch = ์๋ก์ด StopWatch ();
stopWatch.start();
// ๋ถํธ์คํธ๋ฉ ์ปจํ
์คํธ ๊ฐ์ฒด, ์ฆ Spring์ ๋ฃจํธ ์ปจํ
์ด๋๋ฅผ ์์ฑํฉ๋๋ค.
DefaultBootstrapContext bootstrapContext = createBootstrapContext();
// ๊ตฌ์ฑ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ์ ๋ํ ๋ณ์๋ฅผ ์ ์ํฉ๋๋ค.
ConfigurableApplicationContext context = null ;
/**
* JDK ์์คํ
์์ฑ ์ค์
* 'ํค๋๋ฆฌ์ค'๋ ๋ง ๊ทธ๋๋ก ํค๋๋ฆฌ์ค ๋ชจ๋๋ฅผ ์๋ฏธํฉ๋๋ค.
* ์ด๋ Spring Boot๊ฐ ๋ง์ฐ์ค ๋ฐ ํค๋ณด๋ ์ง์์ด ์๋ ํ๊ฒฝ,
* ์ผ๋ฐ์ ์ผ๋ก Linux์ ๊ฐ์ ์๋ฒ์์ ์คํ๋ ๊ฒ์ผ๋ก ์์๋จ์ ๋ํ๋
๋๋ค. ์ฌ๊ธฐ์ ๊ธฐ๋ณธ๊ฐ์ true์
๋๋ค.
*/
configureHeadlessProperty();
/**
* ์์ ์ธ๊ธํ getSpringFactoriesInstances ๋ฉ์๋๋ฅผ ํธ์ถํ๋ getRunListeners๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ๋ฆฌ์ค๋๋ฅผ ๊ฒ์ํฉ๋๋ค.
* spring.factories์์ ๊ตฌ์ฑ์ ๊ฐ์ ธ์ต๋๋ค.
*/
SpringApplicationRunListeners listenings = getRunListeners(args);
// ๋ฆฌ์ค๋๋ฅผ ์์ํฉ๋๋ค
.listeners.starting(bootstrapContext, this .mainApplicationClass);
try {
// ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
์ธ์, ์ฆ ๋ช
๋ น์ค์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ํ ๋ ์ ๋ฌ๋๋ ์ธ์๋ฅผ ๋ํํฉ๋๋ค. ์: --server.port=9000
ApplicationArguments applicationArguments = new DefaultApplicationArguments (args);
//
/** * prepareEnvironment๋ * getOrCreateEnvironment,configureEnvironment,configurePropertySources,configureProfiles, *environmentPrepared,bindToSpringApplication,attach ๋ฐ ์๋ ์์ ์์ ๋ณผ ์ ์๋ ๊ธฐํ ๋ฉ์๋๋ฅผ
ํฌํจํ๋ ์ค์ํ ๋จ๊ณ์
๋๋ค. */
ConfigurableEnvironment ํ๊ฒฝ = prepareEnvironment(listeners, bootstrapContext , ์ ํ๋ฆฌ์ผ์ด์
์ธ์);
// ๋ฌด์๋ ๋น์ ๊ตฌ์ฑํฉ๋๋ค.
configureIgnoreBeanInfo(ํ๊ฒฝ);
// ์์ ์ ์ฝ์์ ํ์๋๋ ๋ก๊ณ ์ธ Spring Boot ๋ฐฐ๋๋ฅผ ์ธ์ํฉ๋๋ค. src/main/resources์ ๋ฐฐ๋๋ผ๋ ์ฌ์ฉ์ ์ ์ ํ์ผ์ ๋ฐฐ์นํ ์ ์์ต๋๋ค.
Banner PrintedBanner = printBanner(environment);
// IOC ์ปจํ
์ด๋ ์์ฑ
์ปจํ
์คํธ = createApplicationContext();
// ์คํ ํ๋ก๊ทธ๋จ์ ์ค์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์์์ ์์ํฉ๋๋ค.
context.setApplicationStartup( this .applicationStartup);
// IOC ์ปจํ
์ด๋ ๊ธฐ๋ณธ์ ๋ณด ์ค์ (Spring ์ปจํ
์ด๋ ์ ์ฒ๋ฆฌ)
prepareContext(bootstrapContext, context, Environment, listeningrs, applicationArguments, PrintedBanner);
/**
* IOC ์ปจํ
์ด๋ ์๋ก ๊ณ ์นจ
* ์ฌ๊ธฐ์๋ Spring ์ปจํ
์ด๋ ์์, ์๋ ๋ฐฐ์ ํ์ฑํ, ์น ์๋น์ค๋ฅผ ์์ํ๊ธฐ ์ํ WebServer ์์ฑ, ์ฆ Spring Boot์ ๋ด์ฅ๋ Tomcat ์คํ์ด ํฌํจ๋ฉ๋๋ค.
*/
refreshContext(context);
/**
* ์ปจํ
์ด๋๊ฐ ์๋ก ๊ณ ์ณ์ง ํ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ์ ์ ์ ๋ก์ง์ ์ ์ํ ์ ์๋๋ก ํ์ฉ
* ์๋ก ๊ณ ์นจ ํ Spring ์ปจํ
์ด๋์ ํ์ฒ๋ฆฌ
*/
afterRefresh(context, applicationArguments);
// ํ์ด๋จธ๋ฅผ ์ค์งํ๊ณ ์์ ํ ์ฝ์์ ํ์๋๋ ์๊ฐ์ ์ธ์ํฉ๋๋ค.
stopWatch.stop();
if ( this .logStartupInfo) {
// ์์์ด ์๋ฃ๋๋ฉด ๋ํ๋๋ ๋ก๊ทธ๋ฅผ ์ธ์ํฉ๋๋ค
new StartupInfoLogger ( this .mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
}
// ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๊ฐ ์์๋์์์ ๋ํ๋ด๋ ์ด๋ฒคํธ ๊ฒ์; ๋ชจ๋ ์คํ ๋ฆฌ์ค๋๋ ์์๋() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค
.listeners.started(context);
// ๋ชจ๋ ์คํ๊ธฐ๋ฅผ ๋ฐ๋ณตํ๊ณ ํด๋น ์คํ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์คํ๊ธฐ๋ฅผ ์คํํฉ๋๋ค.
callRunners(context, applicationArguments);
} catch (Throwable ex) {
// ์คํ ํ๋ก์ธ์ค ์ค ์ค๋ฅ์ ๋ํ ์์ธ ์ฒ๋ฆฌ
handlerRunFailure(context, ex, listenings); ์๋ก์ด IllegalStateException์
๋ฐ์์ํต๋๋ค (์); } try { // ๋ชจ๋ ์คํ ๋ฆฌ์ค๋๋ running() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ฅผ ์์ ํฉ๋๋ค .listeners.running(context); } catch (Throwable ex) { // ์์ธ ์ฒ๋ฆฌ handlerRunFailure(context, ex, null ); ์๋ก์ด IllegalStateException์ ๋ฐ์์ํต๋๋ค (์); }
// ์ต์ข
๋น๋๋ ์ปจํ
์ด๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค .
return context;
}
๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ AbstractApplicationContext.refresh๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
์ด run๋ฐฉ๋ฒ์ ์ฃผ๋ก ๊ตฌ์ฑ ํ๊ฒฝ, ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์์ฑํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ์์ํฉ๋๋ค. ์ด ํ๋ก์ธ์ค ๋ด์์ ์ด refresh๋ฉ์๋๋ Spring Bean์ ๋ผ์ดํ์ฌ์ดํด์ ์นจํฌํ์ฌ Bean์ ๋ํ ๋ผ์ดํ์ฌ์ดํด ์ ํ ํํฌ ๋ฉ์๋๋ฅผ ์คํํ๊ณ Spring ์ฃผ์์ผ๋ก ์ฃผ์์ด ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ด onRefresh๋จ๊ณ์์๋ Java ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ Tomcat ์ปจํ ์ด๋๊ฐ ๊ตฌ์ฑ๋๊ณ ์์๋ฉ๋๋ค.
๋ฐฉ๋ฒrefreshโ
๋๋ฌด ๋ง์ ์ฝ๋๋ฅผ ๊ธฐ์ตํ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ๋ ๋์ ๋ช ๋ฌธ์ฅ์ผ๋ก ์์ฝํ๊ฒ ์ต๋๋ค.
์ ๋ฐ์ ์ผ๋ก ์ด refresh๋ฐฉ๋ฒ์ ๋น์ ์๋ช ์ฃผ๊ธฐ์ ๊ฑธ์ณ ์์ต๋๋ค.
invokeBeanFactoryPostProcessors
- ์ด ๋ฉ์๋๋ BeanDefinitionRegistryPostProcessor ๋ฐ BeanFactoryPostProcessorinvokeBeanFactoryPostProcessors ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ Bean ํฉํ ๋ฆฌ์ ๋ชจ๋ Bean์ ์๋ณํฉ๋๋ค . ๊ทธ๋ฐ ๋ค์ ํฌ์คํธ ํ๋ก์ธ์ ๋ด์์ ๋ฐ ๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค.postProcessBeanDefinitionRegistry()postProcessBeanFactory()
- ์ด ๋ฉ์๋๋ , ๋ฑ ์ doProcessConfigurationClassSpring Boot ์ฃผ์์ด ๋ฌ๋ฆฐ ๋ชจ๋ ํด๋์ค๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.@Import@Bean
- BeanDefinitionRegistryPostProcessor ๊ตฌํ์ ์ปจํ ์ด๋์ ๋น ์ ์๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐ๋ฉด BeanFactoryPostProcessor ๊ตฌํ์ ์ปจํ ์ด๋ ๋ด์ ๋น ์ ์์ ์์ฑ์ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. (์ด๋ Spring ๋น์ ๋ผ์ดํ์ฌ์ดํด๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.)
onRefresh
์ด ๋จ๊ณ์๋ ์น ์ปจํ ์ด๋ ์์ฑ์ด ํฌํจ๋ฉ๋๋ค. ์น ํ๊ฒฝ์์ ์ด๋ ์ผ๋ฐ์ ์ผ๋ก Tomcat ์น ์ปจํ ์ด๋๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.”
์์ฝ
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์ ์ฒด ๋จ๊ณ์ ๋๋ค.
- ์ ์ฒด Spring ํ๋ ์์ํฌ์ ์์์ ๋ฉ์๋ constructing a SpringApplication object์คํ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค.run
- ํต์ฌ ์ฃผ์์ @SpringBootConfiguration์์ ํด๋์ค๋ฅผ ๊ตฌ์ฑ ํด๋์ค๋ก ๋ํ๋ ๋๋ค. @EnableAutoConfiguration๋ด๋ถ @Import์ฃผ์์ ํตํด ์๋ ๊ตฌ์ฑ์ ๊ตฌํํฉ๋๋ค AutoConfigurationImportSelector.class. @ComponentScan๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ํด๋น ํ์ ๋๋ ํฐ๋ฆฌ์ Bean์ ๊ฒ์ํฉ๋๋ค.
- SpringApplication์ ์์ฑ์๋ ์ฃผ๋ก ๋ช ๊ฐ์ง ์์ ์ ์ํํฉ๋๋ค.
- ์๋ธ๋ฆฟ ํด๋์ค ๋ก๋ฉ ์ฌ๋ถ์ ๋ฐ๋ผ ์น ํ๊ฒฝ์ธ์ง ํ๋จํฉ๋๋ค.
- Spring ์ธ์คํด์ค ์์ ์ ํ์ ์ผ๋ถ ์ฝ๋ฐฑ ์์ ์ ์ํํ๊ธฐ ์ํด ๋ชจ๋ ApplicationContextInitializerํ์ ํด๋์ค๋ฅผ ๊ฒ์ํ๊ณ ๋ฆฌํ๋ ์ ์ ํตํด ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ค๋ ๋ชจ๋ ์ด๊ธฐํ ํ๋ก๊ทธ๋จ์ ๊ฒ์ํฉ๋๋ค.META-INF/spring.factories
- ์์ ์ ์ฌํ ๋ชจ๋ ๋ฆฌ์ค๋๋ฅผ ๊ฒ์ํ์ฌ ๊ตฌ์ฑ์ ๊ฒ์ํ๊ณ ํด๋น ํด๋์ค ์ธ์คํด์ค๋ฅผ ๋ก๋ํฉ๋๋ค.
- ์ฃผ์ ๋ฉ์๋๋ฅผ ์ฐพ์ต๋๋ค.
'๐ฟSpring > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Framework] Spring Boot 2.* vs 3.* (0) | 2024.06.11 |
---|---|
[Spring Framework - Thymeleaf] Decoupled Logic (0) | 2024.01.21 |
[Spring Framework - Thymeleaf] Thymeleaf ๋? (0) | 2024.01.18 |
[Spring Framework] Transction (1) | 2024.01.11 |
[Spring Framework] Filter ์ Interceptor (1) | 2024.01.11 |