[Spring Boot] Spring Boot๋ž€?

๊น€ํƒœํ˜„ยท2023๋…„ 10์›” 13์ผ

0. Spring Boot ์ด์ „

Spring Boot์ด์ „์˜ Sprin์ด ๋“ฑ์žฅํ•˜๊ธฐ๋„ ์ „์—๋Š” EJB(Enterprise JavaBeans)๊ฐ€ ์—…๋ฌด ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ์ž๋ฐ” ํ‘œ์ค€ ๊ธฐ์ˆ ์ด์—ˆ๋‹ค. EJB๋กœ ๊ฐœ๋ฐœ์ž๋“ค์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์—ˆ์œผ๋‚˜ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค๊ฐ„ ์ƒ์†ก, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ๋“ฑ ๊ฐ ํด๋ž˜์Šค๊ฐ„ ์˜์กด๋„๊ฐ€ ๋งค์šฐ ๋†’์€ ์ƒํ™ฉ์ด์—ˆ๋‹ค. ์ด์™ธ์—๋„ J2EE์™€ ๊ฐ™์€ ์ž๋ฐ” ํ”Œ๋žซํผ์ด ์กด์žฌํ–ˆ๋‹ค.

Spring์€ ์ด๋Ÿฌํ•œ ๋ณต์žก์„ฑ๊ณผ ์ œ์•ฝ์‚ฌํ•ญ์„ ์ค„์ด๊ณ  ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋” ๋‹จ์ˆœํ•˜๊ณ  ์œ ์—ฐํ•œ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๋‹ค. Spring์˜ ํ•ต์‹ฌ ์›์น™์€ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ๋‹›๋ณ„ ํ…Œ์ŠคํŠธ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ Spring์€ XML ๊ธฐ๋ฐ˜์˜ ์„ค์ •์ด ์ฃผ๋ฅผ ์ด๋ฃจ์˜ค ๋ณต์žกํ•˜์˜€๊ณ  ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์— ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์ด ํ•„์š”ํ–ˆ๊ณ  ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ๋ชจ๋“ˆ๊ด€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฌธ์ œ๋“ฑ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

๐Ÿ•ฏ๏ธ๋ถ€ํŠธ์ŠคํŠธ๋žฉ?

  • ์›น์‚ฌ์ดํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” HTML, CSS, JS ํ”„๋ ˆ์ž„์›Œํฌ
  • ์ฝ”๋”ฉ์˜ ์–‘์„ ์ค„์—ฌ์ค€๋‹ค๋Š” ๊ฐ€์žฅ ํฐ ์žฅ์ 



1. Spring Boot์˜ ๋“ฑ์žฅ

์œ„์—์„œ ์‚ดํŽด๋ดค๋˜ ์—ฌ๋Ÿฌ ์ด์œ ๋“ค๋กœ ์ธํ•ด 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): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์šด์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ๋กœ, ๋ฉ”ํŠธ๋ฆญ, ์ƒํƒœ ์ฒดํฌ, ํ™˜๊ฒฝ ์ •๋ณด ๋“ฑ ๋‹ค์–‘ํ•œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.



2. Spring Boot์—ญ์‚ฌ

ํ•ด๋‹น ๋ถ€๋ถ„์€ ์ฝ”๋”ฉ์„ ํ•˜๋ฉด์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ฐพ๊ฒŒ ๋˜๋ฉด ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์˜ˆ์ •์ด๋‹ค.

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์€ ์‚ฌ์‹ค์ƒ ํ•„์ˆ˜์ด๋‹ค.



3. Spring Boot ๋™์ž‘ ์›๋ฆฌ

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์š”์ฒญ์„ ๋ฐ›์•„ ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ์—”ํŠธํฌ์ธํŠธ๋กœ ๋ผ์šฐํŒ…ํ•œ๋‹ค.

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 10์›” 13์ผ

์œ ์ตํ•œ ๊ธ€ ์ž˜ ์ฝ์—ˆ์๋‹ˆ๋‹ค

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