5 min read

[๋ฏธ์„ธ๋จผ์ง€ Tip] Spring Boot Live Reload

Table of Contents

์˜คโ€ฆ ์ด๊ฒŒ ๊ธฐ๋ณธ ์˜ต์…˜์ด ์•„๋‹ˆ๊ตฌ๋‚˜

์˜ค๋Š˜ ๊น€์˜ํ•œ๋‹˜์˜ Spring Boot ์ž…๋ฌธ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ต‰์žฅํžˆ ๊ธฐ๋ณธ ์„ธํŒ…์„ ํ•˜๊ณ , static index ํŽ˜์ด์ง€๋ฅผ ์žก์•„์ฃผ๊ณ , ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ ๋™์ ์œผ๋กœ ์›€์ง์ด๋Š” ํŽ˜์ด์ง€๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์˜ํ•œ๋‹˜๊ป˜์„œ ๊ณ„์† ํ”„๋กœ์ ํŠธ๋ฅผ ๊ป๋‹ค ์ผœ์•ผํ•œ๋‹ค๊ณ  ํ•˜์…จ๋‹ค. ๊ธฐ์กด์— React์˜ Hot Reload์— ๊ธธ๋“ค์—ฌ์ ธ๋ฒ„๋ฆฐ ๋‚˜์—๊ฒŒ ๊ต‰์žฅํžˆ ๋ถˆํŽธํ•˜๊ฒŒ ๋А๊ปด์กŒ๋‹ค.

์˜ํ•œ๋‹˜๊ป˜์„œ ๊ฐ•์˜ ๋…ธํŠธ์— spring-boot-devtools ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์—†์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์…”์„œ ๋ฐ”๋กœ ๊ฒ€์ƒ‰ํ•ด ๋ณด์•˜๋‹ค.

์ผ๋‹จ ๊น”์ž!

node์—์„œ package.json ์ด ์žˆ๋“ฏ, Spring Boot์—์„œ๋Š” ๋Œ€๊ฐœ Gradle ์ด๋ผ๋Š” ๋นŒ๋“œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•œ๋‹ค. Spring Boot ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” build.gradle ์— dependencies ๋ถ€๋ถ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค.

dependencies {
    // ... ๊ธฐ์กด ๋””ํŽœ๋˜์‹œ๋“ค
		// ์•„๋ž˜ ๋…€์„์„ ์ถ”๊ฐ€ํ•ด์ฃผ์ž!
    developmentOnly("org.springframework.boot:spring-boot-devtools")
}

IntelliJ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํŒŒ์ผ์— ์ˆ˜์ •์„ ๊ฐ€ํ•˜์ž ๋งˆ์ž Gradle Changes๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

live_reload_01

๋ˆˆ์— ๋„๋ฉด ๋ฐ”๋กœ ํด๋ฆญํ•˜๋ฉด ๋˜๊ณ , ์•„๋‹ˆ๋ฉด Ctrl + Shift + O ๋ฅผ ํ†ตํ•ด์„œ Gradle์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

IntelliJ์˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์ฃผ์ž

์ด์ œ IntelliJ์˜ ์„ค์ •์„ ์žก์•„์ฃผ์–ด์•ผ ํ•œ๋‹ค. ํ™•์‹คํžˆ node ์ƒํƒœ๊ณ„์™€ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ IDE์™€ ํ”„๋ ˆ์ž„์›Œํฌ, ์–ธ์–ด๊ฐ€ ์œ ๊ธฐ์ ์œผ๋กœ ๋ถ™์–ด์„œ ์›€์ง์ธ๋‹ค๋Š” ๋А๋‚Œ์ด ๋“ค์—ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  VSCode๋กœ Spring Boot ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด ์ •๋ง ๋งŽ์€ Configuration์„ ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋А๋‚Œ๋„ ๋“ค์—ˆ๋‹ค)

  1. ์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ File - Settings(mac์—์„œ๋Š” Preference) ์„ ์—ด์–ด์ค€๋‹ค.
  2. ์ขŒ์ธก ๋ฉ”๋‰ด์—์„œ Build, Execution, Deployment - Compiler ๋กœ ๊ฐ€๋ณด์ž. (Build, Execution, Deployment ๋Š” ํŽผ์น˜๊ธฐ ํ™”์‚ดํ‘œ, Compiler ๋Š” ๊ทธ๋ƒฅ ํด๋ฆญ)
  3. ๊ทธ๋Ÿฌ๋ฉด ์ฒดํฌ ๋ฉ”๋‰ด๋“ค ์ค‘์— Build Project automatically ๊ฐ€ ์žˆ๋‹ค. ์ด ๋…€์„์ด ์•„๋งˆ ์ฒดํฌ ํ•ด์ œ ๋˜์–ด์žˆ์„ ํ…๋ฐ, ์ฒดํฌ ํ•ด์ฃผ์ž.
  4. IntelliJ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅธ๋ฐ, ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์—์„œ๋Š” Settings ์ตœ์ƒ๋‹จ ๋ฉ”๋‰ด์— Advanced Settings ๊ฐ€ ์žˆ๋‹ค. ๊ทธ ๊ณณ์œผ๋กœ ๊ฐ€๋ณด์ž.
  5. ๊ทธ๋Ÿฌ๋ฉด Compiler ๊ด€๋ จ ํ•ญ๋ชฉ์— Allow auto-make to start even if developed application is currently running ์ด ์žˆ๋‹ค. ์ด ๋…€์„๋„ ์ฒดํฌ ํ•ด์ œ ๋˜์–ด์žˆ์„ ํ…๋ฐ, ์ฒดํฌ ํ•ด์ฃผ์ž.
  6. ๊ทธ๋ฆฌ๊ณ  Settings ์—์„œ OK ๋ฅผ ๋ˆŒ๋Ÿฌ ์ €์žฅํ•˜๊ณ  ๋‹ซ์•„์ฃผ์ž.

