Toby Spring Boot
ํ ๋น๋์ ํ ๋น์ ์คํ๋ง ๋ถํธ - ์ดํด์ ์๋ฆฌ ๊ฐ์๋ฅผ ์์ฝํ ๋ด์ฉ์ ๋๋ค.
Intro
์คํ๋ง ๋ถํธ๋ ์คํ๋ง ๊ธฐ๋ฐ์ผ๋ก ์ค๋ฌด ํ๊ฒฝ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ค์ ๋ ๋ฆฝ์คํํ ์ ํ๋ฆฌ์ผ์ด์ ์
๋ณต์กํ ๊ณ ๋ฏผ ์์ด ๋น ๋ฅด๊ฒ ์์ฑํ ์ ์๊ฒ ๋์์ฃผ๋ ์ฌ๋ฌ๊ฐ์ง
๋๊ตฌ์ ๋ชจ์
ํน์ง
๋ ๋ฆฝํ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
Tomcat, Jetty, Undertow ๋ฑ์ ํฌํจ(WAR ํ์ผ ๋ฐฐํฌ ๋ถํ์)
๋น๋ ๊ตฌ์ฑ์ ๋จ์ํํ๊ธฐ ์ํด ๋ ์์ ์ธ 'startor' ์ข ์์ฑ ์ ๊ณต
๊ฐ๋ฅํ ๋๋ง๋ค ์๋์ผ๋ก ์คํ๋ง ๋ฐ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ฑ
๋ฉํธ๋ฆญ, ์ํ ํ์ธ ๋ฐ ์ธ๋ถํ๋ ๊ตฌ์ฑ๊ณผ ๊ฐ์ ํ๋ก๋์ ์ค๋น ๊ธฐ๋ฅ ์ ๊ณต
์ฝ๋ ์์ฑ ๋ฐ XML ๊ตฌ์ฑ์ ๋ํ ์๊ตฌ ์ฌํญ ๋ถํ์
.
Containerless
์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์๊ตฌ๋๋ Servlet Container ๊ด๋ จ ์ค์ ์ง์์ ์ํ ๊ฐ๋ฐ ๋๊ตฌ์ ์ํคํ ์ฒ ์ง์
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํต์ฌ์ด ์๋ ๋จ์ ๋ฐ๋ณต ์์ ์ ๊ฑฐ
์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์ค์น, WAR ํด๋ ๊ตฌ์กฐ, web.xml, WAR ๋น๋, ์ปจํ ์ด๋๋ก ๋ฐฐ์น, ํฌํธ ์ค์ , ํด๋์ค ๋ก๋, ๋ก๊น ...
๋ ๋ฆฝ์คํํ(standalone) ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋์
main ๋ฉ์๋ ์คํ๋ง์ผ๋ก Servlet Container ๊ด๋ จ ๋ชจ๋ ํ์ ์์ ์ด ์ํ

