[Spring boot] ํ๊ฒฝ ์ค์ ์ ๋์ ์๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ ๋๋๊ธฐ
Spring boot ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ๋ ํ, Embedded Tomcat์ ์ด์ฉํด ์ฝ๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด๋ณด๊ณ , ํ ์คํธํ ์ ์๋ ๊ฒ ๊น์ง๋ ์ข์ ๊ฒ์ด๊ธด ํ๋ฐ, Embedded Tomcat์ ๋ํ ํฌํธ ์ฃผ์ ๋ฑ์ ์ค์ ์ ์ด๋ป๊ฒ ํ๋ ๊ฒ์ผ๊น?
Property
๊ธฐ์กด์ Spring์์๋ ๋ชจ๋ ์ค์ ์ XML ํ์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด, Spring boot์์๋ Embedded Tomcat, Application ์ค์ ๊ด๋ จ ๋ฐ ๊ธฐํ ์ ์ ์ธ ๊ฐ์ ํค ๊ฐ ํ์์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
Spring boot ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด, ์๋ ๋ง๋ค์ด์ง๋ application.properties๋ ์ด๋ฌํ ์ค์ ์ ํด์ฃผ๋ ํ์ผ์ ๋๋ค. ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ฉด 8080 ํฌํธ๋ก ์ค์ ๋์ง๋ง, ์ด ํฌํธ ์ฃผ์๋ฅผ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ์๋์ ๊ฐ์ด ์ค์ ์ ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ๋ถํด 1412 ํฌํธ ์ฃผ์๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๊ฒ์ด์ฃ .
Auto Configuration
์ด๋ป๊ฒ ์ด๋ฐ ๊ฒ์ด ์ ๋ ๊ฒ ๋จ์ํ ๊ฐ์ ์ค์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ๊ฐ๋ฅํ ๊ฒ์ผ๊น์? ๊ทธ๊ฒ์ ๋ฐ๋ก ์ฌ๋ฌ๋ถ๋ค์ด ๋ง๋์ Spring boot ํ๋ก์ ํธ์ ๋ฉ์ธ ์ฝ๋์ ๊ทธ ๋ต์ด ์์ต๋๋ค.
์ด ๋ฉ์ธ์ฝ๋์๋ SpringBootApplication ์ด๋ ธํ ์ด์ ์ด ์์ต๋๋ค. ์ด ์ด๋ ธํ ์ด์ ์ ์ฝ๋๋ฅผ ์กฐ๊ธ ์ดํด ๋ณด์๋ฉด..
์ด๋ ๊ฒ @EnableAutoConfiguration ์๋ ํ๊ฒฝ ์ค์ ์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์ด ๋ฌ๋ ค์ ธ ์์ต๋๋ค. ์ด๋ Spring boot์์ ํฌ๊ฒ ๊ฐ์ ๋ ์ ์ด์ ์์ฃผ ํฐ ์ฅ์ ์ ๋๋ค.
์๋ํ๋ฉด, ์ด ์ด๋ ธํ ์ด์ ํ๋๋ก, Web, H2, JDBC๋ฅผ ๋น๋กฏํ ์ฝ 100์ฌ ๊ฐ์ ์๋ ์ค์ ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด์ฃ . Embedded Tomcat์์ ๊ธฐ๋ณธ ์ค์ ๊ฐ์ผ๋ก 8080์ ์ฃผ์ด์ฃผ๋ ๊ฒ๋ ๋ฐ๋ก ์ด ์ด๋ ธํ ์ด์ ์ ์ํฅ ๋๋ฌธ์ ๋๋ค.
๋์ฑ์ด, ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ก์ด ์ถ๊ฐ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (JAR)๋ Spring boot ์๋ ํ๊ฒฝ ์ค์ ์ ์๊ฑฐ, ์ค์ ์ด ์๋ ์ ์ฉ๋๋๋ฐ, ๋ง์ฝ H2 ์์กด์ฑ์ด ํด๋์ค ๊ฒฝ๋ก์ ์กด์ฌํ๋ค๋ฉด, ์๋์ผ๋ก In-memory DB์ ์ ๊ทผํ๋ ๊ฒ์ด์ฃ . ์ด ๋ง์ ๊ตฌ์ฒด์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ application.properties์์ H2 ์ค์ ํ์ผ์ ์ ๋ ฅํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ณ๋์ ๊ตฌํ ์ฝ๋ ์์ฑ ์์ด ์๋์ผ๋ก ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ด In-memory DB์ ์ ๊ทผํ๋ค๋ ๊ฒ์ ๋๋ค. (์์ฐ, ์์ฒญ ์ข์ฃ .. )
์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ํ ๋ฒ ๋ณด๋๋ก ํ์๋ฉด... META-INF/spring.factories์ ์ ์๋ ์๋ ์ค์ ํ ํด๋์ค๋ค์ ๋จผ์ ๋ถ๋ฌ์ค๋๋ฐ, ์ฌ๊ธฐ์ H2, Web ๋ฑ 100 ์ฌ๊ฐ์ ์ค์ ์ด ๋ฏธ๋ฆฌ ์ ์ ๋์ด ์๊ณ , ๊ทธ ํด๋์ค๋ค์ ๋ก๋ํ์ฌ ์๋ ์ค์ ์ ๋ง๋ค์ด๋ด๋ ๊ฒ์ ๋๋ค. ๋จ, ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด, ์ค๋ณต๋๋ ๋น์ด ์ค์ ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธํ ๋ฐ, ์ด๋ฅผ ๋๋นํ์ฌ ์ฒ๋ฆฌํ ๋ก์ง์ด ๋์ ๋๋ ๊ฒ ์์ต๋๋ค.
๋ฐ๋ก Set์ ์ด์ฉํด์ ์ ์ธํ ์ค์ ๋ค์ ์ ์ฅํ๋๋ฐ, ์ฌ๊ธฐ์ ์ ์ธํ ์ค์ ๋ค์ ์ค๋ณต๋ ์ค์ removeDuplicates ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ด๋ฏธ ์ถ๋ ค์ง ๊ฒ์ด์ฃ . ๋ง์ง๋ง์ผ๋ก ์ด ์ค์์ ํ๋ก์ ํธ์ ์ฌ์ฉ๋๋ Bean๋ง Importํ ์๋ ์ค์ ๋์์ผ๋ก ์ ํ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด๋ค ํด๋์ค์ ๋ฑ๋ก๊ณผ ์๋ ์ค์ ์ ์ฌ์ฉ๋๋ ํ์ผ๋ค์ ์ด๋ค ๊ฒ์ผ๊น์?
- META-INF/spring.factories
- ์๋ ์ค์ ๋์ ํด๋์ค ๋ชฉ๋ก์ผ๋ก @EnableAutoConfiguration ์ฌ์ฉ์, ํด๋น ํด๋์ค๋ค์ ์๋ ์ค์ ๋์์ด ๋๋ค. - META-INF/spring-configuration-metadata.json: ์๋ ์ค์ ์ ์ฌ์ฉํ Property ์ ์ ํ์ผ์ด๋ค.
- org/springframework/boot/autoconfigure: ๋ฏธ๋ฆฌ ๊ตฌํํด๋์ ์๋ ์ค์ ๋ฆฌ์คํธ์ด๋ค. ๋๋ถ๋ถ ์๋ฐ ์ค์ ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ฐ๊พผ Embedded Tomcat์ LISTEN PORT ์ค์ ๊ฐ๋ ์๊ฒ ์ฃ ? ๋ค, ๋ง์ต๋๋ค. ์ฌ๊ธฐ์ ์์ต๋๋ค.
์ค์ ๋ก ์ด ๊ณณ์๋ Spring REST ๋ฟ ์๋๋ผ Spring Security ๋ฑ ๋ค์ํ ๋ชจ๋์ ๋ํ ์๋ ์ค์ ๊ฐ์ด ๋ด๊ฒจ์ ธ ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋์ ๋ํด์๋ ์ฐจํ ํฌ์คํธ์์ ๋ค๋ฃฐ ๊ฒ์ด์ง๋ง, ์ Spring boot์์ ์ด๋ฐ Key-value ํํ์ ๊ฐ ๋ง์ผ๋ก ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ์ด ๋ฐ๋ ์ ์๋์ง ์ดํด๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ข ๋ ์์ธํ ๋ด์ฉ์ ๋ํด์๋ ์๋ ์ค์ ์ ๋ํ ํํธ๋ฅผ ๋ค๋ฅธ ํฌ์คํธ์์ ํ ๋ฒ ๋ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
YAML
์ฌํ๊น์ง Property๋ฅผ ์ฌ์ฉํด์ Spring boot์ ํ๊ฒฝ ์ค์ ์ ๋ค๋ค๋ดค์ต๋๋ค. ํ์ง๋ง Properties์์๋ ํํ์ ํ๊ณ์ ์ด ์กด์ฌํ์ฌ Spring Project ํ์์๋ YAML์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ณธ๋, YAML์ ์ฌ์ฉํ๋ ค๋ฉด SnakeYAML ๋ชจ๋์ ๋ณ๋๋ก ์ค์นํด์ผ ํ์ง๋ง, ์ด์ ๋ Spring boot Starter์ ์ด ๋ชจ๋์ด ๊ธฐ๋ณธ์ผ๋ก ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก ์์กด์ฑ์ ์ถ๊ฐํ ํ์ ์์ด application.properties๋ฅผ application.yml๋ก๋ง ์ด๋ฆ์ ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ application.properties์ application.yml ํ์ผ์ด ๋ ๊ฐ ๋ค ์กด์ฌํ๋ฉด ์ด๋ป๊ฒ ๋๋์?
---> ๊ทธ๋ด ๋ application.yml ํ์ผ๋ง ์ค๋ฒ๋ผ์ด๋ ๋์ด ์ ์ฉ๋ฉ๋๋ค.
Environment Settings
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค๋ณด๋ฉด, ๊ณตํต์ ์ธ ๊ณ ๋ฏผ ๊ฑฐ๋ฆฌ๋ ๋ฐ๋ก ๋ฐฐํฌ ํ์ ๋ฌธ์ ์ ๋๋ค. ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ ๋์ํ์๋ค๊ฐ๋ ํญ์ ๋ฐฐํฌ ํ ํ๋ก๋์ ํ๊ฒฝ์์๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ํ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์๋ CI/CD ํ๊ฒฝ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ฐ๊ฒ ๋๋ฉด, ์ค์ ์ด์ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฌ์ฉ์ ๊ณ์ ๋ฑ์ ์ค์ ์ ์ํด ์ฐ๋ฆฌ๋ ์๋ฒ์ ํ๊ฒฝ ์ค์ ์ ๋งค๋ฒ ๋ฐ๊ฟ์ผ ํฉ๋๋ค.
์ด๋ฌํ ๋ถํธํจ์ ํด์ํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ๊ฒฝ์ ๋๋๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋๋ฐ, ์ฐ๋ฆฌ๋ ์ด๋ฌํ ํ๊ฒฝ์ ๋๋๊ธฐ ์ํด์ ์ด๋ป๊ฒ ์ค์ ํ์ผ์ ๊ตฌ์ฑํด์ผ ํ๊ณ , Spring boot์์ ์ด๋ค ๊ฒ์ ์ด์ฉํ๋ฉด ๋๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ ๊ฐ๋ฐ, ์ด์, ํ ์คํธ ํ๊ฒฝ ์ด๋ ๊ฒ 3๊ฐ๋ก ๋๋๋ค๊ณ ๊ฐ์ ํ๊ณ , ๊ฐ๊ฐ YAML ํ์ผ์ ์์ ๊ฐ์ด ์์ฑํด์ค๋๋ค.
# application-dev.yml
spring:
profiles: dev
server:
port: 1412
# application-prod.yml
spring:
profiles: prod
server:
port: 80
# application-test.yml
spring:
profiles: test
server:
port: 8081
์์ ๊ฐ์ด ๊ฐ ํ์ผ์ dev, prod, test ๋ฑ 3๊ฐ์ง ํ๊ฒฝ์ ๋ง๋ค๊ณ , ์ ์ฅํฉ๋๋ค.
# application.yml
server:
port: 8080
spring:
profiles:
active: dev
์ํ๋ ํ๊ฒฝ์ ์ ์ฉํ๊ณ ์ ํ ๊ฒฝ์ฐ์๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ application.yml ํ์ผ์ ํ๋ ๋ง๋ค์ด ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐ, active ์ชฝ์ ๊ฐ์ ์ํ๋ ํ๊ฒฝ์ผ๋ก ์ค์ ํ์๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ, ํด๋น ํ๊ฒฝ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ์๋ ์์ ํฌํธ ์ฃผ์๋ก ์คํ๋ฉ๋๋ค.
์ด ์ธ์๋ IntelliJ IDEA์์ ํ๋ก์ ํธ ์ค์ ์ ํตํด์๋ ํ๊ฒฝ ์ค์ ์ ์งํํ ์ ์์ต๋๋ค.
์ฒ์์๋ ์ฝํ๋ฆฐ ์คํ ํ๊ฒฝ๋ง ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก Spring boot์ ํ๊ฒฝ ์ค์ ์ ๋ง๋ค์ด์ค์ผ ํฉ๋๋ค. Templates ๋ฒํผ์ ํด๋ฆญํ์ฌ Spring boot Configuration์ ์ถ๊ฐํด์ค๋๋ค.
๊ทธ๋ฐ ๋ค์, ์ ์ ํ ์ด๋ฆ์ ์ ๋ ฅํ๊ณ , Main class์ Spring boot Main Application ํด๋์ค๋ฅผ ๋ฃ์ด์ค ๋ค์, Active Profiles์ ์ํ๋ ํ๊ฒฝ ์ค์ ํ์ผ์ ์ ๋ ฅํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Spring boot Configuration์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๊ฒฝ์ฐ, application.yml ํ์ผ์ ์ ์๋ actives๋ ๋ฌด์๋ฉ๋๋ค.