์ผ๋‹จ ๋œ๋‹ค! ๊ทผ๋ฐโ€ฆ ์›๋ž˜ ์ด๋Ÿฐ๊ฐ€?

๊ทธ๋ฆฌ๊ณ  ์ด ์ƒํƒœ๋กœ Spring Boot์—์„œ ์‚ฌ์šฉํ•˜๋Š” controller ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์กฐ๊ธˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์•Œ์•„์„œ ์žฌ์‹œ์ž‘์ด ๋œ๋‹ค.

๊ทผ๋ฐโ€ฆ ๊ฐ‘๊ฐ‘ํ•˜๋‹ค! node๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์ €์žฅ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„ ํœ˜๋ฆฌ๋ฆญ~ ๋ฟ…! ์žฌ์‹œ์ž‘์ด ๋๋Š”๋ฐ, Spring์€ ์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค. ์ด๋Ÿด ๋ฐ”์—๋Š” ๊ทธ๋ƒฅ Shift + F10 ์„ ์ž…๋ ฅํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์•„์˜ˆ ์žฌ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ๋น ๋ฅด๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค ์ •๋„์ด๋‹ค. ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋‹ค์Œ์˜ ๊ธ€์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

Canโ€™t get devtools auto build service working on Windowsโ€ฆ

์œ„ ๊ธ€์— ๋”ฐ๋ฅด๋ฉด, ๋ช‡ ๊ฐ€์ง€์˜ IntelliJ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ค์ •์„ ํ†ตํ•ด์„œ ์ง€์—ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋˜์–ด์žˆ๋‹ค.

  1. Ctrl + Shift + A ํ˜น์€ ์ƒ๋‹จ์˜ Help - Find Action ์œผ๋กœ Action ์‹คํ–‰ ๊ฒ€์ƒ‰์ฐฝ์„ ์—ด๊ณ , ๊ทธ ๊ณณ์— Registry ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์—ด์–ด์ฃผ์ž.
  2. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์˜ ์„ค์ •๋“ค์„ ๋ณ€๊ฒฝํ•ด์ฃผ์ž.
    • compiler.document.save.enabled - ๋ฌธ์„œ(์ฝ”๋“œ)์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ €์žฅํ• ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ผ์ข…์˜ ์ž๋™ ์ €์žฅ ์˜ต์…˜์ด๋‹ค. ์ฒ˜์Œ์—๋Š” ํ™œ์„ฑํ™” ํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์•„๋ž˜ ์„ค์ •๋“ค์— ๋งž๋ฌผ๋ ค์„œ ๊ฐ•์ œ๋กœ ์ž๋™์ €์žฅ์„ ๋งค์šฐ ๋นจ๋ฆฌ ํ•˜๊ฒŒ ๋๊ณ , ์‹ค์งˆ์ ์œผ๋กœ ์ฝ”๋”ฉ์„ ํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ–ˆ๋‹ค. ์•„๋ž˜์˜ ์„ค์ •๋“ค์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด ์ผœ๋‘ฌ๋„ ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋ˆ ์ƒํƒœ๋กœ ์‚ฌ์šฉํ•˜์ž.
    • compiler.document.save.trigger.delay - ๋ฌธ์„œ(์ฝ”๋“œ) ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋ฐ˜์‘์œผ๋กœ ์ €์žฅ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์ „์˜ ์ง€์—ฐ ์‹œ๊ฐ„(ms ๋‹จ์œ„)์ด๋‹ค. ๋‚˜๋Š” 100์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.
    • compiler.automake.postpone.when.idle.less.than - Autobuild๊ฐ€ ์‹œ์ž‘ํ•˜๋ ค๋Š” ์ˆœ๊ฐ„์— IntelliJ๊ฐ€ ์ง€์ •๋œ ๊ฐ’(ms ๋‹จ์œ„) ๋ฏธ๋งŒ์˜ ๊ฐ„๊ฒฉ์œผ๋กœ Idle ์ƒํƒœ์ด๋ฉด ์‚ฌ์šฉ์ž์˜ ์ž‘์—…์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก Autobuild๋ฅผ ๋ฏธ๋ฃจ๋Š” ์˜ต์…˜์ด๋‹ค. ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ๋‚ด๊ฐ€ ์ฝ”๋“œ์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•œ๋‹ค๋˜๊ฐ€ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ทธ๋™์•ˆ์€ ๋นŒ๋“œ๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ. ์ด๊ฒƒ๋„ 100์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.
    • compiler.automake.trigger.delay - ํŒŒ์ผ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ๊ฐ€ ์ƒ๊ธฐ๋ฉด Auto make๋ฅผ ์–ผ๋งˆ๋‚˜ ๋ฏธ๋ฃฐ์ง€์— ๋Œ€ํ•œ ์ง€์—ฐ ์‹œ๊ฐ„(ms ๋‹จ์œ„) ์ด๊ฒƒ๋„ 100์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค.