.
Opinionated Tool
Spring
๊ทน๋จ์ ์ ์ฐํจ์ ์ถ๊ตฌํ๊ณ ๋ค์ํ ๊ด์ ์ ์์ฉํ๋ ๊ฒ์ด ์ค๊ณ ์ฒ ํ์ด์์ง๋ง..
๊ฐ์ข ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กด๊ด๊ณ์ ๋ฒ์ ํธํ์ฑ์ ์ฒดํฌํ๋ ์์ ์ ๊ณ ๋๊ณ ์ฝ์ง ์์ ์์
Spring Boot
opinionated ์ค๊ณ: ์๊ธฐ ์ฃผ์ฅ์ด ๊ฐํ๊ณ ์์ ์ ์๊ฒฌ์ ๊ณ ์งํ ์ค๊ณ ์ฒ ํ
์ผ๋จ ์ ํด์ฃผ๋ ๋๋ก ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ๊ณ ๋์ค์ ๊ณ ๋ฏผ. ์คํ๋ง์ ์ ํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ ์ ๊ณต
์คํ๋ง ๋ถํธ๋ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ๋ง๋ค ์ฌ์ฉํ ๊ธฐ์ ์ ์ข ๋ฅ ์ ์
์ฌ์ ๊ฒ์ฆ๋ ์ถ์ฒ ๊ธฐ์ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ฑ, ์์กด ๊ด๊ณ์ ์ ์ฉ ๋ฒ์ , ์ธ๋ถ ๊ตฌ์ฑ(DI)๊ณผ ๋ํดํธ ์ค์ ๋ฑ ์ ๊ณต
๋ํดํธ ๊ตฌ์ฑ์ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ ์ ์ฐํ ๋ฐฉ๋ฒ ์ ๊ณต
Start to Develop
JDK
SDK-MAN(The Software Development Kit Manager)
Unix ๊ธฐ๋ฐ ์์คํ ์์ ์ฌ๋ฌ ์ํํธ์จ์ด ๊ฐ๋ฐ ํคํธ์ ๋ณ๋ ฌ ๋ฒ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋๊ตฌ
java ๋ฒ์ ํ์ธ โ
sdk list javaํน์ identifier ์ค์น โ
sdk install java {id}ํด๋น ๋๋ ํ ๋ฆฌ์์ ํน์ ๋ฒ์ ์ java ์ฌ์ฉ โ
sdk use java {id}
Java ๋ฒ์ ๊ด๋ฆฌ์
.
API Test Method
์น ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ - Network
curl
Intellij IDEA Ultimate- http request
JUnit Test
...
.
HTTP Request and Response
Standalone Servlet Application
Start Servlet Container
.
Register Servlet in ServletContext
.
Front Controller Pattern
์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ฑ์ฅํ๋ ๊ณตํต ์์ ์ ํ๋์ ์ค๋ธ์ ํธ์์ ์ผ๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ง๋๋ ๋ฐฉ์
๋ชจ๋ ์์ฒญ, ํน์ ์ผ์ ํจํด์ ๊ฐ์ง ์์ฒญ์ ํ๋์ ์๋ธ๋ฆฟ์ด ๋ด๋นํ๋๋ก ๋งคํ
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ๋ ๊ฐ์ง ์ค์ํ ๊ธฐ๋ฅ์ ๋งคํ๊ณผ ๋ฐ์ธ๋ฉ
๋งคํ:ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๊ฐ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ ํธ๋ค๋ฌ๋ฅผ ๊ฒฐ์ ํ๊ณ ์ฐ๋ํ๋ ์์
๋ฐ์ธ๋ฉ: ํธ๋ค๋ฌ์๊ฒ ์น ์์ฒญ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ ์๋ฏธ์๋ ์ค๋ธ์ ํธ์ ๋ด์์ ์ ๋ฌํ๋ ์์
ํ๋ก ํธ ์ปจํธ๋กค๋ฌ๋ก ์ ํ
Standalone Spring Application
์คํ๋ง ์ปจํ ์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ด ๋ด๊ธด ํ๋ฒํ ์๋ฐ ์ค๋ธ์ ํธ(POJO)์ ๊ตฌ์ฑ ์ ๋ณด(Configuration Metadata)๋ฅผ ๋ฐํ์์ ์กฐํฉํด์ ๋์ํ๋ ์ต์ข ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑ
์คํ๋ง ์ปจํ
์ด๋๋ ์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
์ฑ๊ธํค ํจํด๊ณผ ์ ์ฌํ๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ํ๋ ๋์ ๋จ ํ๋์ ์ค๋ธ์ ํธ๋ง์ ๋ง๋ค๊ณ ์ฌ์ฉ๋๋๋ก ์ง์
.
Dependency Injection

