[Spring boot] Node Gradle์„ ์ด์šฉํ•˜์—ฌ Spring ํ”„๋กœ์ ํŠธ์™€ Node ํ”„๋กœ์ ํŠธ ๋ถ™์ด๊ธฐ

๋ฐ˜์‘ํ˜•

Spring boot๋ฅผ ์ด์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” REST API ์„œ๋ฒ„๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ํŽ˜์ด์ง€๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์€ ์•„๋ž˜์˜ 2๊ฐ€์ง€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

  • JSP (Java Server Page)
  • Thymeleaf

JSP์™€ Thymeleaf๋Š” Spring์„ ์ด์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ทฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ ๊ณผ๊ฑฐ์—๋Š” JSP๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ ์ตœ๊ทผ์—๋Š” Thymeleaf๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ HTML ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋‹ค๋ค„ Controller์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋™์ ์œผ๋กœ ํ™”๋ฉด์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์„ ์„œ๋ฒ„ ์‚ฌ์ด๋“ค ๋ Œ๋”๋ง์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ตœ๊ทผ์—๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR) ๊ธฐ๋ฒ•์„ ์ด์šฉํ•œ React.js, Vue.js๋ฅผ ์ด์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ , ๋ฉ€ํ‹ฐ ํŽ˜์ด์ง€๋ณด๋‹ค๋Š” ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ด ์ฃผ๋ฅ˜๊ฐ€ ๋˜์–ด HTML๊ณผ ๊ฐ™์€ ๋งˆํฌ์—… ์–ธ์–ด ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ๋ณด๋‹ค๋Š” Javascript, Typescript ๋“ฑ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœํ•˜๋ฉด ํ•˜๋‚˜์˜ ์„œ๋น„์Šค์—์„œ ํŽ˜์ด์ง€์™€ ์„œ๋ฒ„๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ๊ฐœ๋ฐœ์ด ๋˜๋Š” ์ด๋ฅธ ๋ฐ” Decoupled Architecture๋ฅผ ์ฑ„ํƒํ•˜๋ฉด์„œ Back-end์™€ Front-end๋กœ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” ํ™•์žฅ์„ฑ๊ณผ ์ž์› ์ตœ์ ํ™” ๋“ฑ์˜ ์ด์ ์„ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ€๋“์ดํ•˜๊ฒŒ ์ด๋Ÿฌํ•œ ์ปคํ”Œ๋ง์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋ฉด(์ธ๋ ฅ ๋ฆฌ์†Œ์Šค ๋ฌธ์ œ ๋“ฑ) ์ด๋“ค ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ฐœ๋ฐœํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

 

 

Node Gradle

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ํ•˜๋‚˜์˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ฒ ์ง€๋งŒ ๋ฐฑ์—”๋“œ๋ฅผ Spring์œผ๋กœ ํ•˜๋Š” ๊ฑธ ์›ํ•œ๋‹ค๋ฉด ๋‘ ๊ฐ€์ง€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Spring์€ Java์™€ Kotlin ๋“ฑ์˜ JVM ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , Front-end๋Š” Javascript/Typescript๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐ๋„ ๋‘ ๊ฐ€์ง€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

Javascript/Typescript ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ๋Š” NPM ์ด๋ผ๋Š” ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ , Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋ ค๋ฉด Maven ํ˜น์€ Gradle์ด ํ•„์š”ํ•œ๋ฐ, Gradle์—๋Š” 3rd Party ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•˜์—ฌ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ Gradle ํ™˜๊ฒฝ์—์„œ NPM ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Node Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž…๋‹ˆ๋‹ค.

 

Node Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Gradle ํ™˜๊ฒฝ์—์„œ Node.js ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. NPMTask, NPXTask ๋“ฑ Node ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋“ค์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํ•ด๋‹น Task๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜์—ฌ Javascript/Typescript๋กœ ์ฝ”๋”ฉํ•œ ํŽ˜์ด์ง€๋“ค์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

https://github.com/node-gradle/gradle-node-plugin

 

GitHub - node-gradle/gradle-node-plugin: Gradle plugin for integrating NodeJS in your build. :rocket:

Gradle plugin for integrating NodeJS in your build. :rocket: - GitHub - node-gradle/gradle-node-plugin: Gradle plugin for integrating NodeJS in your build. :rocket:

github.com

Gradle ํ™˜๊ฒฝ์—์„œ ๋จผ์ € Node ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. Node ํ™˜๊ฒฝ์ด ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด Gradle์—์„œ ์ž๋™์œผ๋กœ gradle ์Šคํฌ๋ฆฝํŠธ์— ์ •์˜ํ•œ Node ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฉฐ Node ํ™˜๊ฒฝ์ด ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ FE ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์†Œ์Šค๋ฅผ ๋นŒ๋“œํ•œ ํ›„ ๋นŒ๋“œํ•œ ๊ฒฐ๊ณผ๋ฅผ Spring App์— ๋‹ด๊ณ ๋‚œ ๋’ค Spring App์„ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Spring ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Multi-Module Project

