π’ λ€μ΄κ°κΈ° μ μ
- Intellij IDEA Community Edition 2019.3.2 μμ μ§ννλ€. λ²μ μ΄ λ¬λΌλ μκ΄ μμ.
- Spring Boot Maven νλ‘μ νΈμ Nuxt.js λ₯Ό μ°λνλ λ°©λ²μ μμλ³Έλ€. Vue.jsλ κ±°μ λμΌν λ°©λ²μΌλ‘ μ§νν μ μλ€.
π Spring Boot (Maven)
File
- New
- Project
λ‘ μ νλ‘μ νΈλ₯Ό μμ±νλ€.
μ΄κΈ° νλ©΄μ Create New Project
λ‘ μμ±ν μλ μλ€.
ν΄λ¦νκ³ λλ©΄ μμ κ°μ΄ New Project
λΌλ μ°½μ΄ λ°ν
λ°, μ¬κΈ°μ μ’μΈ‘μ Maven
μ ν΄λ¦νλ€.
(Gradle νλ‘μ νΈλ₯Ό μμ±νκ³ μ ν λ, Gradle
μ μ νν΄μ£Όλ©΄ λλ€.)
μμͺ½μ Project SDK
λ μ νν΄μ€ λ€ λ€μμΌλ‘ λμ΄κ°λ€. (μλ§ κ°μμ νκ²½μ μ€μΉλ JDK
κ° μ΄λ―Έ μ νλμ΄ μμ κ²μ΄λ€.)
νλ‘μ νΈμ μ΄λ¦κ³Ό κ²½λ‘λ₯Ό μ€μ ν΄μ€λ€.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>role-playing-community</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
pom.xml
μ΄μ λλ κ²μ΄λ λ€λ¦ μλ€!
Maven νλ‘μ νΈκ° μμ±λ κ²μ΄κ³ , pom.xml
μ΄λΌλ Maven μ€μ νμΌμ΄ μ‘΄μ¬νλ κ±Έ νμΈν μ μλ€.
π κ°λ¨ν
pom.xml
μ€λͺ
- νλ‘μ νΈμ ꡬ쑰μ λ΄μ©μ μ€λͺ νκ³ μλ Maven μ€μ νμΌ.
- νλ‘μ νΈ κ΄λ¦¬ λ° λΉλμ νμν νκ²½ μ€μ , μμ‘΄μ± κ΄λ¦¬ λ±μ ν μ μλ€.
<modelVersion>
- Mavenμ
pom.xml
μ λͺ¨λΈ λ²μ <groupId>
- νλ‘μ νΈλ₯Ό λ§λ κ·Έλ£Ήμ Idμ΄λ€. κΈ°μ μ΄λ¦, λλ ν μ΄λ¦μ΄ ν΄λΉλ μ μλ€.
- κ³ μ νκ² μλ³ν μ μμ΄μΌνκΈ° λλ¬Έμ ν¨ν€μ§ λͺ λͺ κ·μΉμ λ°λ₯Έλ€. λλ¬Έμ
.
μΌλ‘ μνλ λ§νΌ νμ κ·Έλ£Ήμ λ§λ€ μ μλ€.- ν¨ν€μ§ λͺ λͺ κ·μΉμ΄λ κ°λ¨ν μ€λͺ νλ©΄ λλ©μΈμ μμμΌλ‘ λμ΄ν κ²κ³Ό κ°λ€.
- μ)
org.apache.maven
<artifactId>
- νλ‘μ νΈμ Id.
- μ΄κΈ°μ νλ‘μ νΈλ₯Ό μμ±ν λ
Name
μ λ ₯μΉΈμ μμ±νλ νλ‘μ νΈμ μ΄λ¦.- Mavenμ΄ μμ±ν΄λ΄λ artifactλ
<artifactId>-<version>.<extension>
μ κ°μ ꡬ쑰λ₯Ό 보μΈλ€.- μ) demo-0.0.1-SNAPSHOT.jar
<version>
- νλ‘μ νΈ λ²μ μ μλ―Έ.
SNAPSHOT
μ μμ§ κ°λ° λ¨κ³λΌλ λ»μ΄λ€.
μ΄μ Spring Bootλ₯Ό μ£Όμ ν΄λ³΄μ
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
pom.xml
μ μ½λλ₯Ό <project>
νκ·Έ λ΄μ μ½μ
νλ€.
spring-boot-starter-parent
λΌμ΄λΈλ¬λ¦¬λ₯Ό μμ보기μ μμ, <parent>
νκ·Έκ° λ¬΄μμΈμ§ μμ보μ.
Maven μ μμμ΄ κ°λ₯νλ€λ νΉμ§μ κ°μ§κ³ μλ€.<parent>
νκ·Έ λ΄μ μ μΈν λΌμ΄λΈλ¬λ¦¬λ₯Ό λ€λ₯Έ μμ‘΄μ±/νμ λͺ¨λ(<dependency>
) λ€μ΄ μμλ°μ μΈ μ μλ€λ λ»μ΄λ€. λ°λΌμ <parent>
λ 곡ν΅μΌλ‘ μ¬μ©νλ μ€μ λ±μ μ£Όμ
ν λ μ°μΈλ€.
spring-boot-starter
spring-boot-starter-parent
μ λν΄ μ€λͺ
νκΈ° μ μ spring-boot-starter
μ λν΄ μμλ³΄κ² λ€.spring-boot-starter
λ μ¬μ μ 미리 μ μν νΈλ¦¬ν μμ‘΄μ± μ‘°ν©μ μ 곡νλ Spring Boot λͺ¨λμ΄λ€.
νλ‘μ νΈμμ μ€μ ν΄μΌνλ λ€μμ μμ‘΄μ±μ ν¬ν¨νκ³ μκΈ° λλ¬Έμ, spring-boot-starter
λ₯Ό μ μν΄ μ£Όλ κ² λ§μΌλ‘λ λ€μν μμ‘΄μ±μ μΆκ°ν ν¨κ³Όλ₯Ό λ³Ό μ μλ€.
μ½κ² νλ§λλ‘ μ μνμλ©΄, Spring Bootλ₯Ό μ¬μ©νκΈ° μν ν΅ν© λΌμ΄λΈλ¬λ¦¬μ΄λ€.spring-boot-starter
κ° κ°μ§κ³ μλ λ€μν μμ‘΄μ±μ μ¬κΈ°μμ νμΈν΄ λ³Ό μ μλ€.
spring-boot-starter-parent
κ·Έλ λ€λ©΄ μ°λ¦¬κ° μ£Όμ
ν spring-boot-starter-parent
λ 무μμΌκΉ?
νλ‘μ νΈμ λ€μν λΌμ΄λΈλ¬λ¦¬λ€μ μ£Όμ
νκ²λλ©΄ λΌμ΄λΈλ¬λ¦¬ λ²μ κ° μΆ©λλ¬Έμ κ° λ°μν μ μλ€.spring-boot-starter
κ° μμ‘΄μ± μ‘°ν©μ μ κ³΅ν΄ μ€λ€λ©΄, spring-boot-starter-parent
λ ν΄λΉ μμ‘΄μ± μ‘°ν©κ°μ μΆ©λλ¬Έμ κ° μλ κ²μ¦λ λ²μ μ 보 μ‘°ν©μ μ 곡νλ€.spring-boot-starter-parent
λ₯Ό μ μν΄μ£Όλ©΄ <dependencies>
μ μ
λ ₯ν λΌμ΄λΈλ¬λ¦¬λ€μ λ²μ μ μ μ΄μ£Όμ§ μμλ μλ μ€μ λλ€.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
pom.xml
μ§κΈκΉμ§ μ°λ¦° (λ²μ κ΄λ¦¬κ° κ°λ₯ν) Spring Boot ν΅ν© λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μ ν΄μ€¬λ€.
μ΄μ μ μ½λλ₯Ό <project>
νκ·Έ λ΄μ μ½μ
νμ¬ λ³Έκ²©μ μΈ Spring Boot μΉ κ°λ°μ μν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ£Όμ
ν΄μ£Όμ.
spring-boot-starter-web
Springμμ μ 곡νλ μμ‘΄μ±μΌλ‘, Web κ°λ°μ νμν μ€μ μ μ 곡νλ€.
Sppring MVC, REST, Tomcat μλ²λ₯Ό λ΄μ₯νκ³ μλ€.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
pom.xml
Maven μ λΉλ ν΄μ΄λ€. λλ¬Έμ pom.xml
μμ λΉλκ΄λ ¨ μ€μ μ ν μ μλ€.<project>
νκ·Έ νμμ μ μ½λλ₯Ό μ½μ
νμ¬ λΉλ μ νμν νλ¬κ·ΈμΈμ μ£Όμ
ν΄μ£Όμ.spring-boot-maven-plugin
μ μ€νκ°λ₯ν jar
νμΌμ λ§λ€μ΄μ£Όλ νλ¬κ·ΈμΈμ΄λ€.
Spring Boot Maven νλ‘μ νΈλ₯Ό μ€ννλλ° νμν μ΅μνμ μμ‘΄μ λͺ¨λ μ£Όμ
νλ€!pom.xml
μ 건λ€λ©΄ μ€λ₯Έμͺ½ νλ¨μ μμ κ°μ νμ
μ΄ λ¨λκ±Έ νμΈν μ μμλ€.Import Changes
λ₯Ό ν΄λ¦ν΄ μ£Όμ
ν λΌμ΄λΈλ¬λ¦¬λ₯Ό Import ν μ μλ€.
νμ
μ΄ λ¨μ§ μλλ€λ©΄ pom.xml
μ€λ₯Έμͺ½ λ§μ°μ€ ν΄λ¦ - Maven
- Reimport
λ‘λ κ°λ₯νλ€.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // start whole Spring Framework
}
}
Application.java
μ΄μ Spring Boot μ€μ μ λλ¬λ€. μ€μ λ‘ μλ²λ₯Ό κ°λμμΌλ³΄μ.src/main/java
ν΄λμ ν¨ν€μ§λ₯Ό λ§λ€κ³ ν¨ν€μ§ λ΄μ Application.java
νμΌμ μμ±ν λ€ μ μ½λλ₯Ό μ
λ ₯νλ€.
Spring Boot λ₯Ό μ€νμν€λ main νμΌμ΄λ€.
μ΄ νμΌμ Run μν€λ©΄ Spring Boot μλ²κ° κ°λλλ λͺ¨μ΅μ λ³Ό μ μλ€!π
π [μ°Έκ³ ] Runner λ‘κ·Έμ°½μ μ μ νλ λ²
Spring Boot λ₯Ό μ€ννκ³ λλ©΄ λ‘κ·Έ μ°½μ΄ μμ κ°μ΄ λ°ν λ°, ν° κΈμ¨λ‘λ§ λμ΄ μμ΄μ λ¨μ‘°λ‘μ΄ λλμ΄ λ λ€.
μ΄ λ¨μ‘°λ‘μ΄ Runner λ‘κ·Έμ°½μapplication.properties
μ€μ νμΌμ ν΅ν΄ 컀μ€ν°λ§μ΄μ§ ν΄μ€ μ μλ€.
application.properties
μΈλΆ μ€μ νμΌμ΄λΌκ³ λ νλ©° μ΄ν리μΌμ΄μ μμ μ¬μ©νλ μ¬λ¬κ°μ§ μ€μ κ°λ€μ μ΄ν리μΌμ΄μ λ°μ΄λ μμ μ μν μ μλ νμΌμ λ»ν¨.
μ΄ νμΌμ μ€νλ§ λΆνΈκ° μ΄ν리μΌμ΄μ μ ꡬλν λ μλμΌλ‘ λ‘λ©λλ νμΌλ‘,key
-value
νμμΌλ‘ κ°μ μ μνλ©΄ μ΄ν리μΌμ΄μ μμ@Value
μ΄λ Έν μ΄μ λ±μΌλ‘ μ°Έμ‘°νμ¬ μ¬μ©ν μ μλ€.src/main/resources
κ²½λ‘μapplication.properties
νμΌμ μμ±ν λ€ νμΌ λ΄μspring.output.ansi.enabled=ALWAYS
λΌκ³ μ λ ₯ν΄μ£Όμ.
ANSI λ₯Ό μ§μνλ Consoleμμ output μ νμ μμ μ νκ² νλ€λ λ»μ΄λ€.
μ€μ ν μλ‘λ¬λ‘ μμ λ‘κ·Έμ°½μ΄ μΆλ ₯λλκ±Έ νμΈν μ μμλ€π₯³
π Nuxt.js
Nuxt.js
Vue νλ μμν¬ κΈ°λ° κ°λ°νκ²½ ꡬμΆμ λμμ μ£Όλ νλ μμν¬μ΄λ€.
κ°λ¨νκ² μκΈ°νλ©΄ μλ²μ¬μ΄λ λ λλ§, Store, Router κΈ°λ₯μ μ 곡νλ Vue.js νλ μμν¬μ΄λ€.
npm init nuxt-app <project-name>
Nuxt.js λ₯Ό Installνλλ°μ μ¬λ¬κ°μ§ λ°©λ²μ΄ μμ§λ§ μ΄λ²μ npm
λ₯Ό μ΄μ©ν΄λ³΄κ² λ€.
λ€λ₯Έ Install λ°©λ²μ μ¬κΈ°μ νμΈν μ μλ€.
<project-name>
μ "frontend"λ‘ ν΄μ μ€μΉνλ frontend ν΄λ λ΄μ Nuxt.js νλ‘μ νΈκ° μμ±λκ±Έ νμΈν μ μμλ€.
cd <project-name>
npm run dev
μ λͺ
λ Ήμ΄λ‘ Nuxt.jsλ₯Ό μμν μ μλ€.
μ΄λ‘μ¨ Nuxt.js μ€μΉκ° λλ¬λ€!π
Spring Bootμ Nuxt.js μ€μΉλ₯Ό λͺ¨λ λλμΌλ, μ΄μ λ μλ²λ₯Ό μ°λμν¬ μ°¨λ‘λ€.
νλ‘ νΈμλ μλ²μ λ°±μλ μλ²λ μ΄λ»κ² μ°κ²°λλκ±ΈκΉ?
β³ Spring Boot, Nuxt.js μ°λ
νλ‘ νΈμλ μλ²μ λ°±μλ μλ²λ₯Ό μ°κ²°νλ €λ©΄ μ°λ¦° νλ‘μ(Proxy) μλ²λ₯Ό μ΄ν΄ν΄μΌνλ€.
νλ‘μ(Proxy) μλ²
"Proxy"λ λ¨μ΄ κ·Έλλ‘ ν΄μνλ©΄ "λ리"λΌλ λ»μ κ°μ§κ³ μλ€.
νλ‘μ μλ²λ μλ‘ μ°κ²°μ μ΄ μκ±°λ 보μμμ μ΄μ λ‘ μ§μ ν΅μ ν μ μλ μΈλΆ λ€νΈμν¬λ€μ
κ°μ μ μΌλ‘ μ°κ²°μν€λ μ€κ³μΈ μν μ νλ€.
μ¦, Spring Boot(λ°±μλ μλ²)μ Nuxt.js(νλ‘ νΈμλ μλ²)λ₯Ό μ°κ²°νκΈ° μν΄μ μ€κ³μΈμΈ Proxyκ° νμνλ€λ λ».
μ¬μ©μκ° νλ‘ νΈ μλ μλ²λ‘ μ κ·Όν΄μ 리μμ€λ₯Ό μμ²νλ©΄, νλ‘μλ μ΄ μμ²μ λ°±μλλ‘ μ°κ²°μμΌ μμ²μ μ λ¬νλ€.
κ·ΈλΌ μ΄μ κ·Έ νλ‘μλ₯Ό μ€μ ν΄λ³΄λλ‘ νμ.
Spring Boot λ₯Ό μμν λ, ν°μΊ£ μλ²κ° ν¬νΈ 8080μΌλ‘ μ€νλλ κ±Έ νμΈν μ μμλ€.
Nuxt.jsλ port λ²νΈ 3000 μΌλ‘ μ€νμ΄ λμλ€.
π μ°Έκ³ , ν¬νΈ λ²νΈ μμ λ²
Nuxt.js λ config νμΌ λλ package.json
νμΌμ ν΅ν΄, Spring Bootλ application.properties
μ€μ νμΌλ‘ μμ ν μ μλ€.
- Nuxt.js
nuxt.config.js
- 루νΈκ²½λ‘μ
nuxt.config.js
μ μλμ κ°μ΄ μ λ ₯.
module.exports = { //... server: { port: 3001, // λ°κΏ ν¬νΈλ²νΈ μ λ ₯ }, };
nuxt.config.js
λ Nuxt.jsμ μΉν© μ€μ νμΌμ΄λ€.
- 루νΈκ²½λ‘μ
package.json
package.json
μscripts
λΆλΆμ--port <port>
λ₯Ό μΆκ°.
"scripts": { "dev": "nuxt --port 3001", "build": "nuxt build", "start": "nuxt start --port 3001", "generate": "nuxt generate" }
- Spring Boot
application.properties
src/main/resources
νμμapplication.properties
νμΌμ μμ±νκ³server.port = 8081
μ μ λ ₯.application.properties
νμΌμ μΈλΆ μ€μ νμΌλ‘, μ ν리μΌμ΄μ (νλ‘μ νΈ)μμ μ¬μ©νλ μ¬λ¬κ°μ§ μ€μ κ°λ€μ ν€, κ° νμμΌλ‘ μ μ₯ν΄λλ©΄ μ ν리μΌμ΄μ μ λ°μ΄λ μμμ μ°Έμ‘°ν΄ μΈ μ μλ€.application.properties
νμΌμ Spring Bootκ° μ ν리μΌμ΄μ μ ꡬλν λ μλμΌλ‘ λ‘λ©νλ νμΌμ΄λ€.
- Intellij IDE
- μλ¨μ Edit Configuration μ ν΄λ¦νκ±°λ alt + shift + f10 λ¨μΆν€λ₯Ό ν΅ν΄ Run/Debug Configurations μ°½μ μ΄μ.
Environment variables
μ λ ₯μΉΈμserver.port=8081
μ μ λ ₯νλ©΄ ν¬νΈλ₯Ό μ€μ ν μ μλ€.
3000 ν¬νΈμμ /api
λ‘ μμνλ μμ²μ΄ λ°μνλ©΄ 8080 ν¬νΈλ‘ μ°κ²°μ μν€λ νλ‘μλ₯Ό μ€μ ν΄λ³΄μ.
Vue.jsμμ vue.config.js
νμΌμμ devServer.proxy
(κ°λ° λͺ¨λμμ νλ‘μ μ€μ ) λ₯Ό ν΅ν΄ νλ‘μλ₯Ό μ€μ ν μ μλ€.
νμ§λ§ Nuxt.jsλ μλ² μ¬μ΄λ λ λλ§μ μ§μνλ Universal μ ν리μΌμ΄μ
μ΄κΈ° λλ¬Έμ
Vue.jsμ²λΌ μΉν© devServer.proxy
λ₯Ό μ¬μ©ν μ μλ€.
μ΄μ λ, Nuxt.jsλ νλ‘λμ
(production - λ°°ν¬μ©)μμμ‘°μ°¨ νλ‘μκ° νμνκΈ° λλ¬Έμ΄λ€.
μ΄κΈ° μμ²μ΄ μ²λ¦¬λκ³ μ±μ΄ μλ² μΈ‘μμ λ λλ§λ λ λΈλΌμ°μ κ° μλ μλ²κ° νΈμΆμ μννλ―λ‘ λͺ¨λ API μμ²μ νλ‘μκ° λμ΄μΌ νλ€.
npm i @nuxtjs/axios
npm i @nuxtjs/proxy
λ°λΌμ @nuxtjs/proxy
λͺ¨λμ λ°λ‘ μ€μΉν΄ μ£Όμ
(api μμ²μ μν axiosλ μ€μΉ)
module.exports = {
modules: [
'@nuxtjs/axios',
'@nuxtjs/proxy'
],
axios: {
proxy: true
},
proxy: {
'/api': {
target: 'http://localhost:8080/',
changeOrigin: true // cross origin νμ©
}
}
}
nuxt.config.js
λͺ¨λμ΄ μ€μΉλκ³ λλ©΄ nuxt.config.js
νμΌμ μ μ½λλ₯Ό μΆκ°./api
λ‘ μμνλ μμ²μ΄ λ€μ΄μ€λ©΄ target
, μ¦ 8080 μλ²λ‘ μμ²μ μ λ¬νλ€λ λ»μ΄λ€.changeOrigin: true
λ "Cross Origin"μ νμ©νλ€λ λ»μΌλ‘, λ§κ·Έλλ‘ "κ΅μ°¨ μΆμ²"λ₯Ό νμ©νλ€λ κ²μ μλ―Ένλ€.
"κ΅μ°¨ μΆμ²" λΌλ λ§μ΄ μ‘°κΈ μμν μ μλλ°, μ½κ² νμ΄ λ§νλ©΄ "λ€λ₯Έ μΆμ²"μ΄λ€. μ¬κΈ°μ μΆμ²λ μλ‘ λ€λ₯Έ ν¬νΈλ₯Ό μλ―Ένλ€.
"μλ‘ λ€λ₯Έ μΆμ²μ 리μμ€ κ³΅μ νλ€" μ°λ¦° μ΄κ²μ CORS(Cross-Origin Resource Sharing) μ΄λΌκ³ λΆλ₯Έλ€.
νλ‘μ μ€μ μ΄ μλ£ λμλ€!π
μ΄μ μ λλ‘ μ°κ²°λμλμ§ νμΈν΄λ³΄μ.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class HelloWorld {
@GetMapping(value="/helloWorld")
public String helloWorld() {
return "Hello World!";
}
}
HelloWorld.java
src/main/java/ν¨ν€μ§
λ΄μ HelloWorld.java
λΌλ ν
μ€νΈ νμΌμ λ§λ€κ³ μμ κ°μ΄ μ
λ ₯νλ€.
http://localhost:3000/api/helloWorld
μΌλ‘ μ κ·Όνμ "Hello World!" κ° μΆλ ₯λκ±Έ νμΈν μ μμλ€.
3000 ν¬νΈλ‘ μμ²νμ§λ§ νλ‘μλ₯Ό ν΅ν΄ 8080 ν¬νΈμ κ²°κ³Όκ° λμλ€.
μ΄λ² ν¬μ€ν
μ λͺ©νμλ Spring Bootμ Nuxt.js μ°λμ μλ£ν΄λ³΄μλ€.π
λΆμ‘±ν κΈμ΄μ§λ§ λ΄μ£Όμ
μ κ°μ¬ν©λλ€.
νΌλλ°±μ μΈμ λ νμ!
'Spring > Spring Boot' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Spring Boot + MyBatis + MySQL μ°λ λ°©λ² (7) | 2021.06.03 |
---|