์œ„ ์ฒ˜๋Ÿผ ์„ค์ •ํ•ด์ฃผ๋‹ˆ, ํ™•์‹คํžˆ ๋ฐ˜์‘์†๋„๊ฐ€ ์กฐ๊ธˆ ๋นจ๋ผ์ง€๊ธด ํ–ˆ๋‹ค. ์™„์ „ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜์ง€๋Š” ์•Š๋Š”๋ฐ, Spring Boot๊ฐ€ ์ƒˆ๋กœ ๋นŒ๋“œ๋˜๋ฉด์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋‹ค ๋ณด๋‹ˆ, ์–ด๋А์ •๋„์˜ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๋“ฏ๋„ ํ•˜๋‹ค. ์ž์„ธํ•œ ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค. (์‚ฌ์‹ค ์ด๊ฒƒ ๋•Œ๋ฌธ์— ์•„์ง๋„ ์กฐ๊ธˆ ๊ฐ‘๊ฐ‘ํ•˜๋‹ค)

ํ…œํ”Œ๋ฆฟ๋„ ๋ฐ”๊พธ๋ฉด ๋ฐ˜์˜ โ€˜ํ•ด์ค˜โ€™

์œ„์˜ ์„ค์ •์„ ํ•˜๋ฉด Controller์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟจ์„ ๋•Œ๋Š” ์ž๋™ ์žฌ์‹œ์ž‘์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Thymeleaf์™€ ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•  ๋•Œ ํ…œํ”Œ๋ฆฟ์˜ ๋‚ด์šฉ์„ ๋ฐ”๊พธ์–ด๋„ ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ๋ฐ˜์˜์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์ด๋Š” Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ viewResolver๊ฐ€ Resource์ธ ํ…œํ”Œ๋ฆฟ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฝ์–ด์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. (์˜ค๊ฐœ๋…์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ์ž˜ ์•„์‹œ๋Š” ๋ถ„ ์žˆ์œผ๋ฉด ์ง€์ ํ•ด์ฃผ์„ธ์š” ใ… ใ… ) ํ™•์‹คํ•œ ๋‚ด์šฉ์€ ์กฐ๊ธˆ ๋” ์Šคํ„ฐ๋””๋ฅผ ํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์ผ๋‹จ ํ•ด๊ฒฐ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

live_reload_02

  1. ์ด๋ฏธ์ง€ ์œ„์น˜์— ์žˆ๋Š” ๊ณณ์„ ํด๋ฆญํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Edit Configuration ์ด ๋‚˜์˜ค๋Š”๋ฐ, ์ด๊ฒƒ์„ ํด๋ฆญํ•˜์—ฌ ๋นŒ๋“œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

live_reload_03

  1. Modify options ๋ฅผ ํด๋ฆญํ•˜๊ณ , On frame deactivation ์— ๋“ค์–ด๊ฐ€์„œ Update resources ๋ฅผ ์„ ํƒํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์ด ์„ค์ •์„ ํ•˜๋ฉด ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” Spring Boot ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๋™์•ˆ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๊ฒฝ์šฐ resources๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. ํ…œํ”Œ๋ฆฟ ๋‚ด๋ถ€์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์—†์ด ์ž ๊น์˜ ๋Œ€๊ธฐ ํ›„์— ๋ณ€๊ฒฝ๋‚ด์šฉ์ด ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์•ฝ๊ฐ„์˜ ๋ฌธ์ œ

์•„๋งˆ๋„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ’์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋˜๋ฉด์„œ ์„œ๋ฒ„๊ฐ€ ๋‘ ๋ฒˆ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์•„์ง์€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ’์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€ ๋ชปํ•˜๋‹ˆ, ์ถ”ํ›„ ์กฐ๊ธˆ ๋” ์•Œ์•„๋ด์„œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ’์˜ ์Šค์œ— ์ŠคํŒŸ์„ ์ฐพ์•„๋ณด๋Š” ํŽธ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋.