Spring Boot์ด์ ์ Sprin์ด ๋ฑ์ฅํ๊ธฐ๋ ์ ์๋ EJB(Enterprise JavaBeans)๊ฐ ์ ๋ฌด ๋ก์ง์ ๋ด๋นํ๋ ์๋ฐ ํ์ค ๊ธฐ์ ์ด์๋ค. EJB๋ก ๊ฐ๋ฐ์๋ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ค์ ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์์์ผ๋ ํ๋์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ํด๋์ค๊ฐ ์์ก, ์ธํฐํ์ด์ค์ ๊ตฌํ ๋ฑ ๊ฐ ํด๋์ค๊ฐ ์์กด๋๊ฐ ๋งค์ฐ ๋์ ์ํฉ์ด์๋ค. ์ด์ธ์๋ J2EE์ ๊ฐ์ ์๋ฐ ํ๋ซํผ์ด ์กด์ฌํ๋ค.
Spring์ ์ด๋ฌํ ๋ณต์ก์ฑ๊ณผ ์ ์ฝ์ฌํญ์ ์ค์ด๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ ๋จ์ํ๊ณ ์ ์ฐํ ๊ฐ๋ฐ ๋ฐฉ์์ ์ ๊ณตํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค. Spring์ ํต์ฌ ์์น์ ์์กด์ฑ ์ฃผ์ ์ผ๋ก ์ฝ๋์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ๋๋ณ ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒ ๋ง๋ค์๋ค.
ํ์ง๋ง ์ด๋ฌํ Spring์ XML ๊ธฐ๋ฐ์ ์ค์ ์ด ์ฃผ๋ฅผ ์ด๋ฃจ์ค ๋ณต์กํ์๊ณ ์ด๊ธฐ ์ค์ ๊ณผ ๋ถํธ์คํธ๋ฉ์ ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ํ์ํ๊ณ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ๋ฑ์ฅํ๋ฉด์ ๋ชจ๋๊ด์ ํธํ์ฑ ๋ฌธ์ ๋ก ์ธํ ์์กด์ฑ ๊ด๋ฆฌ ๋ฌธ์ ๋ฑ์ด ๋ฐ์ํ๋ค.
๐ฏ๏ธ๋ถํธ์คํธ๋ฉ?
- ์น์ฌ์ดํธ๋ฅผ ์ฝ๊ฒ ๋ง๋ค์ ์๋๋ก ๋์์ฃผ๋ HTML, CSS, JS ํ๋ ์์ํฌ
- ์ฝ๋ฉ์ ์์ ์ค์ฌ์ค๋ค๋ ๊ฐ์ฅ ํฐ ์ฅ์