DI๋ฅผ ์ํด N๊ฐ์ ์ค๋ธ์ ํธ(์ธํฐํ์ด์ค ๊ตฌํ์ฒด)๊ฐ ๋์ ์ผ๋ก ์์กด๊ด๊ณ๋ฅผ ๊ฐ์ง๋๋ก ๋์์ฃผ๋์ด์ ๋ธ๋ฌ๊ฐ ํ์์คํ๋ง ์ปจํ ์ด๋(์ด์ ๋ธ๋ฌ)๋ DI๋ฅผ ๊ฐ๋ฅํ๋๋ก ๋์์ฃผ๋์ด์ ๋ธ๋ฌ๋ก ๋์์์กด๊ด๊ณ๊ฐ ์๋ ํด๋์ค๋ค์ ์ค๋ธ์ ํธ๋ก ์๋ก ๊ด๊ณ๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ์ค์
์คํ๋ง ์ปจ๋ฐ์ด๋๋ ๋ฉํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ํด๋์ค์ ์ฑ๊ธํค ์ค๋ธ์ ํธ๋ฅผ ์์ฑ
์์ฑ๋ ์ค๋ธ์ ํธ๊ฐ ์ฌ์ฉํ ๋ค๋ฅธ ์์กด ์ค๋ธ์ ํธ๊ฐ ์๋ค๋ฉด ์์กด์ฑ ์ฃผ์
์์กด์ฑ ์ฃผ์ ๋ฐฉ๋ฒ์ผ๋ก๋ ์์ฑ์ ์ฃผ์ , ํฉํฐ๋ฆฌ ๋ฉ์๋ ๋ฑ ์กด์ฌ
.
DispatcherServlet
์คํ๋ง์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ์ ๊ฐ์ ์ญํ ์ ๋ด๋นํ๋ DispatcherServlet ์ ๊ฐ์ง๊ณ ์๋ค.
DispatcherServlet ์ ์๋ธ๋ฆฟ์ผ๋ก ๋ฑ๋ก๋์ด์ ๋์ํ๋ฉด์, ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ด์ฉํด์ ์์ฒญ์ ์ ๋ฌํ ํธ๋ค๋ฌ์ธ ์ปจํธ๋กค๋ฌ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉ
DispatcherServlet ์ด ์ฌ์ฉํ๋ ์คํ๋ง ์ปจํ ์ด๋๋ GenericWebApplicationContext ๋ฅผ ์ด์ฉํด์ ์์ฑ
.
์ ๋
ธํ
์ด์
๋งคํ ์ ๋ณด
DispatcherServlet ์ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋น ํด๋์ค์ ์๋ ๋งคํ ์ ๋ ธํ ์ด์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํด์ ์น ์์ฒญ์ ์ ๋ฌํ ์ค๋ธ์ ํธ์ ๋ฉ์๋๋ฅผ ์ ์
ํด๋์ค ๋ ๋ฒจ์ @RequestMapping ๊ณผ ๋ฉ์๋ ๋ ๋ฒจ์ @GetMapping ๋ ๊ฐ์ง์ ์ ๋ณด๋ฅผ ์กฐํฉํด์ ๋งคํ์ ์ฌ์ฉํ ์ต์ข ์ ๋ณด ์์ฑ
์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ๋ฆฌํด๊ฐ์ ์น ์์ฒญ์ ๋ฐ๋์ ์ ์ฉํ๋๋ก @ResponseBody ์ ์ธ
๊ทธ๋ ์ง ์์ผ๋ฉด String ํ์ ์ ์๋ต์ ๋ทฐ ์ด๋ฆ์ผ๋ก ํด์ํ๊ณ Thymeleaf ๊ฐ์ ๋ทฐ ํ ํ๋ฆฟ์ ํ์(์ด ๊ฒฝ์ฐ 404 ์๋ฌ ๋ฐ์)
@RestController ๋ @ResponseBody ๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฏ๋ก ๋ฉ์๋ ๋ ๋ฒจ์ @ResponseBody ๋ฅผ ๋ฃ์ง ์์๋ ์ ์ฉ๋ ๊ฒ์ฒ๋ผ ๋์
.
์คํ๋ง ์ปจํ
์ด๋๋ก ํตํฉ
์คํ๋ง ์ปจํ ์ด๋์ ์ด๊ธฐํ ์์ ์ค์ ํธ์ถ๋๋ ํ ๋ฉ์๋์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋(ํฐ์บฃ)์ ์ด๊ธฐํํ๊ณ ๋์ฐ๋ ์ฝ๋ ์ฝ์
.
@Component Scan
ํด๋์ค์ ์ ๋ ธํ ์ด์ ์ ์ ์ธํ๊ณ , ์ด๋ฅผ ์ค์บํด์ ์คํ๋ง ์ปจํ ์ด๋์ ๋น์ผ๋ก ์๋ ๋ฑ๋ก
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์ธ ํด๋์ค์๋ @ComponentScan ์ ์ธ
๋ฑ๋ก ๋์์ด ๋ ํด๋์ค์๋ @Component ์ ์ธ
@Component ๋ ๋ฉํ ์ ๋ ธํ ์ด์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ์ ๋ ธํ ์ด์ ๋ ์ฌ์ฉ ๊ฐ๋ฅ
@Controller, @RestController, @Service ๋ฑ..
@RestController
@RestController ๋ @Controller ๋ฅผ ๋ฉํ ์ ๋ ธํ ์ด์ ์ผ๋ก ๊ฐ์ง๊ณ ์๊ณ ,
@Controller ๋ @Component๋ฅผ ๋ฉํ ์ ๋ ธํ ์ด์ ์ผ๋ก
์ด ๊ฒฝ์ฐ @RestController ๋ @Component ์ ๋ ธํ ์ด์ ์ด ๋ถ์ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ
@RestController ๊ฐ ๋ถ์ ๊ฒฝ์ฐ DispatcherServlet ์ ๋งคํ ์ ๋ณด ํ์ ๋์์ด ๋๋ฏ๋ก ํด๋์ค ๋ ๋ฒจ์ ๋งคํ ์ ๋ ธํ ์ด์ (@RequestMapping) ๋ถํ์
.
Bean์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋
DispatcherServlet ์
ApplicationContextAware๋ผ๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ setter ๋ฉ์๋๋ก ์ฃผ์ ํด์ฃผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ์ด๋ฌํ
์์ ์ฃผ๊ธฐ ๋น ๋ฉ์๋๋ฅผ ๊ฐ์ง ๋น์ด ๋ฑ๋ก๋๋ฉด ์คํ๋ง์ ์์ ์ ์ง์ ์ฃผ์๋น ์์ ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํตํด ์ฃผ์ ๋๋ ์ค๋ธ์ ํธ๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ค์ค๋ก ๋น์ผ๋ก ๋ฑ๋กํด์ ๋น์ผ๋ก ๊ฐ์ ธ์ ์ฌ์ฉํ ์๋ ์๋๋ก ์ง์๊ทธ๋ฐ์ ์คํ๋ง์ด ์ ๊ณตํ๋ ์์ ์ฃผ๊ธฐ ๋ฉ์๋
TEST
TestRestTemplate
์น ์๋ฒ์ HTTP ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์์ ๊ฒ์ฆํ๋ ํ ์คํธ์์๋
TestRestTemplate๋ฅผ ์ฌ์ฉํด ๋ณด์.
.
๋จ์ ํ
์คํธ
์์กด ์ค๋ธ์ ํธ๊ฐ ์๋ ๊ฒฝ์ฐ, ํ ์คํธ๊ฐ ์คํ๋๋ ๋์์ ์ํ๋ ์ต์ํ์ ๊ธฐ๋ฅ์ ๊ฐ์ง ์์กด ์ค๋ธ์ ํธ ์ฝ๋๋ฅผ ํ ์คํธ์ฉ์ผ๋ก ๋ง๋ค์ด์ ์ฌ์ฉ
.
Decorator Pattern and Proxy Pattern

