팀 프로젝트를 완성하고 포트폴리오를 작성하는데 깃허브 주소만 올렸더니 뭔가 휑~한 것이.. 프로젝트를 완성하고 나서 배포해보지 않았다는 걸 깨닫게 되었다!
인사담당자가 내 프로젝트를 한눈에 잘 볼 수 있게, 또 나중에 실무에서 프로젝트를 완성하고 나서 배포하여 서비스화 될 수 있게 하기 위해 AWS EC2로 배포해보았다.
나는 Spring Boot 루트 폴더 내부에 React 프로젝트 폴더를 생성했기 때문에 따로따로 빌드하여 배포하는 것보다 한 번에 빌드하여 배포할 수 있는 방법을 찾고 싶었다. 물론 특정 폴더를 제외하고 빌드를 할 수도 있지만, 이번엔 한 번에 빌드하는 쪽으로 시도해보았다.
나는 Spring Boot 프로젝트 폴더 내부의 src-main 폴더 내부에 frontend라는 폴더명으로 Front 부분인 React 프로젝트를 생성해주었었다.

frontend 폴더 내부에 package.json 파일이 있는 것을 확인할 수 있다.
이전까지 팀 프로젝트 개발 중에는 setupProxy.js 파일을 작성하여 Spring Boot(8080 포트)와 React(3000 포트) 간의 CORS 에러 해결을 위해 http-proxy-middleware를 설치하여 React에 8080 포트를 허용해주었다.
*seupProxy.js 예시

하지만 이 미들웨어는, 배포 전 로컬환경에서만 작동한다!!
이걸 몰라서 빌드를 몇번을 다시 했었던지...
아무튼, 그래서 8080 포트 허용을 새롭게 작성해주어야 한다.
(1) package.json 파일에 다음과 같이 작성
"proxy": "http://localhost:8080",

(2) .env.production 파일 생성
package.json 파일과 같은 레벨의 위치에 .env.production 파일을 생성하고, 다음과 같이 입력하여 환경변수를 설정해준다.
*STS4에서는 해당 파일이 보이지 않아서 VS Code로 열어 편집했다!
REACT_APP_DB_HOST="http://localhost:8080"

(3) .env.development 파일 생성
마찬가지로 같은 위치에 .env.development 파일을 생성하고, 다음과 같이 입력한다.
REACT_APP_DB_HOST=""

(4) 서버 호출 api에 환경 변수 입력해주기
process.env.REACT_APP_DB_HOST +

나는 메인페이지에서만 호출해주고 있기 때문에 한 곳만 추가해줬는데, 모든 서버 호출 부분에 추가 해주어야 한다!
Spring Boot 프로젝트의 build.gradle에 다음 코드를 추가해준다.
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 "$buildDir/resources/main/static"
}

(1) 프로젝트 폴더에서 터미널 열고 빌드하기
ls
./gradlew build

ls를 입력하여 build.gradle 이 있는지 확인 후,
./gradlew build 명령어를 통해 빌드한다.
근데 왜인지 build fail... (build success가 나온 사람은 (2)로 가기)

To address all issues (including breaking changes), run:
npm audit fix --force
이렇게 나와있길래, frontend 폴더에서 npm audit fix --force를 해주고 다시 빌드를 해봤는데, 또 fail..


근데 이번엔 에러가 바꼈다!
error:0308010C:digital envelope routines::unsupported 에러 코드로 검색했더니
npm install react-scripts@latest
React 프로젝트의 개발 의존성을 관리해주는 react-script가 최신 버전이 아니어서 그렇다고 한다... 그렇다고 하니 frontend 폴더에서 해당 명령어를 입력해서 최신 버전으로 install 해주었다.

그리고 다시 Spring 의 루트폴더에서 build!


BUILD SUCCESSFUL 이 나오면 성공!
(2) jar 파일 실행하기
프로젝트폴더/build/libs 폴더로 들어가서 jar파일이 생성되었는지 확인한다.
cd build/libs
ls

java -jar [생성된 jar 파일명].jar

(3) jar 파일이 잘 실행되었는지 확인
인터넷 창에 localhost:8080으로 React front 페이지가 잘 나오는지 확인한다.

게시판 페이지가 잘 뜨는것을 확인할 수 있다!
사전에 build를 미리 해보지 않고 바로 EC2에서 시도했더니 빌드부터 엉켜서 몇번을 다시 했는지 모르겠다.. 항상 무언가 시도 전에는 이전 버전이 잘 돌아가는지 확인하고 시도하는 것을 습관 삼아야 겠다!!
참고
https://velog.io/@jay_be/Spring-boot-react-%ED%86%B5%ED%95%A9-%EB%B9%8C%EB%93%9C%ED%95%B4%EB%B3%B4%EC%9E%90
https://mopil.tistory.com/59