์์์ ์ดํด๋ดค๋ ์ฌ๋ฌ ์ด์ ๋ค๋ก ์ธํด Spring Boot๊ฐ ๋ฑ์ฅํ๋ค. Spring Boots๋ ์คํ๋ง ํ๋ฉด Spring ๊ธฐ๋ฐ์ ์์ฉํ๊ฐ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋จ๋ ์คํ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ Spring ํ๋ก์ ํธ์ด๋ค. "๊ด์ต ์์ ์ค์ "์ด๋ผ๋ ์ฒ ํ์ ๋ฐ๋ผ ๋ณต์กํ ์ค์ ์์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ์คํํ ์ ์๊ฒ ์ค์ ๋์๋ค.
[Spring Boot์ ์ฐจ๋ณํ๋ ์ฅ์ ๋ค]
1. ๋ด์ฅ ์๋ฒ : Tomcat, Jetty, Undertow์ ๊ฐ์ ์น ์๋ฒ๋ฅผ ๋ด์ฅํ๊ณ ์์ด ๋ณ๋์ ์น ์๋ฒ ์ค์น ๋ฐ ์ค์ ์์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ ์ ์๋ค.
2. ์๋ ๊ตฌ์ฑ(Auto Configuration) : Spring Boot๋ ํ๋ก์ ํธ์ ์์กด์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์๋์ผ๋ก ๊ตฌ์ฑ์ ํด์ค๋ค. ์๋ฅผ ๋ค์ด, spring-boot-starter-web ์์กด์ฑ์ด ํฌํจ๋๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๊ตฌ์ฑํด์ค๋ค.
3. ์คํํฐ ์์กด์ฑ(Starter Dependencies) : ๊ธฐ๋ฅ๋ณ๋ก ๋ฌถ์ฌ์๋ ์์กด์ฑ ํจํค์ง๋ก ๊ฐ๋ฐ์๋ ํ์ํ ๊ธฐ๋ฅ์ ์คํํฐ๋ง ์ถ๊ฐํ๋ฉด ๊ด๋ จ๋ ๋ชจ๋ ์์กด์ฑ์ด ์๋์ผ๋ก ํฌํจ๋๋ค.
4. ์ก์ถ์์ดํฐ(Actuator): ์ ํ๋ฆฌ์ผ์ด์
์ ์ด์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ชจ๋๋ก, ๋ฉํธ๋ฆญ, ์ํ ์ฒดํฌ, ํ๊ฒฝ ์ ๋ณด ๋ฑ ๋ค์ํ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ค.
ํด๋น ๋ถ๋ถ์ ์ฝ๋ฉ์ ํ๋ฉด์ ๋ณ๊ฒฝ์ฌํญ์ ์ฐพ๊ฒ ๋๋ฉด ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ ์์ ์ด๋ค.
Spring Boot 1.0 : 2014๋ ์ ์ถ์, ์๋ ๊ตฌ์ฑ ๊ธฐ๋ฅ ์ ๊ณต, ๋ด์ฅ์๋ฒ์ง์, ์คํํฐ๋ฅผ ํตํ ์์กด์ฑ ๊ด๋ฆฌ
Spring Boot 1.5 : 2017๋ ์ด๊ธฐ ์ถ์, Actuator ๊ธฐ๋ฅ ์ถ๊ฐ
Spring Boot 2.0 : 2018๋ ์ ์ถ์, Spring 5.0 ์ง์, ๋ฐ์ํ ์น ํ๋ก๊ทธ๋๋ฐ ์ง์
Spring Boot 2.1 : Java 11 ์ง์
Spring Boot 2.2 : Java 13 ์ง์, ํ๋กํผํฐ ๋ง์ด๊ทธ๋ ์ด์ ์ง์
Spring Boot 2.3 : Docker์์ ํตํฉ ๊ฐ์
Spring Boot 2.4 : Java 15 ์ง์, ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ํ์ผ yml ํน์ properties์ ์ฌ๋ฌ ํ๋กํ์ผ ๋์์ ์ ์ ๊ฐ๋ฅ
Spring Boot 2.5 : Spring Data JPA์์ getOne์ ๋์ฒดํ๋ ์๋ก์ด getById ๋ฉ์๋๋ฅผ ๋์
Spring Boot 2.6 : Apache Kafka 3.0์ผ๋ก ์ ๊ทธ๋ ์ด๋, Java Runtime ์ ๋ณด๋ฅผ ๋ ธ์ถ
Spring Boot 2.7 : WebSecurityConfigurerAdapter์์ SecurityFilterChain์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
Spring Boot 3.0 : Java 17 ์ง์, Java EE๋ฅผ jakarta EE๋ก ๋์ฒด (javax. ์์ jakarta. ๋ก ๋ณ๊ฒฝ), RFC 7807์คํ ์ง์
๐ฏ๏ธ ๋ง์ด๊ทธ๋ ์ด์ ์ด๋?
ํ๊ฒฝ, ํ๋ซํผ, ๋ฒ์ , ์์คํ ๋๋ ๊ธฐ์ ๋ก๋ถํฐ ๋ค๋ฅธ ํ๊ฒฝ, ํ๋ซํผ, ๋ฒ์ , ์์คํ ๋๋ ๊ธฐ์ ๋ก ์ฎ๊ธฐ๋ ํ๋ก์ธ์ค๋ฅผ ์๋ฏธํ๋ค.
IT ๋ถ์ผ์์ ์ด ์ฉ์ด๋ ์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ด์ ํ๊ฑฐ๋, ์ํํธ์จ์ด์ ํ ๋ฒ์ ์์ ๋ค์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๋ฑ์ ์์ ์ ์ฌ์ฉํ๋ค.
๐ฏ๏ธ RFC ๋?
RFC๋ "Request for Comments"์ ์ฝ์๋ก, ์ธํฐ๋ท ๊ด๋ จ ๊ธฐ์ ๊ณผ ํ๋กํ ์ฝ, ์๋ ์์น, ๊ทธ ์ธ ๋ค์ํ ์ปดํจํฐ ๋คํธ์ํน์ ๊ดํ ์ฌํญ๋ค์ ๊ธฐ์ ํ ๋ฌธ์๋ค์ ์๋ฆฌ์ฆ๋ฅผ ์๋ฏธ
์ฐธ๊ณ ๋ก Spring Boot 3.0 ์์ Java17์ ์ฌ์ค์ ํ์์ด๋ค.
1. ์ ํ๋ฆฌ์ผ์ด์
์คํ
์ ํ๋ฆฌ์ผ์ด์
์์ ์ง์ ์ @SpringBootApplication ์ด๋
ธํ
์ด์
์ด ๋ถ์ ๋ฉ์ธํด๋์ค์์ SpringApplication.run()์ด๋ค. ํด๋น ๋ฉ์๋๊ฐ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์
์ ์์์ ์ด๋ค.
2. ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ๋ก
SpringApplication์ด ์คํ๋๋ฉด์ ๊ฐ ๋จ๊ณ๋ง๋ค ๊ด๋ จ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ ->
ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
ํ๋ ๋ฆฌ์ค๋๊ฐ ์๋ค๋ฉด, ๋ฆฌ์ค๋์ onApplicationEvent ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ
๐ฏ๏ธSpring boot ์ ์ด๋ฒคํธ ๋ฆฌ์คํฐ
- ์คํ๋ง ๋ถํธ๋ ์ฌ๋ฌ ๊ฐ์ง ๊ธฐ๋ณธ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ณตํ๋ค. ์๋ฅผ ๋ค๋ฉด ApplicationStartingEvent, ApplicationEnvironmentPreparedEvent, ApplicationPreparedEvent, ApplicationReadyEvent ๋ฑ์ ์ด๋ฒคํธ๊ฐ ์๋ค.
- ์ด๋ฒคํธ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์๋ถํฐ ์ค๋น, ์คํ์ ์ด๋ฅด๋ ๋ค์ํ ์์ ์์ ๋ฐ์ํ๋ค.
- SpringApplication ํด๋์ค์ addListeners ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ ์ ์๋ค.
3. ํ๊ฒฝ์ค๋น
์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋๋ฐ ํ์ํ ํ๊ฒฝ๋ณ์, ํ๋กํ์ผ, ํ๋กํผํฐ๋์ผ์ด ์ค์ ์ ๋ณด๋ฅผ ๋ก๋ํ๊ณ ์ค๋นํ๋ ๋จ๊ณ์ด๋ค. Environment๊ฐ์ฒด๋ ํ๊ฒฝ์์ฑ์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ๋ฉฐ ์ฌ๊ธฐ์๋ JVM ์์คํ
ํ๋กํผํฐ, ์์คํ
ํ๊ฒฝ๋ณ์, ๊ตฌ์ฑํ์ผ์ ํ๋กํผํฐ(application.properties, application.yml) ๋ฑ์ด ํฌํจ๋๋ค.
ํ๊ฒฝ์ด ์ค๋น๋๋ฉด ApplicationEnvironmentPreparedEvent๊ฐ ๋ฐ์ํ๊ณ ์ด ์์ ์์ ๊ฐ๋ฐ์๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํ๊ฒฝ ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ค๋ฅธ ์ค์ ์์
์ ์ํํ ์ ์๋ค.
๐ฏ๏ธํ๋กํ์ผ, ํ๋กํผํฐ
- ํ๋กํ์ผ์ ํน์ ํ ํ๊ฒฝ(๊ฐ๋ฐ, ํ ์คํธ, ์ด์ ๋ฑ)์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์ ๋ค๋ฅด๊ธฐ ์ ์ฉํ ์ ์๊ฒ ํด์ค๋ค, @Profile ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํน์ ๋น์ด ์ด๋ค ํ๋กํ์ผ์์๋ง ๋ฑ๋ก๋๋๋ก ํ ์ ์๋ค.
- ํ๋กํผํฐ๋ application.properties ๋๋ application.yml ํ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ก๋ํ๋ค, ์ด ํ์ผ๋ค์ src/main/resources ๋๋ ํ ๋ฆฌ ์๋์ ์์นํ๋ค, ํ๋กํผํฐ ๊ฐ๋ค ์ฌ์ด์๋ ์ฐ์ ์์๊ฐ ์๋ค.
4. ApplicationContext ์์ฑ
ApplicationContext๋ ๋น์ ์ค์ , ์์ฑ, ๊ด๋ฆฌ ๋ฑ์ ์์
์ ์ฒ๋ฆฌํ๋๋ฐ ์ค์ฌ์ ์ธ ์ญํ ์ ํ๋ค. ApplicationContext๋ ๋น ํฉํ ๋ฆฌ (BeanFactory)์ ํ์ฅ์ด๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์
๋ฐํ์ ํ๊ฒฝ์ ๋ํ ์ ๋ณด์ ์ก์ธ์คํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ์ ์ผ๋ก ์ ๊ณตํ๋ค.
์คํ๋ง ๋ถํธ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํ(์น ์ ํ๋ฆฌ์ผ์ด์
, ๋ฐฐ์น ์ ํ๋ฆฌ์ผ์ด์
, ๋ฆฌ์กํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์
๋ฑ)์ ๋ฐ๋ผ ์ ์ ํ ApplicationContext ์ ํ์ ์ ํํฉํ๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ AnnotationConfigServletWebServerApplicationContext ๊ฐ์ ์น ์ ์ฉ ์ปจํ
์คํธ๊ฐ ์ ํ๋๋ค.
์ ํ๋ ApplicationContext ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ์ด๊ธฐํ๋๋ฉฐ ์ด ๊ณผ์ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ ์ ๋ณด, ํ๋กํผํฐ, ํ๋กํ์ผ ๋ฑ์ด ํด๋น ์ปจํ
์คํธ์ ๋ก๋๋๋ค.
ApplicationContext๋ @Component, @Service, @Repository, @Controller ๋ฑ์ ์ด๋
ธํ
์ด์
์ ํฌํจํ๋ ํด๋์ค๋ค์ ์ค์บํ์ฌ ๋น ์ ์๋ฅผ ๋ก๋ํ๋ค.
๋ํ, @Configuration ํด๋์ค๋ค ๋ํ ์ค์บ๋์ด ํด๋น ์ค์ ์ ๋ณด๊ฐ ์ปจํ
์คํธ์ ๋ก๋๋๋ค.
์ ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ๋ ApplicationContext์ ์ํด ์ํ๋ฉ๋๋ค. ์ด์๋ ๋น์ ์์ฑ, ์ด๊ธฐํ, ์๋ฉธ ๋ฑ์ ๊ณผ์ ์ด ํฌํจ๋๋ค.
์์ฝํ๋ฉด ApplicationContext๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ฌ์ ์ธ ๋ถ๋ถ์ผ๋ก ๋น์ ๊ด๋ฆฌ ๋ฐ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ ์คํ๋ง ๋ถํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ๊ณผ ์ค์ ์ ๋ฐ๋ผ ์ ์ ํ ApplicationContext๋ฅผ ์ด๊ธฐํํ๊ณ ์ค๋นํ๋ค.
5. ApplicationPreparedEvent ๋ฐ์
ApplicationPreparedEvent๋ฅผ ํ์ฉํ๋ฉด ๋น๋ค์ด ์ค์ ๋ก ๋ก๋๋๊ธฐ ์ ์ ํน์ ์์
์ ์ํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฆฌ์์ค์ ์ด๊ธฐ ๊ฒ์ฆ, ํน์ ์ค์ ์ ํ์ธ, ๋ก๊ทธ์ ์ด๊ธฐ ์ค์ ๋ฑ์ ์์
์ ์ด ์์ ์์ ์ํํ ์ ์๋ค.
ApplicationPreparedEvent๋ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
์ด๊ธฐํ ๊ณผ์ ์ค ApplicationContext๊ฐ ์ค๋น๋ ์ํ์์, ๊ทธ๋ฆฌ๊ณ ๋น๋ค์ด ๋ก๋๋๊ธฐ ์ ์ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ด๋ค.
๊ฐ๋ฐ์๋ ์ด ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ๋ฆฌ์ค๋ ๋ฑ๋ก์ด ๊ฐ๋ฅํ๋ค.
์์์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
@Component
public class MyPreparedEventListener implements ApplicationListener<ApplicationPreparedEvent> {
@Override
public void onApplicationEvent(ApplicationPreparedEvent event) {
// ์ด๋ฒคํธ ๋ฐ์ ์ ์คํ๋ ๋ก์ง
System.out.println("ApplicationPreparedEvent๊ฐ ๋ฐ์");
}
}
6. BeanFactory ์ค์
๐ฏ๏ธBeanFactory
- BeanFactory๋ ์คํ๋ง ์ปจํ ์ด๋์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ๋ก ์คํ๋ง ๋น์ ์์ฑ๊ณผ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ ์ธํฐํ์ด์ค์ด๋ค, ๋น์ ์๋ช ์ฃผ๊ธฐ์ ์ค์ ์ ์ฒ๋ฆฌํ๋ค
- ๋๋ถ๋ถ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ BeanFactory๋ฅผ ์ง์ ์ฌ์ฉํ๊ธฐ ๋ณด๋จ ApplicationContext๋ฅผ ์ฌ์ฉํ๋ค.
- ์ฆ ApplicationContext๋ BeanFactory์ ํ์ฅ๋ ํํ
์คํ๋ง ์ฟ ํธ๋ ๊ฐ๋ฐ์ ํธ์์ฑ์ ์ํด ๋ค์ํ ์๋ ์ค์ ์ ์ ๊ณตํ๋๋ฐ ํด๋์คํจ์ค์ Spring Web MVC ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ผ๋ฉด ์น MVC ๊ด๋ จ ๋น๋ค์ ์๋์ผ๋ก ์ค์ ํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ์ ์ค์ ํ๋ค.
์ด๋ฌํ ์๋ ์ค์ ์ @EnableAutoConfiguration ์ด๋ ธํ ์ด์ ์ ํตํด ํ์ฑํ๋๋ฉฐ @SpringBootApplication์ด๋ ธํ ์ด์ ์ ํด๋น ์ด๋ ธํ ์ด์ ์ด ํฌํจ๋์ด์๋ค.
์๋ ์ค์ ์ spring.factories ํ์ผ ๋ด์ ์ ์๋์ด ์์ผ๋ฉฐ ์ด ํ์ผ์ ์คํ๋ง ๋ถํธ ์๋ ์ค์ JAR ๋ด๋ถ์ ์์นํด์๋ค.
์ฆ, SpringApplication์ ์์ ์ spring.factories ํ์ผ์ ์ฝ์ด ๋ค์ด๋ฉฐ ์ด ํ์ผ์ ์คํ๋ง ๋ถํธ ์๋ ์ค์ JAR์ META-INF ๋๋ ํ ๋ฆฌ์ ํฌํจ๋์ด ์๋ค. spring.factories ํ์ผ ๋ด์ EnableAutoConfiguration ํค์ ์ฐ๊ฒฐ๋ ํด๋์ค๋ค์ ์คํ๋ง ๋ถํธ์ ์๋ ์ค์ ํด๋์ค๋ค๋ก ๊ฐ์ฃผ๋๋ค. ์ด ํด๋์ค๋ค์ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํด๋์คํจ์ค์ ์์ ๋ ์๋์ผ๋ก ์ค์ ์ ์ ์ฉํ๋ ์ญํ ์ ํ๋ค.
๊ฐ ์๋ ์ค์ ํด๋์ค๋ ํน์ ์กฐ๊ฑด ํ์์๋ง ์ ์ฉ๋๋๋ฐ ์ด ์กฐ๊ฑด์ @Conditional ์ด๋ ธํ ์ด์ ๊ณผ ๊ทธ์ ํ์ฅ๋ ํํ๋ค๋ก ์ ์๋๋ค. ์๋ฅผ ๋ค @ConditionalOnClass๋ ํน์ ํด๋์ค๊ฐ ํด๋์คํจ์ค์ ์กด์ฌํ ๋๋ง ์ค์ ์ด ํ์ฑํ๋๋ค.
์กฐ๊ฑด์ ๋ถํฉํ๋ ์๋ ์ค์ ํด๋์ค๋ค์ ๊ทธ ์์ ์ ์๋ ๋น ์ ์๋ฅผ BeanFactory (์ ํํ๋ ApplicationContext ๋ด์ BeanFactory)์ ๋ฑ๋กํ๊ฒ ๋๋ค.. ์ด๋ ๊ฒ ๋ฑ๋ก๋ ๋น ์ ์๋ ๋์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค์ ์ธ์คํด์คํ๋์ด ์ค์ ๊ฐ์ฒด๋ก ์์ฑ๋๋ค.
์ ๋ฆฌํ์๋ฉด BeanFactory๋ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ๋น๋ค์ ์ ์๋ฅผ ๋ฐ์ ์ ์ฅํ๊ฒ ๋๊ณ ์ดํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ผ์ดํ์ฌ์ดํด ๋์ ์ด ๋น๋ค์ ํ์์ ๋ฐ๋ผ ์์ฑ๋๊ฑฐ๋ ๋ค๋ฅธ ๋น๋ค๊ณผ์ ๊ด๊ณ๊ฐ ์ฃผ์ ๋๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ๋ก์ง์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
7. ๋น ๋ฑ๋ก ๋ฐ ๋ก๋
์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ํด๋์ค๊ฐ ์์นํ ํจํค์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ปดํฌ๋ํธ ์ค์บ์ ์์ํ๋ค. @Component, @Service, @Repository, @Controller, @RestController ๋ฑ์ ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ค์ ์ฐพ์์ ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
๐ฏ๏ธ@ComponentScan
์คํ๋ง ๋ถํธ์ ๊ฒฝ์ฐ ๋ณ๋๋ก @ComponentScan์ ์ง์ ํ์ง ์์๋ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค(์ฆ @SpringBootApplication ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค)๊ฐ ์์นํ ํจํค์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋์ผ๋ก ์ปดํฌ๋ํธ ์ค์บ์ด ์ด๋ฃจ์ด์๋ค. ์ด๋ @SpringBootApplication ์ด๋ ธํ ์ด์ ์์ @ComponentScan์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
@Configuration ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ ์ค์ ํด๋์ค๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด๋ฐ ์ค์ ํด๋์ค ๋ด์์ @Bean ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๋ ํด๋น ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
๋น์ด ๋ฑ๋ก๋๋ฉด, @Autowired๋ ์์ฑ์ ์ฃผ์ ๋ฑ์ ๋ฐฉ์์ ํตํด ํด๋น ๋น์ ํ์ํ ์์กด์ฑ์ด ์ฃผ์ ๋๋ค.
๋ชจ๋ ์์กด์ฑ์ด ์ฃผ์ ๋ ํ, ๋น์ ์ด๊ธฐํ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.์ดํ ํด๋น ๋น์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ผ์ดํ์ฌ์ดํด ๋์ ์ฌ์ฉ๋๋ค.
8. ApplicationReadyEvent ๋ฐ์
์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๊ฐ ๋ชจ๋ ๋น์ ๋ก๋ํ๊ณ ์ด๊ธฐํํ ํ, ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ ์ค๋น๊ฐ ์๋ฃ๋ ์์ ์ ๋ฐ์ํ๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ, ๋ด์ฅ ์น ์๋ฒ๋ ์ด ์์ ์ ์์ ํ ์์๋๋ค๊ณ ๋ณผ ์ ์๋ค.
์ฆ ApplicationReadyEvent๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํ ์ด๊ธฐํ๋ ๋ค๋ฅธ ํน์ ์์ ์ ์ํํ๊ธฐ ์ํ ํ (hook) ์ญํ ์ ํ๋ค .
9. ์๋ฒ ์คํ (์น ์ ํ๋ฆฌ์ผ์ด์
์ธ ๊ฒฝ์ฐ)
์คํ๋ง ๋ถํธ๋ ๋ด์ฅ ์น ์๋ฒ๋ฅผ ๊ตฌ๋ํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Tomcat๋ฅผ ๊ธฐ๋ณธ ์น ์๋ฒ๋ก ์ฌ์ฉํ๋ฉฐ ์ด ์ธ์ Jety, Undertow ์๋ฒ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
์ ํ๋ ์น ์๋ฒ๋ ์ด๊ธฐํ๋๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์คํธ์ ๋ง๊ฒ ์ค์ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ ์น ์๋ฒ๋ 8080ํฌํธ์์ ์คํ๋๋ฉฐ ์น ์๋ฒ๊ฐ ๊ตฌ๋๋๊ณ ์น ์์ฒญ์ ๋ฐ์ ์ค๋น๊ฐ ๋๋ค.
์๋ฒ๊ฐ ์์๋๋ฉด HTTP์์ฒญ์ ๋ฐ์ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ ์ํธํฌ์ธํธ๋ก ๋ผ์ฐํ ํ๋ค.
์ ์ตํ ๊ธ ์ ์ฝ์์๋๋ค