Decorator Pattern
๊ธฐ์กด ์ฝ๋์ ๋์ ์ผ๋ก ์ฑ ์์ ์ถ๊ฐํ ๋ ์ฌ์ฉํ๋ ํจํด
์ค๋ธ์ ํธ ํฉ์ฑ ๊ตฌ์กฐ๋ก ํ์ฅ์ด ๊ฐ๋ฅํ๋๋ก ์ค๊ณ
DI๋ฅผ ์ ์ฉํด์ ์์กด๊ด๊ณ๋ฅผ ๋ฐํ์์ ์ฃผ์ ํ ์ ์๋ค๋ฉด ์์กด ์ค๋ธ์ ํธ์ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํ์ฅ๊ธฐ๋ฅ(๋ฐ์ฝ๋ ์ดํฐ)์ ๋์ ์ผ๋ก ์ถ๊ฐ ๊ฐ๋ฅ
์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๋ก ์ฌ๋ฌ ๊ฐ์ ์ฑ ์์ ๋ถ๊ฐํ๋ ๊ฒ๋ ๊ฐ๋ฅ

Proxy Pattern
ํ๋ก์๋ ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ๋๋ฆฌ์ ํน์ ํ๋ ์ด์ค ํ๋ ์ญํ
ํ๋ก์๋ ๋ฆฌ๋ชจํธ ์ค๋ธ์ ํธ์ ๋ํ ๋ก์ปฌ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ํ๊ฑฐ๋, ํ์๊ฐ ์์ ๋๋ง ๋์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑ
๋ณด์์ด๋ ์ ์ ์ ์ด ๋ฑ์ ์ฌ์ฉ
Auto Configuration
Meta-annotation
์ ๋ ธํ ์ด์ ์ ์ ์ฉํ ์ ๋ ธํ ์ด์
์คํ๋ง์ ๋ฉํ ์ ๋ ธํ ์ด์ ์ ํจ๋ ฅ์ ์ ์ฉ
Composed-annotation
ํ๋ ์ด์์ ๋ฉํ ์ ๋ ธํ ์ด์ ์ด ์ ์ฉ๋ ์ ๋ ธํ ์ด์
๋ชจ๋ ๋ฉํ ์ ๋ ธํ ์ด์ ์ด ์ ์ฉ๋ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ

Application Logic Bean
์ ํ๋ฆฌ์ผ์ด์ ์
๋น์ฆ๋์ค ๋ก์ง์ ๋ด๊ณ ์๋ ๋น์ปดํฌ๋ํธ ์ค์บ๋์ ์ํด์ ๋น ๊ตฌ์ฑ ์ ๋ณด๊ฐ ์์ฑ๋๊ณ ๋น ์ค๋ธ์ ํธ๋ก ๋ฑ๋กex. HelloController, HelloDecorator ..
Application Infrastructure Bean
์คํ๋ง ๋ถํธ์์
์๋ ๊ตฌ์ฑ ์ ๋ณด์ ์ํด ์ปจํ ์ด๋์ ๋ฑ๋ก๋๋ ๋น์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ํ๋๋ฐ ๊ผญ ํ์ํ ๊ธฐ์ ๊ธฐ๋ฐ์ ์ ๊ณตํ๋ ๋น
ex. ServletWebServerFactory, DispatcherServlet..
Container Infrastructure(Infra) Bean
์คํ๋ง ์ปจํ ์ด๋์ ๊ธฐ๋ฅ์ ํ์ฅํด์ ๋น ๋ฑ๋ก๊ณผ ์์ฑ, ๊ด๊ณ์ค์ , ์ด๊ธฐํ ๋ฑ์ ์์ ์ ์ฐธ์ฌํ๋ ๋น
์ปจํ ์ด๋๊ฐ ์ง์ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ๋น์ด๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋น๊ณผ ๊ตฌ๋ถ
ํ์ํ ๊ฒฝ์ฐ ์ฃผ์ ๋ฐ์์ ํ์ฉ ๊ฐ๋ฅ
.
์๋ ๊ตฌ์ฑ ์ ๋ณด ๋์ ๋ฑ๋ก
ImportSelector๊ตฌํ ํด๋์ค๋ฅผ @Import ํด์ฃผ๋ฉดselectImports๊ฐ ๋ฆฌํดํ๋ ํด๋์ค ์ด๋ฆ์ผ๋ก @Configuration ํด๋์ค๋ฅผ ์ฐพ์์ ๊ตฌ์ฑ ์ ๋ณด๋ก ์ฌ์ฉ@import ๋์์ ์ธ๋ถ์์ ์ฝ๋๋ก ๊ฐ์ ธ์ค๊ณ ์ ํํ ์ ์๋ ๋์ ์ธ ๋ฐฉ๋ฒ ์ ๊ณต
.
์๋ ๊ตฌ์ฑ ์ ๋ณด ํ์ผ ๋ถ๋ฆฌ
@MyAutoConfiguration ์ ๋ ธํ ์ด์ ์์ฑ
tobyspring.config.MyAutoConfiguration.importsํ์ผ์META-INF/springํด๋ ์๋ ์์ฑselectImports() ์์ ํ์ผ์ ์์ฑ๋ ํด๋์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ปจํ ์ด๋์ ๋ฑ๋ก์ํฌ @Configuration ํด๋์ค ๋ชฉ๋ก ์ ์ฅ
.
@Configuration ๋์ ๋ฐฉ์
proxyBeanMethods = true(default, ์คํ๋ง 5.2 ๋ฒ์ ๋ถํฐ ์ง์)true ์ผ ๊ฒฝ์ฐ, @Configuration ํด๋์ค๋ CGLib ๋ฅผ ์ด์ฉํด์ ํ๋ก์ ํด๋์ค๋ก ํ์ฅ ํ @Bean ์ด ๋ถ์ ๋ฉ์๋์ ๋์ ๋ฐฉ์์ ๋ณ๊ฒฝ
@Bean ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํด์ ๋ค๋ฅธ ๋น์ ์์กด ๊ด๊ณ๋ฅผ ์ค์ ํ ๋ ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋๋ผ๋ ์ฑ๊ธํค ๋น์ฒ๋ผ ์ฐธ์กฐํ ์ ์๋๋ก ๋งค๋ฒ ๊ฐ์ ์ค๋ธ์ ํธ๋ฅผ ๋ฆฌํด
๋จ, @Bean ๋ฉ์๋ ์ง์ ํธ์ถ๋ก ๋น ์์กด๊ด๊ณ ์ฃผ์ ์ ํ์ง ์๋๋ค๋ฉด ๊ตณ์ด ๋ณต์กํ ํ๋ก์๋ฅผ ์์ฑํ ํ ํ์๊ฐ ์์
์ด ๊ฒฝ์ฐ
proxyBeanMethods = false๋ก ์ง์ ํด ๋ณด์.@Bean ๋ฉ์๋๋ ํ๋ฒํ ํฉํ ๋ฆฌ ๋ฉ์๋์ฒ๋ผ ๋์
์กฐ๊ฑด๋ถ ์๋ ๊ตฌ์ฑ
Spring Boot AutoConfiguration
META-INF.spring.org.springframework.boot.autoconfigure.AutoConfiguration.imports
์ฝ 144 ๊ฐ์ autoConfiguration ์ด Spring Boot ๊ธฐ๋ณธ ๋ฑ๋ก
Spring Boot application starters
.
@Conditional๊ณผ Condition
@Conditional์ @Configuration ํด๋์ค์ @Bean ๋ฉ์๋์ ์ ์ฉ ๊ฐ๋ฅํด๋์ค ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ฉ์๋๋ ๋ฌด์
.
Costume @Conditional
@Conditional์ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ํด๋์ค ์กด์ฌ ํ์ธ์ด๋ค ๊ธฐ์ ์ ํด๋์ค๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉํ๋๋ก ํฌํจ์์ผฐ๋ค๋ฉด, ์ด ๊ธฐ์ ์ ์ฌ์ฉํ ์๋๊ฐ ์๋ค๋ ๊ฒ์ผ๋ก ๋ณด๊ณ ๊ด๋ จ ์๋ ๊ตฌ์ฑ ํด๋์ค๋ฅผ ๋ฑ๋ก
.
์๋ ๊ตฌ์ฑ ์ ๋ณด ๋์ฒด
์๋ ๊ตฌ์ฑ ์ ๋ณด๋ ๋ค์์ ๊ณผ์ ์ผ๋ก ๋ฑ๋ก
imports ํ์ผ์์ ์๋ ๊ตฌ์ฑ ์ ๋ณด ํด๋์ค ํ๋ณด ๋ก๋ฉ
@Conditional ์กฐ๊ฑด ์ฒดํฌ๋ฅผ ํตํด ์ ํ๋ ํด๋์ค๊ฐ ๋น์ผ๋ก ๋ฑ๋ก
์๋ ๊ตฌ์ฑ ์ ๋ณด ๋์ฒดํ๊ธฐ
.
Spring Boot @Conditional
์คํ๋ง ๋ถํธ์ ์๋ ๊ตฌ์ฑ์ ๋ค์ํ @Conditional ์ ์ด์ฉ.
Class Conditions
@ConditionalOnClass@ConditionalOnMissingClass
Bean Conditions
@ConditionalOnBean@ConditionalOnMissingBean
@Configuration ํด๋์ค ๋ ๋ฒจ์
@ConditionalOnClass@Bean ๋ฉ์๋ ๋ ๋ฒจ์
@ConditionalOnMissingBean์กฐํฉ์ ๊ฐ์ฅ ๋ํ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ์
ํด๋์ค ์กด์ฌ๋ก ํด๋น ๊ธฐ์ ์ฌ์ฉ ์ฌ๋ถ ํ์ธ โ ์ปค์คํ ๋น ๊ตฌ์ฑ ์กด์ฌ๋ฅผ ํ์ธํด์ ์๋ ๊ตฌ์ฑ์ ๋น ์ค๋ธ์ ํธ๋ฅผ ์ด์ฉํ ์ง ์ต์ข ๊ฒฐ์
Property Conditions
@ConditionalOnProperty
Resource Conditions
@ConditionalOnResource
Web Application Conditions
@ConditionalOnWebApplication@ConditionalOnNotWebApplication
SpEL Expression Conditions
@ConditionalOnExpression
์ธ๋ถ ์ค์ ์ ์ด์ฉํ ์๋ ๊ตฌ์ฑ
์คํ๋ง์ Environment ์ถ์ํ