์šฐ๋ฆฌ๋Š” ๋ณดํŽธ์ ์œผ๋กœ Spring ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด Single Module ํ”„๋กœ์ ํŠธ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ gradle ์Šคํฌ๋ฆฝํŠธ๋กœ ๋นŒ๋“œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์‹ฑ๊ธ€ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ผ ํ•ฉ๋‹ˆ๋‹ค.

โ”œโ”€โ”€ app
โ”‚   โ”œโ”€โ”€ .gradle
โ”‚   โ”œโ”€โ”€ .idea
โ”‚   โ”œโ”€โ”€ gradle
โ”‚   โ”œโ”€โ”€ src
โ”‚   โ”œโ”€โ”€ build.gradle.kts
โ”‚   โ”œโ”€โ”€ gradle.properties
โ”‚   โ”œโ”€โ”€ gradlew
โ”‚   โ”œโ”€โ”€ gradlew.bat
โ”‚   โ””โ”€โ”€ settings.gradle.kts

์œ„์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ build.gradle.kts ํŒŒ์ผ๊ณผ ๊ทธ ์™ธ์˜ ํ•˜์œ„์—๋Š” ํ•˜๋‚˜์˜ src๋กœ ๊ตฌ์„ฑ๋œ ๊ฒƒ์„ ์‹ฑ๊ธ€ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋””ํŽœ๋˜์‹œ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ, ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ์ด ํ•˜๋‚˜๋กœ๋งŒ ๊ตฌ์„ฑ๋˜์–ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ FE ์†Œ์Šค ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ์†์„ฑ์˜ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋Œ๋ฆฌ๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

โ”œโ”€โ”€ app
โ”‚   โ”œโ”€โ”€ .gradle
โ”‚   โ”œโ”€โ”€ .idea
โ”‚   โ”œโ”€โ”€ build
โ”‚   โ”œโ”€โ”€ gradle
โ”‚   โ”œโ”€โ”€ project-api
โ”‚   โ”‚    โ”œโ”€โ”€ build
โ”‚   โ”‚    โ”œโ”€โ”€ src
โ”‚   โ”‚    โ””โ”€โ”€ build.gradle.kts
โ”‚   โ”œโ”€โ”€ project-fe
โ”‚   โ”‚    โ”œโ”€โ”€ node_modules
โ”‚   โ”‚    โ”œโ”€โ”€ public
โ”‚   โ”‚    โ”œโ”€โ”€ src
โ”‚   โ”‚    โ”œโ”€โ”€ babel.config.js
โ”‚   โ”‚    โ”œโ”€โ”€ build.gradle.kts
โ”‚   โ”‚    โ”œโ”€โ”€ jsconfig.json
โ”‚   โ”‚    โ”œโ”€โ”€ package.json
โ”‚   โ”‚    โ”œโ”€โ”€ README.md
โ”‚   โ”‚    โ”œโ”€โ”€ vue.config.js
โ”‚   โ”‚    โ””โ”€โ”€ yarn.lock
โ”‚   โ”œโ”€โ”€ build.gradle.kts
โ”‚   โ”œโ”€โ”€ gradle.properties
โ”‚   โ””โ”€โ”€ settings.gradle.kts

๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์ตœ์ƒ์œ„ Gradle ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•˜์œ„ ๋ชจ๋“ˆ์— ์ž‘์„ฑ๋œ Gradle ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณด๊ณ  ๊ฐ๊ธฐ ์ž‘์„ฑ๋œ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ์–ด ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. project-fe์—๋Š” FE๋งŒ์„ ์œ„ํ•œ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด์žˆ์œผ๋ฏ€๋กœ Node Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ด์šฉํ•œ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , project-api์—๋Š” Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ์œผ๋ฏ€๋กœ Spring ๋””ํŽœ๋˜์‹œ์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ์˜ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ชจ๋†€๋ฆฌ์Šค ํ˜•ํƒœ๋กœ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

IntelliJ์—์„œ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ๋Š” ๋จผ์ € ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•˜์œ„ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๋ฉด์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰์„ ์œ„ํ•ด ๋จผ์ € ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ Gradle๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ํด๋”๋ฅผ ์˜ค๋ฅธ์ชฝ ํด๋ฆญํ•œ ๋‹ค์Œ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ์—๋Š” api๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

$ vue create cms-fe

์ด ํฌ์ŠคํŠธ์—์„œ๋Š” FE ์†Œ์Šค ์ฝ”๋“œ๋กœ Vue.js๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์ž ์›ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ํ˜น์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์— ํ”„๋ก ํŠธ์—”๋“œ๋กœ ๊ตฌํ˜„ํ•  ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

๋ชจ๋“ˆ์ด ๋งŒ๋“ค์–ด์ง„ ๋’ค์—๋Š” ์œ„์™€ ๊ฐ™์ด fe ๋ชจ๋“ˆ์—๋„ build.gradle.kts ํŒŒ์ผ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. 

 

 

 

 

