Skip to content

Latest commit

ย 

History

History
179 lines (138 loc) ยท 4.96 KB

File metadata and controls

179 lines (138 loc) ยท 4.96 KB

react.js, gradle, springboot ์—ฐ๋™ ๋ฐฉ๋ฒ•

  1. node js ์„ค์น˜

  2. SpringProjectName/src/main/ ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผ ํ›„ react ์„ค์น˜

cd src/main
npx create-react-app frontend	# npx create-reeact {ํ”„๋กœ์ ํŠธ๋ช…}
  1. ๋งŒ๋“  ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์ด๋™ํ•˜์—ฌ npm ์‹คํ–‰
cd frontend	# cd {ํ”„๋กœ์ ํŠธ๋ช…}
npm start
  1. ์ƒˆ ํ„ฐ๋ฏธ๋„ ์ฐฝ ์—ด๊ณ  ์ž‘์—…ํ•˜๋˜ ๊ฒฝ๋กœ๋กœ ์ด๋™ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด ์‹คํ–‰
npm install
npm run-script build
npm run eject   # ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ git pushํ•œ ์ƒํƒœ์ธ์ง€ ํ™•์ธ
  1. [๋ฆฌ์•กํŠธ PROJECT NAME]/config/paths.js ํŒŒ์ผ์—์„œ buildPath ๋ณ€์ˆ˜ build -> build/static

  2. [๋ฆฌ์•กํŠธ PROJECT NAME] ํด๋”์—์„œ axios๋ฅผ ์„ค์น˜

npm install axios --save
npm install http-proxy-middleware --save
  1. [๋ฆฌ์•กํŠธ PROJECT NAME]/src/App.js์— ํ•ด๋‹น ์ฝ”๋“œ ์ถ”๊ฐ€
import React, {useEffect, useState} from 'react';
import axios from 'axios';

function App() {
    const [hello, setHello] = useState('')

    useEffect(() => {
        axios.get('/api/hello')
        .then(response => setHello(response.data))
        .catch(error => console.log(error))
    }, []);

    return (
        <div>
            ๋ฐฑ์—”๋“œ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค : {hello}
        </div>
    );
}

export default App;
  1. [๋ฆฌ์•กํŠธ PROJECT NAME]/pakage.json์— "proxy": "http://localhost:8080" ์ถ”๊ฐ€

  2. src/main/java/com.[springboot ํ”„๋กœ์ ํŠธ]์—์„œ ํŒจํ‚ค์ง€ ์ƒ์„ฑ ํ›„ HelloWorldController.java ํŒŒ์ผ์„ ์ƒ์„ฑ

package com.demogroup.demoweb.Controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @GetMapping("/api/hello")
    public String test() {
        return "Hello, world!";
    }
}

์—ฌ๊ธฐ๊นŒ์ง€ ์ง„ํ–‰์‹œ localhost:3000์—์„œ๋Š” "๋ฐฑ์—”๋“œ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค : hello world!"๊ฐ€, localhost:8080์—์„œ๋Š” "hello world!"๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค. (spring boot๋Š” project run ์ดํ›„ react๋Š” npm start)

์ด์ œ localhost:8080์—์„œ ๋ฆฌ์•กํŠธ ํ™”๋ฉด์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

  1. SpringBoot ํ”„๋กœ์ ํŠธ์˜ build.gradle๋กœ ์ด๋™ํ•ด์„œ dependencies{ ... }์™€ test{ ... } ์‚ฌ์ด์— ์•„๋ž˜ ์†Œ์Šค ์ฒจ๋ถ€
def webappDir = "$projectDir/src/main/[PROJECTNAME]"

 sourceSets {
     main {
         resources {
         srcDirs = ["$webappDir/build", "$projectDir/src/main/resources"]
         }
    }
 }

 processResources {
    dependsOn "buildReact"
 }

 task buildReact(type: Exec) {
     dependsOn "installReact"
     workingDir "$webappDir"
     inputs.dir "$webappDir"
     group = BasePlugin.BUILD_GROUP
     if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
        commandLine "npm.cmd", "run-script", "build"
     } else {
        commandLine "npm", "run-script", "build"
     }
 }

 task installReact(type: Exec) {
     workingDir "$webappDir"
     inputs.dir "$webappDir"
     group = BasePlugin.BUILD_GROUP
     if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
         commandLine "npm.cmd", "audit", "fix"
         commandLine 'npm.cmd', 'install'
     } else {
         commandLine "npm", "audit", "fix"
         commandLine 'npm', 'install'
     }
 }

 task copyReactBuildFiles(type: Copy) {
	dependsOn "buildReact"
	from "$frontendDir/build"
	into "$projectDir/src/main/resources/static"
}
  1. ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋น ์ ธ๋‚˜์™€ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰(ํ•œ ๋ฒˆ ์‹คํ–‰ ์ดํ›„ ๋‹ค์‹œ ์‹คํ–‰ ํ•œ๋‹ค๋ฉด [๋ฆฌ์•กํŠธ PROJECT NAME]/build ํด๋”์™€ [SpringProjectName]/src/main/resources/static ํด๋” ์‚ญ์ œ ํ›„ ์žฌ์‹คํ–‰)
./gradlew build
  1. ๋นŒ๋“œ ์™„๋ฃŒ ํ›„ [SpringProjectName]/build/libs๋กœ ์ด๋™

  2. ํด๋” ์•ˆ์— ์žˆ๋Š” jar ํŒŒ์ผ ์‹คํ–‰(java -jar FILENAME)

  3. Localhost:8080 ์ ‘์†ํ•ด์„œ Reactํ™”๋ฉด ์ถœ๋ ฅ๋˜๋ฉด ์„ฑ๊ณต!


ํ”„๋ก ํŠธ์•ค๋“œ ์ฝ”๋“œ๋กœ ๊ต์ฒด ์œ„ํ•ด ์ฐธ๊ณ 

  1. package.json, package-lock.json, src ํด๋” ๋ฎ์–ด์“ฐ๋ฉด ๋จ

  2. package.json, package-lock.json์˜ name ๋ถ€๋ถ„์„ ์ž์‹ ์˜ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝ

  3. [๋ฆฌ์•กํŠธ PROJECT NAME]/build ํด๋”์™€ [SpringProjectName]/src/main/resources/static ํด๋” ์‚ญ์ œ ํ›„ ./gradlew build ์‹คํ–‰

  4. ๋นŒ๋“œ ์™„๋ฃŒ ํ›„ [SpringProjectName]/build/libs๋กœ ์ด๋™

  5. ํด๋” ์•ˆ์— ์žˆ๋Š” jar ํŒŒ์ผ ์‹คํ–‰(java -jar FILENAME)

  6. ์ดํ›„ ํ•„์š”ํ•œ ๋ชจ๋“ˆ์ด ์žˆ๋‹ค๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ ์•„๋ž˜ ํ˜•์‹์œผ๋กœ ๋‹ค์šด๋กœ๋“œ

npm install [๋ชจ๋“ˆ์ด๋ฆ„] --save
  1. ERESOLVE could not resolve ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ [๋ฆฌ์•กํŠธ PROJECT NAME] ํด๋” ์ด๋™ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด ์‹คํ–‰ ํ›„ ๋‹ค์‹œ 3๋ฒˆ ๋ฐ˜๋ณต
npm config set legacy-peer-deps true
npm i
  • ํ•œ ๋ฒˆ ์„ฑ๊ณตํ•œ ์ดํ›„์—๋Š” ๊ทธ๋ƒฅ application.class run ํ•˜๋ฉด ๋ณ€๋™์‚ฌํ•ญ ์ž๋™ ๋ฐ˜์˜๋จ

gradlew build์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ํ•ด๊ฒฐ

---

build.gradle ํŒŒ์ผ์— ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€

tasks {
	processResources {
		duplicatesStrategy = org.gradle.api.file.DuplicatesStrategy.INCLUDE
	}
}