Environment ํ์ ์ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์์ ํ๋กํผํฐ ์ด๋ฆ์ ์ ๊ณตํ์ฌ ์ค์ ๊ฐ ์กฐํ
ํ๋กํผํฐ ์ฐ์ ์์
ServletConfig Parameters
ServletContext Parameters
JNDI
System Properties
System Environment Variables
@PropertySource
xml, yml
์ ๊ณต๋๋ ํ๋กํผํฐ ์ด๋ฆ์ ๋ณํํด์ ์ค์ ๊ฐ ํ์
property.name
property_name
PROPERTY.NAME
PROPERTY_NAME
.
์๋ ๊ตฌ์ฑ์ Environment ํ๋กํผํฐ ์ ์ฉ
์๋ ๊ตฌ์ฑ ํด๋์ค์ ๋ฉ์๋์
Environment๋ฅผ ์ฃผ์ ๋ฐ์์ ๋น ์์ฑ์ผ๋ก ์ง์ ํ ํ๋กํผํฐ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์
.
@Value
@Value๋ element ๋ก placeholder(์นํ์)๋ฅผ ์ง์ ํ๊ณ ์ปจํ ์ด๋ ์ด๊ธฐํ์ ํ๋กํผํฐ ๊ฐ์ผ๋ก ์ด๋ฅผ ๋์ฒด์นํ์๋ฅผ ํ๋กํผํฐ ๊ฐ์ผ๋ก ๊ต์ฒดํ๋ ค๋ฉด
PropertySourcesPlaceholderConfigurerํ์ ์ ๋น ๋ฑ๋ก ํ์ํฉํ ๋ฆฌ์ ํ์ฒ๋ฆฌ๊ธฐ๋ก ๋์ํด์ ์ด๊ธฐ ๊ตฌ์ฑ ์ ๋ณด์์ ์นํ์๋ฅผ ์ฐพ์์ ๊ต์ฒดํ๋ ๊ธฐ๋ฅ ๋ด๋น
.
ํ๋กํผํฐ ํด๋์ค์ ๋ถ๋ฆฌ
.
ํ๋กํผํฐ ๋น์ ํ์ฒ๋ฆฌ๊ธฐ ๋์
Spring JDBC ์๋ ๊ตฌ์ฑ ๊ตฌํ
์๋ ๊ตฌ์ฑ ํด๋์ค์ ๋น ์ค๊ณ
์๋ก์ด ๊ธฐ์ ์ ์๋ ๊ตฌ์ฑ ํด๋์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์๋ ๊ตฌ์ฑ ํด๋์ค์ ์ ์ฉํ ์กฐ๊ฑด๊ณผ ๋ง๋ค์ด์ง๋ ๋น ์ค๋ธ์ ํธ ์ข ๋ฅ ๋ฑ์ ๋จผ์ ์ค๊ณ