์ด์ œ ์ตœ์ƒ์œ„ settings.gradle.kts์—์„œ ๋‘ ๋ชจ๋“ˆ์„ include ํ•ด์ค๋‹ˆ๋‹ค. ๋นŒ๋“œํ•  ๋•Œ ์ด์ œ๋Š” ๋‘ ๋ชจ๋“ˆ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋นŒ๋“œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

๋จผ์ € cms-fe์˜ build.gradle.kts ํŒŒ์ผ์— Node ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ๋…ธ๋“œ ๋ฒ„์ „์€ 18.17.1 ๋ฒ„์ „์ด๊ณ , ํ•ญ์ƒ Node ํ™˜๊ฒฝ์„ ์…‹์—…ํ•˜๋„๋ก ํ™œ์„ฑํ™” ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , Vue ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ๋นŒ๋“œ Task๋ฅผ ํ•œ ๊ฐœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์—๋Š” ํ•ญ์ƒ npm install์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋ฉฐ ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , BUILD_OUT_DIR์ด๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ Spring ํ”„๋กœ์ ํŠธ๋กœ ๋ณด๋‚ด์–ด Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์‹œ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์—ฌ๊ธฐ์„œ๋Š” Vue ๋นŒ๋“œ์— vite๋ฅผ ์ด์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์˜€์œผ๋ฏ€๋กœ vite.config.ts ํŒŒ์ผ์—์„œ Vue์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์šฐ๋ฆฌ๋Š” BUILD_OUT_DIR์ด๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ง€์ •ํ•˜์˜€์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ์„ ๋Œ€๋น„ํ•ด ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋นŒ๋“œ๋˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋‹ค์Œ์€ Spring ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ์›น ํŽ˜์ด์ง€๋งŒ์„ ๋„์šฐ๊ธฐ ์œ„ํ•ด Spring Web ๋””ํŽœ๋˜์‹œ์™€ Kotlin ๋””ํŽœ๋˜์‹œ๋งŒ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์—์„œ๋Š” Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ์‹œ ์ผ๋ฐ˜ jar๊ฐ€ ์•„๋‹Œ bootJar ํƒœ์Šคํฌ๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์ตœ์ƒ์œ„ Gradle ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•˜๊ณ  ์ผ๋‹จ apply false๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ์‚ฌ์šฉํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‹จ์˜ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์ •ํ•  ์ฝ”๋“œ๋ฅผ project๋กœ ๊ตฌํ˜„ํ•œ ํ›„ ๊ฐ ํ”„๋กœ์ ํŠธ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ์‚ฌํ•ญ์€ allProjects์— ๊ตฌํ˜„ํ•ด๋‘ก๋‹ˆ๋‹ค.

 

 

$ ./gradlew build

์ด์ œ Gradle ๋ช…๋ น์–ด๋กœ build ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์œ„์™€ ๊ฐ™์ด ์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

 

Spring WebMvc ์„ค์ • ๊ตฌํ˜„

ํ•˜์ง€๋งŒ ์ด๋Œ€๋กœ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด 404 Not found๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Spring์€ resources/static ํด๋”์— ์žˆ๋Š” ํŒŒ์ผ์„ ์ •์  ๋กœ๋”ฉํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ frontend ํ•˜์œ„๋Š” ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ static ํด๋”๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒŒ ๋‚ซ์ง€ ์•Š์•˜์„๊นŒ? ๋ฌผ๋ก  ๊ทธ๋ž˜๋„ ๋˜์ง€๋งŒ ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ณ„๊ฐœ๋กœ ์ •์ ์ธ ํŒŒ์ผ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ static ํด๋”์˜ ์‚ฌ์šฉ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ static ํด๋”์™€ FE ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋™์‹œ์— ์žก๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผํ•ด๋ด…์‹œ๋‹ค.

 

Spring ํ”„๋กœ์ ํŠธ์— WebMvcConfig๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ Configuration Bean์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. WebMvcConfigurer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ •์  ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ์— ์œ„์—์„œ ์ง€์ •ํ•œ frontend ํด๋”๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ์— ์กด์žฌํ•˜๊ฑฐ๋‚˜ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํฌ๋งท์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ๋„๋ก ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Vue ๊ฒฐ๊ณผ๋ฌผ์— ์˜์กดํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ฝ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ Vue์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

์ด์ œ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•œ ํ›„ localhost:8080์œผ๋กœ ์ ‘์†ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด Vue ํ™”๋ฉด์ด Tomcat ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๋งˆ์น˜๋ฉฐ..

์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๋กœ ํŽ˜์ด์ง€์™€ ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ํƒ€์ž„๋ฆฌํ”„๋‚˜ JSP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์ด ๊ตณ์ด ํ•„์š”์—†์ง€๋งŒ ์ž์‹ ์ด ์›ํ•˜๋Š” ๊ธฐ์ˆ ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ํฌ์ŠคํŠธ์—์„œ๋Š” Vue๋ฅผ ์‚ฌ์šฉํ•˜์˜€์ง€๋งŒ React, Svlete ๋“ฑ Node.js ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค๋„ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํžˆ ์‘์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์— ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments