Spring Update 2.1
๐ฟ ์ฉ์ด
- ์ถ์์ผ: 2018๋ 10์
- ์กฐ์ ๋ณ๊ฒฝ ๋ด์ญ
- Spring Framework 5.1
- ์๋ฐ 11 ์ง์
- ์คํ๋ง ๋ฐ์ดํฐ JPA, lazy ๋ชจ๋ ์ง์
- ์คํ๋ง App์ด ์ข ๋ ๋น ๋ฅด๊ฒ ๋จ๊ฒ ํ๊ธฐ ์ํ์ฌ Repository๊ฐ ํ์ํ ๋ ์์ฑ๋๋๋ก lazy ๋ชจ๋ ์ง์
- ์์กด์ฑ ๋ณ๊ฒฝ
- Hibernate 5.3(JPA 2.2)
- Tomcat 9
- Junit 5.2
- ๋น ์ค๋ฒ๋ผ์ด๋ฉ์ ๊ธฐ๋ณธ์ผ๋ก ํ์ฉํ์ง ์๋๋ก ๋ณ๊ฒฝ
- Actuator์ โ/Infoโ์ โ/healthโ ๊ณต๊ฐํ๋๋ก ๋ฐ๋
- ํ๋กํผํฐ ๋ณ๊ฒฝ
- ๋ก๊น ๊ทธ๋ฃน
๐ฟ ์์กด์ฑ ๋ณ๊ฒฝ
- ์คํ๋ง Framework 5.0 -> 5.1
- ๋ก๊ฑฐ ์ค์ spring-jcl
- ์ปดํฌ๋ํธ ์ค์บ๋ ์ฑ๋ฅ ๊ฐ์ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ ์ธ๋ฑ์ค ๊ธฐ๋ฅ ์ ๊ณต
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ ์ง์
- ์ฝํ๋ฆฐ ์ง์
- ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ ์ง์
- JUnit 5 ์ง์
- JUnit 4.12 -> 5.2
- Jupiter
- Extension ๋ชจ๋ธ
- ๋๋ค ์ง์
- Tomcat 8.5.39 -> Tomcat 9
- BIO ์ปค๋ฅํฐ ์ฌ๋ผ์ง๊ณ NIO ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ
- HTTP/2 ์ง์
- ์น์์ผ 2.0 ์ง์
- ์๋ธ๋ฆฟ 4.0 / JSP 2.4 ์ง์
- Hiberante 5.2 -> 5.3
- JPA 2.2 ์ง์
- Java 8์ Date์ Time API ์ง์
๐ฟ JCL
- Logging Facade: ์๊ฐ ๋ก๊ฑฐ๋ฅผ ๊ณจ๋ผ์ ์ Facade(์ ๋ฉด)
- JCL(๊ฑฐ์ ์์)
- SLF4J(์ปดํ์ผ ํ์์ ๋ก๊ฑฐ ๊ฒฐ์ )
- Logger: ๋ก๊ฑฐ ํผ์ฌ๋๋ฅผ ๊ณจ๋ฅด๋ฉด ํผ์ฌ๋๊ฐ ๋ก๊ฑฐ๋ฅผ ๊ณ ๋ฅด๊ณ ๋ก๊ฑฐ๊ฐ ์ผ์ ํจ
- JUL
- Log4j, Log4j 2(์ด๊ฑฐ)
- Logback(์ด๊ฑฐ)
- ๋ฌธ์ ์ ๋ฐ ํด๊ฒฐ
- ๊ธฐ์กด์ ์ด๋ฏธ ๋ค๋ฅธ ๋ก๊น
ํผ์ฌ๋๋ ๋ก๊ฑฐ๋ฅผ ์ฌ์ฉ ์ค์ธ ํ๋ก์ ํธ๋?(์ฆ ํ์ฌ๋ JCL + Logback ์ผ๋)
- SLF4J๋ก ํตํ๋ Bridge(๋ค๋ฆฌ)๋ฅผ ๋๋๋ค.(JCL-over-SLF4J)
- Log4J์์ SLF4J๋ก ๋ค๋ฆฌ๋ฅผ ๋๋๋ค.(Log4j-to-SLF4J)
- SLF4J๊ฐ ์ฌ์ฉํ ๋ก๊ฑฐ๋ ์ด๋ป๊ฒ ์ ํ์ง?
- ์ฌ์ฉํ ๋ก๊ฑฐ๋ฅผ ์ ํด์ค๋ค.(Binder)
- ๊ธฐ์กด์ ์ด๋ฏธ ๋ค๋ฅธ ๋ก๊น
ํผ์ฌ๋๋ ๋ก๊ฑฐ๋ฅผ ์ฌ์ฉ ์ค์ธ ํ๋ก์ ํธ๋?(์ฆ ํ์ฌ๋ JCL + Logback ์ผ๋)
๊ตฌ์ฒด์ ์์(๊ณผ๊ฑฐ)
- ํ์์๋ ์์กด์ฑ exclusion
- ๋ ๊ฑฐ์ ์ฝ๋์ฉ ๋ธ๋ฆฟ์ง(๋ณดํต JCL-over-SLF4J) ์์กด์ฑ ์ถ๊ฐ
- SLF4J ์ถ๊ฐ
- SLF4J ๋ฐ์ธ๋
- ๋ก๊ฑฐ
Spring-jcl ๋ฑ์ฅ!
์์ ์์์ ๋ฐ๋ฅธ ๋ณต์กํจ์ ์ ๊ฑฐํ๊ณ ์ถ๋ค.
- ๊ธฐ์กด ์คํ๋ง ํ๋ ์์ํฌ์์ ๋ก๊น ํ๋ ์ฝ๋(JCL ์ฌ์ฉ)๋ฅผ ์ ๋ถ ๊ณ ์น ์๋ ์๋ค.
- JCL ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์ผ๋ฉฐ SLF4J๋ฅผ ์ฐ๊ธธ ๋ฐ๋๋ค.
- ๋ณต์กํ ์ค์ ์ ๊ฐ์ํ๊ณ ์ถ์ง ์๋ค.
๊ทธ๋์ ์คํ๋ง์ด ๋ง๋ JCL์ฉ ๋ธ๋ฆฟ์ง!
- JCL-over-SLF4J์ ๋์ฒด์
- ํด๋์คํจ์ค์ Log4J 2๊ฐ ์๋ค๋ฉด JCL์ ์ฌ์ฉํ ์ฝ๋๊ฐ Log4j 2๋ฅผ ์ฌ์ฉํ๋ค.
- ํด๋์คํจ์ค์ SLF4J๊ฐ ์๋ค๋ฉด JCL์ ์ฌ์ฉํ ์ฝ๋๊ฐ SLF4J๋ฅผ ์ฌ์ฉํ๋ค.
์ธํฐํ์ด์ค๊ฐ JCL๊ณผ ๊ฐ์๋ฐ ๊ตฌํ๋ถ๋ฅผ ๋ณด๋ฉด ์์ ๊ฐ์(๋ธ๋ฆฟ์ง๊ฒธ ๋ฐ์ธ๋ ์ญํ ) ๊ป๋ฐ๊ธฐ๋ง JCL์
- Log4J 2๋ฅผ ์ฌ์ฉํ ๋๋ ๋ณ๋ค๋ฅธ ๋ธ๋ฆฟ์ง๋ ๋ฐ์ธ๋๊ฐ ํ์์๋ค.
- SLF4J๋ฅผ ์ฌ์ฉํ ๋์๋ JCL์ ๊ตณ์ด exclusionํ๊ฑฐ๋ JCL์ฉ ๋ธ๋ฆฟ์ง๋ฅผ ์ถ๊ฐํ ํ์ ์๋ค.
## ๐ฟ ๋น ์ค๋ฒ๋ผ์ด๋ฉ ๊ธฐ๋ณธ ์ค์ ๋ณ๊ฒฝ
๋น ๋ฑ๋ก ๊ณผ์
- App์ ์ ์ํ ๋น ๋ฑ๋ก
- ์๋ ์ค์ ์ด ์ ๊ณตํ๋ ๋น ๋ฑ๋ก
์ด๋ 1๋ฒ์ด ์ ์ํ ๋น์ 2๋ฒ ๊ณผ์ ์์ ๋ฑ๋กํ๋ ๋น์ด ์ฌ์ ์ ํ ์๋ ์๋๋ฐ ์คํ๋ง ๋ถํธ 2.1 ์ด์ ๊น์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฉํ์์ง๋ง 2.1 ์ดํ๋ก๋ ํ์ฉํ์ง ์๋๋ค.
๐ฟ ์๋ ์ค์ ์ง์
- ํ์คํฌ ์คํ
- @EnableAsync ์ฌ์ฉ์ ์๋ ์ค์ (TaskExecutionAutoConfiguration) ์ ์ฉ
- spring.task.execution ํ๋กํผํฐ๋ก ์ ๊ณต
- TaskExecutorBuilder ์ ๊ณต
- ํ์คํฌ ์ค์ผ์ค๋ง
- @EnableScheduling ์ฌ์ฉ ์ ์๋ ์ค์ (TaskSchedulingAutoConfiguration) ์ ์ฉ
- spring.task.execution ํ๋กํผํฐ ์ ๊ณต
- TaskSchedulerBuilder ์ ๊ณต
- ์คํ๋ง ๋ฐ์ดํฐ JDBC
- spring-boot-starter-data-jdbc ์์กด์ฑ ์ถ๊ฐ์ ์ง์
- ๊ทธ ๋ฐ์
- ์นดํ์นด ์คํธ๋ฆผ ์ง์
- JMS ConnectionFactory ์บ์ ์ง์
- ์๋ผ์คํฑ ์์น REST ํด๋ผ์ด์ธํธ ์ง์
๐ฟ ํ๋กํผํฐ ๋ณ๊ฒฝ
- ์คํ๋ง ๋ฐ์ดํฐ JPA ๋ถํธ์คํฌ๋ฉ ๋ชจ๋ ์ง์
- APP ๊ตฌ๋ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ์คํ๋ง ๋ฐ์ดํฐ JPA Repository ์์ฑ์ ์ง์ฐ ์ํค๋ ์ค์
- spring.data.jpa.repositories.bootstrap-mode=deferred
- DEFERRED: APP ๊ตฌ๋ ์ดํ์ Repository ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ฃผ์ ํด ์ค๋ค.(์ด์ ์๋ Proxy ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.)
- LAZTY: APP ๊ตฌ๋ ์ดํ์๋ ๋ง๋ค์ง ์๋ค๊ฐ ์ฒ์์ผ๋ก ์ฌ์ฉํ ์์ ์ ๋ง๋ค์ด ์ฃผ์ ํด์ค๋ค.
- APP ๊ตฌ๋ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ์คํ๋ง ๋ฐ์ดํฐ JPA Repository ์์ฑ์ ์ง์ฐ ์ํค๋ ์ค์
- JpaProperties์์ ํ์ด๋ฒ๋ค์ดํธ ๊ด๋ จ ํ๋กํผํฐ๋ฅผ HibernateProperties๋ก ๋ถ๋ฆฌ
- Migration ํด: ํ๋กํผํฐ ๋ง์ด๊ทธ๋ ์ด์
์ ํ์ง ์๋๋ผ๋ ๊ธฐ์กด ํ๋กํผํฐ๋ก APP ๊ตฌ๋์ด ๊ฐ๋ฅํ๋ฉฐ ํ๋กํผํฐ๊ฐ ์ด๋ป๊ฒ ๋ฐ๋์๋์ง ์๋ ค์ฃผ๋ ํด
- spring-boot-properties-migrator
๐ฟ Data Size
- org.springframework.util.unit.DataSize
- ์คํ๋ง ๋ถํธ๊ฐ ์๋๋ผ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ 5.1๋ถํฐ ์ง์ํ๋ ํ์ ์ผ๋ก ๋ฐ์ดํฐ ์ฌ์ด์ฆ MB, GB๋ฑ์ ํํํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ํ์ ์ด๋ค.
- ์ง์ํ๋ ํ์ : B, KB, MB, GB, TB
- ์คํ๋ง ๋ถํธ๋ ์ปจ๋ฒํฐ๋ฅผ ์ง์
- StringToDataSizeConverter
- NumberToDataSizeConverter
๐ฟ ๋ก๊ทธ ๊ทธ๋ฃน
๊ฐ์ ๋ก๊ทธ ๋ ๋ฒจ์ ์ ์ฉํ ํจํค์ง ๋ฌถ์์ ๋ง๋ค ์ ์๋ ๊ธฐ๋ฅ์ผ๋ก ์ฌ๋ฌ ํจํค์ง์ ๋ก๊ทธ ๋ ๋ฒจ์ ์์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
- ๋ก๊ทธ ๊ทธ๋ฃน ์ ์
- logging.group.{๊ทธ๋ฃน ์ด๋ฆ}={ํจํค์ง}, {ํจํค์ง}, {ํจํค์ง}
- logging.level.{๊ทธ๋ฃน ์ด๋ฆ}={๋ก๊ทธ ๋ ๋ฒจ}
- ์คํ๋ง ๋ถํธ๊ฐ ๋ฏธ๋ฆฌ ์ ์ํด๋ ๋ก๊ทธ ๊ทธ๋ฃน
- web = ์คํ๋ง ์นMVC ๊ด๋ จ ํจํค์ง ๋ก๊ทธ ๊ทธ๋ฃน
- sql = ์คํ๋ง JDBC์ ํ์ด๋ฒ๋ค์ดํธ SQL์ ๋ฌถ์ด๋ ๋ก๊ทธ ๊ทธ๋ฃน
๐ฟ Actuator
- /Info์ /health ์๋ํฌ์ธํธ๊ฐ ์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ถ๊ฐํ๋๋ผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก โ๊ณต๊ฐโํ๋๋ก ๋ณ๊ฒฝ๋จ
- 2.0 ์์๋ ์ํ๋ฆฌํฐ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ์๋ํฌ์ธํธ๊ฐ ์ธ์ฆ์ ๊ฑฐ์ณ์ผ ํ์
- ๋ฌผ๋ก ์ค์ ์ ํตํด ์ปจํธ๋กค ํ ์ ์์
- /Info ์๋ํฌ์ธํธ์ ์ ๋ณด ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
- Info ํค๊ฐ์ ๋ค์ด์๋ ๋ชจ๋ ํ๋กํผํฐ
- git.properties์ ๋ค์ด์๋ ํ๋กํผํฐ
- META-INFO/build-info.properties์ ๋ค์ด์๋ ํ๋กํผํฐ