๋ ๊ฐ์ DataSource ๊ตฌํ ํด๋์ค๋ฅผ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฑ๋ก
DataSourceProperties ํ๋กํผํฐ ํด๋์ค ์ด์ฉ
.
DataSource ์๋ ๊ตฌ์ฑ ํด๋์ค
@TestPropertySource
application.properties ํ์ผ ๋ฑ๋ก์ ์คํ๋ง ํ๋ ์์ํฌ ๊ธฐ๋ณธ ๋์ ๋ฐฉ์์ด ์๋
์คํ๋ง ๋ถํธ ์ด๊ธฐํ ๊ณผ์ ์์ ์ถ๊ฐํด ์ฃผ๋ ๊ฒ์ด๋ฏ๋ก ํ ์คํธ์์ ๋ณ๋ ์ถ๊ฐ ํ์
@TestPropertySource("classpath:/application.properties") ๋ก properties ์ ๋ณด๋ฅผ ์ฝ์ด์ค๋๋ก ์ค์
.
JdbcTemplate๊ณผ ํธ๋์ญ์
๋งค๋์ ๊ตฌ์ฑ
@ConditionalOnSingleCandidate
๋น ๊ตฌ์ฑ์ ๋ณด์ ํด๋น ํ์ ๋น์ด ํ ๊ฐ๋ง ๋ฑ๋ก๋์ด์๋ ๊ฒฝ์ฐ ์กฐ๊ฑด ๋งค์นญ
@EnableTransactionManagement
์ ๋ ธํ ์ด์ ์ ์ด์ฉํ๋ ํธ๋์ญ์ ๊ธฐ๋ฅ์ ์ด์ฉ
.
Hello Repository
์ธํฐํ์ด์ค์ default, static ๋ฉ์๋๋ฅผ ๋ฃ์ด์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์
์๋ฐ์ Comparator
<T> ์ธํฐํ์ด์ค๋ฅผ ์ฐธ๊ณ ํด ๋ณด์.
Spring Boot
์คํ๋ง ๋ถํธ์ ์๋ ๊ตฌ์ฑ๊ณผ ํ
์คํธ
@SpringBootApplicationSpring Boot Main Annotation
@JdbcTestSpring Boot Test ์ค๋น
์๋๊ตฌ์ฑ ์ค JDBC ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ํ์ํ ๋น๋ค๋ง ๋ก๋ฉ โ ๋น ๋ฅธ ํ ์คํธ
embedded db ๋ก dataSource ๊ต์ฒด โ ํ๋กํผํฐ๋ก ์ค์ ํ DB ์ ์ ์ ๋ณด ์ฌ์ฉ X
@SpringBootTest์คํ๋ง ์ปจํ ์ด๋๋ฅผ ๋์ฐ๊ณ ์๋ ๊ตฌ์ฑ๊น์ง ์ ์ฉํด์ ํ ์คํธ
์๋ธ๋ฆฟ ์ปจํ ์ด๋ ํ๊ฒฝ ์ฌ๋ถ ์ค์
์น ํ๊ฒฝ ์ธํ ์ ์ธ: webEnvironment = SpringBootTest.WebEnvironment.NONE
์น ํ๊ฒฝ ์ธํ : webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT
.
์คํ๋ง ๋ถํธ ์์ธํ ์ดํด๋ณด๊ธฐ

