토이 프로젝트로 프론트 팀원들과 협업을 하기 위해 스프링이랑 리액트를 연동할 필요가 생겼다.
Intellij / java 11 / react
위의 그림처럼 패키지에서 터미널을 켜거나
터미널을 열고 cd src/main를 입력한다
npx create-react-app frontend --> 여기서 frontend는 프로젝트 이름이다
위를 입력하면 react가 설치된다.
cors
npm install http-proxy-middleware --save
위의 커맨드를 입력하고
2. package.json에서
"proxy" : "http://localhost:8080"
위의 값을 추가해준다
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/api',
createProxyMiddleware({
target: 'http://localhost:8080', # 서버 URL or localhost:설정한포트번호
changeOrigin: true,
})
);
};
npm install axios --save
import React, {useEffect, useState} from 'react';
import axios from 'axios';
function App() {
const [hello, setHello] = useState('')
useEffect(() => {
axios.get('/hello')
.then(response => setHello(response.data))
.catch(error => console.log(error))
}, []);
return (
<div>
백엔드에서 가져온 데이터입니다 : {hello}
</div>
);
}
export default App;
내 프로젝트 기준
src/main/java/my/jelly/controller에 Controller 생성
@RestController
public class MainController {
@GetMapping("/hello")
public String test(){
return "Hello, World!";
}
}
원래는 터미널에 npm start를 입력해 front서버를 먼저 띄우고 백 서버도 띄워줘야 한다.
def frontendDir = "$projectDir/src/main/frontend"
sourceSets {
main {
resources { srcDirs = ["$projectDir/src/main/resources"]
}
}
}
processResources { dependsOn "copyReactBuildFiles" }
task installReact(type: Exec) {
workingDir "$frontendDir"
inputs.dir "$frontendDir"
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 buildReact(type: Exec) {
dependsOn "installReact"
workingDir "$frontendDir"
inputs.dir "$frontendDir"
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 copyReactBuildFiles(type: Copy) {
dependsOn "buildReact"
from "$frontendDir/build"
into "$projectDir/src/main/resources/static"
}
프로젝트의 홈 경로에서
gradlew build
위의 코드를 입력하면 build를 진행하고 build/libs 폴더에 jar파일 생성
java -jar build/libs/demo-web-0.0.1-SNAPSHOT.jar
jar파일 실행