Posts Spring Update 2.1
Post
Cancel

Spring Update 2.1

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)

๊ตฌ์ฒด์  ์ˆœ์„œ(๊ณผ๊ฑฐ)

  1. ํ•„์š”์—†๋Š” ์˜์กด์„ฑ exclusion
  2. ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์šฉ ๋ธŒ๋ฆฟ์ง€(๋ณดํ†ต JCL-over-SLF4J) ์˜์กด์„ฑ ์ถ”๊ฐ€
  3. SLF4J ์ถ”๊ฐ€
  4. SLF4J ๋ฐ”์ธ๋”
  5. ๋กœ๊ฑฐ

Spring-jcl ๋“ฑ์žฅ!

์œ„์˜ ์ˆœ์„œ์— ๋”ฐ๋ฅธ ๋ณต์žกํ•จ์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค.

  1. ๊ธฐ์กด ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋กœ๊น…ํ•˜๋Š” ์ฝ”๋“œ(JCL ์‚ฌ์šฉ)๋ฅผ ์ „๋ถ€ ๊ณ ์น  ์ˆ˜๋Š” ์—†๋‹ค.
  2. JCL ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ SLF4J๋ฅผ ์“ฐ๊ธธ ๋ฐ”๋ž€๋‹ค.
  3. ๋ณต์žกํ•œ ์„ค์ •์„ ๊ฐ•์š”ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค.

๊ทธ๋ž˜์„œ ์Šคํ”„๋ง์ด ๋งŒ๋“  JCL์šฉ ๋ธŒ๋ฆฟ์ง€!

  • JCL-over-SLF4J์˜ ๋Œ€์ฒด์ œ
  • ํด๋ž˜์ŠคํŒจ์Šค์— Log4J 2๊ฐ€ ์žˆ๋‹ค๋ฉด JCL์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ Log4j 2๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํด๋ž˜์ŠคํŒจ์Šค์— SLF4J๊ฐ€ ์žˆ๋‹ค๋ฉด JCL์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๊ฐ€ SLF4J๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ JCL๊ณผ ๊ฐ™์€๋ฐ ๊ตฌํ˜„๋ถ€๋ฅผ ๋ณด๋ฉด ์œ„์™€ ๊ฐ™์Œ(๋ธŒ๋ฆฟ์ง€๊ฒธ ๋ฐ”์ธ๋” ์—ญํ• ) ๊ป๋ฐ๊ธฐ๋งŒ JCL์ž„

  • Log4J 2๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ณ„๋‹ค๋ฅธ ๋ธŒ๋ฆฟ์ง€๋‚˜ ๋ฐ”์ธ๋”๊ฐ€ ํ•„์š”์—†๋‹ค.
  • SLF4J๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋„ JCL์„ ๊ตณ์ด exclusionํ•˜๊ฑฐ๋‚˜ JCL์šฉ ๋ธŒ๋ฆฟ์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š” ์—†๋‹ค.

## ๐Ÿ’ฟ ๋นˆ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๊ธฐ๋ณธ ์„ค์ • ๋ณ€๊ฒฝ

๋นˆ ๋“ฑ๋ก ๊ณผ์ •

  1. App์— ์ •์˜ํ•œ ๋นˆ ๋“ฑ๋ก
  2. ์ž๋™ ์„ค์ •์ด ์ œ๊ณตํ•˜๋Š” ๋นˆ ๋“ฑ๋ก

์ด๋•Œ 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 ๊ตฌ๋™ ์ดํ›„์—๋„ ๋งŒ๋“ค์ง€ ์•Š๋‹ค๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์‚ฌ์šฉํ•  ์‹œ์ ์— ๋งŒ๋“ค์–ด ์ฃผ์ž…ํ•ด์ค€๋‹ค.
  • 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 ์—”๋“œํฌ์ธํŠธ์— ์ •๋ณด ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•
    1. Info ํ‚ค๊ฐ’์— ๋“ค์–ด์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ
    2. git.properties์— ๋“ค์–ด์žˆ๋Š” ํ”„๋กœํผํ‹ฐ
    3. META-INFO/build-info.properties์— ๋“ค์–ด์žˆ๋Š” ํ”„๋กœํผํ‹ฐ
This post is licensed under CC BY 4.0 by the author.

Spring QueryDsl

Design Pattern 1