์คํ๋ง ๋ถํธ์
๋์ ๋ฐฉ์ ์ดํด์ฌ์ฉ ๊ธฐ์๊ณผ ๊ด๋ จ๋์๋ ๊ตฌ์ฑ ๋น๊ณผ๊ตฌ์ฑ,์์ฑ,ํ๋กํผํฐ ์ค์ ๋ฑ์ ๋ถ์์๋ ๊ตฌ์ฑ ๋น๊ณผ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋น ์ ํ ๊ธฐ์ค
์ด๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ํ์
.
์๋ ๊ตฌ์ฑ ๋ถ์ ๋ฐฉ๋ฒ
์๋ ๊ตฌ์ฑ ํ๋ณด ๋ชฉ๋ก๊ณผ ์กฐ๊ฑด ํ๋จ ๊ฒฐ๊ณผ ์กฐํํ๊ธฐ

-Ddebugor--debug์ธ์๋ฅผ ์ด์ฉํด์ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์คํConditionEvaluationReportํ์ ์ ๋น์ ์ฃผ์ ๋ฐ๊ณ , ํ์ํ ์ ๋ณด๋ง ์ ํํด์ ์๋ ๊ตฌ์ฑ ๊ฒฐ๊ณผ ํ์ธListableBeanFactoryํ์ ์ ๋น์ ์ฃผ์ ๋ฐ๊ณ , ๋น ์ด๋ฆ์ ๊ฐ์ ธ์์(ํ์ ์ ๋น ์ค๋ธ์ ํธ๋) ๋ฑ๋ก๋ ๋น ๋ชฉ๋ก ํ์ธ์๋ ๊ตฌ์ฑ ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค์ผ๋ก
์คํ๋ง ๋ถํธ ๋ ํผ๋ฐ์ค ๋ฌธ์,์๋ ๊ตฌ์ฑ ํด๋์ค ์์ค ์ฝ๋,ํ๋กํผํฐ ํด๋์ค,Customizer๋ฑ์ ์ดํด๋ณด๋ฉฐ ์ด๋ป๊ฒ ์ด๋ค ์กฐ๊ฑด์ผ๋ก ๋์ํ ์ง ๋ถ์
VM options: -Ddebug
ConditionEvaluationReport
์กฐ๊ฑด์ด ๋งค์นญ๋ ์๋ ๊ตฌ์ฑ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ถ๋ ฅ
org.springframework.boot:spring-boot-starter (springboot core)
spring boot code ์์ Jmx ์ ์ธ ๋น์ด ๋ชฉ๋ก
.
org.springframework.boot:spring-boot-starter-web
spring boot web ์์ Jmx ์ ์ธ ๋น ๋ชฉ๋ก
org.springframework.boot:spring-boot-starter-jdbc
jdbc ๊ด๋ จ ๋น ๋ชฉ๋ก
Last updated