์คํ๋ง๋ถํธ์ ๋ฆฌ์กํธ๋ฅผ ์ฐ๋์ํค๋ ๊ณผ์ ๊น์ง๋ ๊ทธ ์ ์ ์งํ ์๋ฃ.
๋น๋์ ๋ฐฐํฌํ๋ ๊ณผ์ ๊ธฐ๋ก.
๋ฐฐํฌํ ์๊ฐ์ด ์์๋๋ฐ ํด์ผํ๋ ์ํฉ์ด ์๊ธฐ์ ์๋นํ ๋ฌด์ํ ๋ฐฉ๋ฒ์ผ๋ก ์งํํ๋ค..
๊ทธ๋ฅ ๋ณ๋ค๋ฅธ ์ค์ ์ํ๊ณ EC2 ์ธ์คํด์ค์ ์๋ฒ ๋์ฐ๋ ์ ๋๋ง.. ๋ฌผ๋ก ์ด๊ฒ๋ ๋ฐฐํฌ์ ํ ๊ณผ์ ์ด๊ธด ํ์ง๋ง..
๊ทธ๋๋ ์ดํ๋์ ๊ณ ๋ฏผํ๋ฉด์ ํ๊ธด ํ์ผ๋๊น ๊ธฐ๋กํ๋ค.
๐ ๋น๋ & ๋ฐฐํฌ ๊ณผ์
1. ๋ฆฌ์กํธ & ์คํ๋ง๋ถํธ ํตํฉ ๋น๋ (Gradle)
2. ๋ฐฐํฌ (EC2 ์ธ์คํด์ค์ ์๋ฒ ๋์ฐ๊ธฐ)
2-1. MySQL ๋ก์ปฌ์์ EC2๋ก dump .. โญ๏ธ
๐ด ํตํฉ ๋น๋ํ๊ธฐ
์คํ๋ง๋ถํธ๋ฅผ ์คํ์ํค๊ณ , ๋ฆฌ์กํธ๋ฅผ npm start๋ก ๋ฐ๋ก ์คํ์์ผฐ๋๋ฐ
ํ๋ฒ์ ์คํ์ํค๊ธฐ ์ํด ํตํฉ ๋น๋๋ฅผ ํ๋ค.
์ฐ์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ์ด๋ฌํ๋ค.
ํตํฉ ๋น๋์ํค๊ธฐ ์ ์ frontend ํด๋๊ฐ ํ๋ก์ ํธ ๊ฒฝ๋ก ๋ฐ๋ก ์๋์ ์์นํด์์๋๋ฐ, ์คํ๋ง ํ๋ก์ ํธ ๋ด๋ถ๋ก ์ฎ๊ฒจ์ผ ๋๋ค๋ ์๋ฆฌ๊ฐ ์์ด์ /src/main์ผ๋ก ์ฎ๊ฒจ์ฃผ์๋ค.
์ธํ ๋ฆฌ์ ์ด ๋ด๋ถ์์ ๋ฆฌ์กํธ ํด๋๋ฅผ ๋๋๊ทธํด์ ์ฎ๊ฒจ์ฃผ๋ฉด ๋งฅ๋ถ์ด ์์ฒญ ๋จ๊ฑฐ์์ง๋ฉฐ, ์ธํ ๋ฆฌ์ ์ด CPU๊ฐ 600%๋ ์ฐจ์งํ๊ฒ ๋๋๊น....
๊ทธ๋ฅ ํ์ธ๋์์ ํด๋๋ฅผ ์ฎ๊ฒจ์ผํ๋ค...
๐น ๋ฆฌ์กํธ ์ค์
package.json์ proxy ์ค์ ์ ํด์ค๋ค.
๋์ค์ ๋ฐฐํฌํ ์์๋ localhost๋ฅผ ๋ค๋ฅธ ๊ฑธ๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
๐น 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 "$projectDir/src/main/resources/static"
}
build.gradle์ ์๋จ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๋ค.
์คํฌ๋ฆฝํธ ๋ด์ฉ์ frontendDir์ ๋ฆฌ์กํธ ์ค์นํ๊ณ ๋ญ npm run, build ํ๊ฒ ๋ค ~~ ์ด๋ฐ ๋ด์ฉ์ธ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๋น๋ํ ๋ด์ฉ์ด resources/static์ ์ฎ๊ฒจ์ง๋ค.
ํ์ผ ๊ฒฝ๋ก๋ฅผ ์๋ชป ์ง์ ํด์ ๋ฐฐํฌ๋์์์๋ ํ๋ฉด์ด ์ ๋๋ก ๋์ค์ง ์์์ ์ ๋จน์๋ค..
โ๏ธ ํ์ผ ๊ฒฝ๋ก๋ฅผ ํญ์ ์ฃผ์ํด์ผ๊ฒ ๋ค..
Gradle โ build โ build, jar๋ฅผ ๋๋ฌ์ jar ํ์ผ์ ์์ฑ์ํค๋ฉด build ํด๋ โ libs ํด๋์ jar ํ์ผ์ด ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
resources ํด๋์๋ ์ ์ฎ๊ฒจ์จ ๋ฏํ๋ค.
์ด์ npm start๋ก ๋ฆฌ์กํธ๋ฅผ ๋ฐ๋ก ์คํ์ํค์ง ์์๋ ๋๋ค. !
์คํ๋ง๋ถํธ๋ฅผ ์คํ์์ผ๋ณด๋ฉด localhost:3000์ด ์๋ localhost:8080์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ด ๋ฐฐํฌํ๊ธฐ - EC2 ์ธ์คํด์ค์ ์๋ฒ ๋์ฐ๊ธฐ
EC2 ์ธ์คํด์ค ์์ฑํ๋๊ฑด ๋ค๋ฅธ ๋ธ๋ก๊ทธ ๊ธ์์ ์ ์ ๋ฆฌ๋์ด์๊ธฐ ๋๋ฌธ์ ์๋ต.
์ธ๋ฐ์ด๋ ๊ท์น๋ง ์ฃผ์ํด์ ํ๋ฉด ๋๋ค.
IPv6๊น์ง๋ ์ํด์ค๋ ๋ ๊ฒ ๊ฐ๋ค.. ์ค๊ฐ์ค๊ฐ ์ค๋ฅํด๊ฒฐํ๋ ค๊ณ ์ด๊ฒ์ ๊ฒ ํด๋ณด๋ค๊ฐ ๊ทธ๋ฅ ๋ฃ์๊ฑฐ๋ค..
3000ํฌํธ๋ ๋ฆฌ์กํธ ๋๋ฌธ์ ๋ฃ์ด์ฃผ์๋ค.
๐น ์ธ์คํด์ค ์ฐ๊ฒฐ
์ธ์คํด์ค๋ฅผ ์์ํ๊ณ , ์ฐ๊ฒฐํ๋ ค๋ฉด ํฐ๋ฏธ๋ ์ผ๊ณ ์๋์ ์ฌ์ง์ ๋์์๋ ๊ฒ์ฒ๋ผ ํด์ฃผ๋ฉด ๋๋ค.
ํ์ง๋ง ์ด๋๋ก ์งํํ๋ฉด ๋งค๋ฒ ์ ๊ธด ssh -i {ํค ํ์ด ํ์ผ} {ubuntu}@{ec2 ํผ๋ธ๋ฆญ ์ฃผ์}
๋ฅผ ์
๋ ฅํด์ผํ๋ค.
์ด ๊ท์ฐฎ์ ์์ ์ ํธ์คํธ ๋ฑ๋ก์ ํตํด ๊ฐํธํ๊ฒ ์ ์ํ ์ ์๋ค.
๐ธ ํธ์คํธ ๋ฑ๋ก
cp {key-pair-file-name.pem} ~./ssh/
๋ก ~/.ssh ๋๋ ํ ๋ฆฌ๋ก ํค ํ์ด ํ์ผ์ ๋ณต์ฌํ ํ
chmod 600 {key-pair-file-name.pem}
๋ก ํค ํ์ด ํ์ผ ๊ถํ์ ๋ณ๊ฒฝํ๋ค.
~/.ssh ๋๋ ํ ๋ฆฌ์ config ํ์ผ์ ์์ฑํ ํ
$ vi ~/.ssh/config
# ํ์ผ ๋ด์ฉ
# ssh -i {ํค ํ์ด ํ์ผ} {์ ์ ์ด๋ฆ}@{ํ๋ ฅ์ IP}
Host {์ํ๋ ํธ์คํธ ์ด๋ฆ}
User {์ ์ ์ด๋ฆ}
HostName {ํ๋ ฅ์ IP}
IdentityFile {ํค ํ์ด ํ์ผ ์์น}
์์ ํ์๋๋ก ์์ฑํด์ฃผ๋ฉด ๋๋ค.
์ค์ ํ Host ์ด๋ฆ์ผ๋ก ์ ์ํ๋ฉด ์ ์ฐ๊ฒฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค !
๐ท EC2 ์ธ์คํด์ค์ SpringBoot ์๋ฒ ๋์ฐ๊ธฐ
git cloneํด์ ์คํ์ํค๋ ๋ฐฉ๋ฒ๊ณผ jar ํ์ผ ๋น๋ํด์ EC2์ ๋ณต์ฌํ ํ ์คํ์ํค๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ๋ค.
git์ ์ฌ์ฉํ๊ณ ์ถ์์ง๋ง... ์ด๋ฐ์ ๋ฐ ์ฌ์ ๋๋ฌธ์... ๊ทธ๋ฅ ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ํํ๋ค.
1. JDK ์ค์น
sudo ๊ถํ์ผ๋ก apt ์ ๋ฐ์ดํธํ๊ณ , java ๋ฒ์ ์ ๋ง๊ฒ ์ค์นํ๋ค. 17๋ฒ์ ์ผ๋ก ์งํํ๊ธฐ ๋๋ฌธ์ openjdk v17๋ก ์ค์นํ๋ค.
# EC2 ์ธ์คํด์ค
$ sudo apt-get update
$ sudo apt-get install openjdk-17-jdk
2. Spring Boot ํ๋ก์ ํธ build
ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ฉด ./build/libs์ jar ํ์ผ์ด ์์ฑ๋๋ค. ์ด ํ์ผ์ EC2 ์๋ฒ๋ก ๋ณต์ฌํด์ผํ๋ค.
ํธ์คํธ ์ด๋ฆ์๋ ์๊น ์์์ ์ค์ ํ ํธ์คํธ ์ด๋ฆ์ ๋ฃ๋์ง, ์๋๋ฉด ubuntu@{ํผ๋ธ๋ฆญ IP ๋๋ DNS}
์ ์
๋ ฅํ๋ค.
3. EC2 ์ธ์คํด์ค์์ ์คํ์ํค๊ธฐ
# EC2 ์ธ์คํด์ค
$ nohup java -jar {jar ํ์ผ๋ช
}-0.0.1-SNAPSHOT.jar &
ํฐ๋ฏธ๋ ์ฐฝ์ ๊บผ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์ ์คํ์ํค๊ธฐ ์ํด์ nohup
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค.
๋ก๊ทธ ํ์ผ์ nohup.out์ ์ ์ฅ๋๋ค.
์ข ๋ฃ์ํค๊ธฐ ์ํด์๋
sudo lsof -PiTCP -sTCP:LISTEN
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ ํ
kill -9 {PID}
๋ก ํด๋นํ๋ PID๋ฅผ ์ฃฝ์ด๋ฉด ๋๋ค.
๐ด ๋ก์ปฌ์ ์๋ MySQL ๋ฐ์ดํฐ๋ค์ EC2 ์๋ฒ MySQL๋ก ์ฎ๊ธฐ๊ธฐ
์์์ ๋งํ๋ค์ํผ ๋ฐฐํฌ๋ฅผ ์ ํ ํ ์๊ฐ์ด ์์๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ๋ก์ปฌ์ ์๋ ๋ฐ์ดํฐ๋ค์ ์๋ฒ์ ์ฎ๊ฒจ์ผ ํ๋ค.
๊ฒ์ํด๋ณด๋ ๋ฐฑ์ ํด์ ๋ญ ์ด๋ป๊ฒ ํ๋ผ๋๋ฐ ์ฌ์ค ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
๐ท ๋ก์ปฌ
mysqldump -u root -p --databases [db_name] > [db_name].sql
[db_name].sql ํ์ผ์ด ์์ฑ๋๋ฉด์ ์ด ํ์ผ์ EC2 ์๋ฒ๋ก ์ฎ๊ฒจ์ฃผ์ด์ผ ํ๋ค.
scp -i [pem_file_name] [upload_file] ubuntu@ec[ip_of_ec2]:~/[transfer_path]
๐ท EC2 ์๋ฒ
mysql -u root -p
mysql> create database [db_name]
mysql> exit
๋ณต์ํ DB๋ฅผ ์์ฑํ๋ค.
mysql -u root -p [db_name] < [db_name].sql
๋ณต์ฌํ sql ํ์ผ์ ์์ฑํ DB์ ๋ณต์ํ๋ฉด ๊ทธ๋๋ก ๊ฐ์ ธ์ค๊ฒ ๋๋ค.. !
๐ด ๊ฒฐ๊ณผ
์ง ! ๋ฐ์ดํฐ๊น์ง ์ ๋ถ๋ฌ์์ก๋ค..
https๋ฅผ ๋ฐ๋ก ์ ์ฉํ์ง ์์์ '์ฃผ์ ์ํจ'์ด ๋ฌ๋ค.
์์ง ํ ์๊ฐ์ด ์๊ธด ํ๋ค.. ํ๊ธด ํด์ผํ๋๋ฐ..
๋๋ฉ์ธ์ ์์ ์ ๊ตฌ์ ํ๋ ๊ฒ์ ์ฌ์ฉํ ์์ ์ด๋ค. ์ถํ์ ์ถ๊ฐํด์ผ์ง...
๐ข ์ค๋ฅ ๋ฌ๋ ๊ฒ๋ค..
- its MIME type ('application/json') is not supported stylesheet MIME type, and strict MIME checking is enabled. โ ํ์ผ ๊ฒฝ๋ก ์์ ํด์ ํด๊ฒฐ.
- MySQL ์๋ฒ ์คํ์ํค๊ธฐ.. โ ์ธ๋ฐ์ด๋ ๊ท์น ํธ์ง์ ํตํด์ ํด๊ฒฐ. test connection ๋๋ฅด๊ณ ๋ฌด์ง๊ฐ ๋์๊ฐ ๋๋ง๋ค ๊ฐ๊ฐํ๋ค..
- net::ERR_CONNECTION_REFUESED โ ๋ฆฌ์กํธ 3000 ํฌํธ๋ฅผ 8080 ํฌํธ๋ก.. โ index.js์ ํผ๋ธ๋ฆญ ip๋ก ๋ฐ๊ฟ์ฃผ๋ฉด์ ํด๊ฒฐ.
- net::ERR_CONNECTION_TIMED_OUT โ 8080ํฌํธ๋ฅผ 8000ํฌํธ๋ก ์๋ชป ์ ์๋ค..
๋ค์ ์๊ฐํด๋ณด๋ฉด ์ฌ์ํ ๊ฒ๋ค์์ ์๊ฐ์ ์ก์๋จน์ ๊ฒ ๊ฐ๋ค ๐ฅฒ