AWS EC2로 프로젝트 배포하기 (1) Spring Boot - React 한번에 build 하기

라미·2024년 3월 20일
0

Study

목록 보기
1/2

팀 프로젝트를 완성하고 포트폴리오를 작성하는데 깃허브 주소만 올렸더니 뭔가 휑~한 것이.. 프로젝트를 완성하고 나서 배포해보지 않았다는 걸 깨닫게 되었다!
인사담당자가 내 프로젝트를 한눈에 잘 볼 수 있게, 또 나중에 실무에서 프로젝트를 완성하고 나서 배포하여 서비스화 될 수 있게 하기 위해 AWS EC2로 배포해보았다.

1. Spring Boot - React 한번에 build 하기

나는 Spring Boot 루트 폴더 내부에 React 프로젝트 폴더를 생성했기 때문에 따로따로 빌드하여 배포하는 것보다 한 번에 빌드하여 배포할 수 있는 방법을 찾고 싶었다. 물론 특정 폴더를 제외하고 빌드를 할 수도 있지만, 이번엔 한 번에 빌드하는 쪽으로 시도해보았다.

1) 프로젝트 폴더 구조

나는 Spring Boot 프로젝트 폴더 내부의 src-main 폴더 내부에 frontend라는 폴더명으로 Front 부분인 React 프로젝트를 생성해주었었다.

frontend 폴더 내부에 package.json 파일이 있는 것을 확인할 수 있다.

2) React 프로젝트에 proxy 설정하기

이전까지 팀 프로젝트 개발 중에는 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 +

나는 메인페이지에서만 호출해주고 있기 때문에 한 곳만 추가해줬는데, 모든 서버 호출 부분에 추가 해주어야 한다!

3) Spring Boot에 React 빌드 코드 입력해주기

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"
}

  • frontendDir 에는 React 프로젝트 폴더 경로를 입력해준다.
  • installReact 에서는 빌드 시 React 내부의 package.json 위치에서 'npm install' 명령어를 입력하게 하여 install을 실행하게 한다.
  • buildReact 에서는 빌드 시 React 프로젝트 빌드 명령어를 입력하여 React 프로젝트가 빌드되도록 해준다.
  • copyReactBuildFiles 는 빌드 완료 된 React 프로젝트를 스프링 부트의 static 폴더로 복제하여 Front 페이지로서 읽어들일 수 있도록 만들어준다.
  • 각 명령어는 dependsOn 입력어를 통해 순차적으로 실행되도록 도와준다.

4) Spring Boot 빌드하기

(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

profile
연구하는 개발자

0개의 댓글