์ด๋ฒ ๊ธ์์๋ ์ด์ ๊ธ์์ ์์ฑํ EC2์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ด๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ์๋ฌด๋ฐ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์๊ด์์ต๋๋ค.
(๋จ maven์ด ์๋ gradle์ ๋์์ผ๋ก ์งํํฉ๋๋ค)
๐ง ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ์ ํ๋ก์ ํธ ์ฌ๋ฆฌ๊ธฐ
์ด๋ฏธ ๊นํ๋ธ์ ํ๋ก์ ํธ๋ฅผ ์ฌ๋ ค๋์ จ๋ค๋ฉด ํด๋น ๊ณผ์ ์ ๊ฑด๋๋ฐ์ด๋ ์๊ด์์ต๋๋ค.
์ ๋ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ํ๋ ์์ฑํด์ ๋ค์๊ณผ ๊ฐ์ด ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ ค๋์์ต๋๋ค.
์ด์ ํด๋น ํ๋ก์ ํธ๋ฅผ clone๋ฐ์ ์ ์๋๋ก, code ๋ฒํผ์ ๋๋ฅธ ๋ค ์ฃผ์๋ฅผ ๋ณต์ฌํฉ๋๋ค.
๐ง EC2 ์์ ํ๋ก์ ํธ clone๋ฐ๊ธฐ
์ด์ ๊ธ์์๋ ๋ค๋ฃจ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํ์ฌ ์ ์ํ ์ ์์ต๋๋ค.
ssh -i [ํคํ์ด] ubuntu@[ํผ๋ธ๋ฆญ IPv4 ์ฃผ์]
ssh -i mallang-key-pair.pem ubuntu@123.456.788.123
๋ค์๊ณผ ๊ฐ์ด ๋จ๋ฉด ๋ฉ๋๋ค.
์ด์ ์์์ ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ์ ์ฌ๋ฆฐ ํ๋ก์ ํธ๋ฅผ clone ๋ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํด์ฃผ์ธ์
git clone [์์์ ๋ณต์ฌํ ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ ์ฃผ์]
git clone https://github.com/shin-mallang/bapo-test.git
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ธ์ฆ์ ํ๋ผ๋ ๋ฉ์ธ์ง๊ฐ ๋์ฌ ํ ๋ฐ์, ์๋ง ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
๊นํ๋ธ ์ฐ์ธก ์๋จ์ ์์ ์ ํ๋กํ์ ํด๋ฆญํ ๋ค, Settings๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ข์ธก ์คํ๋จ์ Developer settings๋ฅผ ํด๋ฆญํฉ๋๋ค.
Personal access tokens์ Tokens (classic) ์ ํด๋ฆญํฉ๋๋ค.
Generate new token -> Generate new token (classic)์ ํด๋ฆญํฉ๋๋ค.
(์ ๋ ์ด๋ฏธ ์ฌ์ฉ์ค์ธ๊ฒ ์์ด์ delete ๋ฒํผ์ด ๋จ๋๋ฐ, ์ค์ ํ์ ์ ์ด ์๋ค๋ฉด ์๋๊ฒ ์ ์์ ๋๋ค.)
์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด ์ฃผ์์ต๋๋ค.
Note๋ ์ ๋นํ ๋ง๋๋ก ์ง์ด์ฃผ์๊ณ , Expiration์ No expiration์ผ๋ก ์ค์ ํ์ต๋๋ค.
ํ์์ ์ธ ๋ถ๋ถ์ repo์ admin:repo_hook์ ๋ํ ๊ถํ์ด๊ณ , ๋๋จธ์ง ๋ถ๋ถ์ ๋ญ๊ฐ ํ์ํ ์๋ ์์ ๊ฑฐ ๊ฐ์์ ๋ช๊ฐ ์ค์ ํด ๋ณด์์ต๋๋ค.
(admin:repo_hook์ ์ดํ ์ ํจ์ค๋ก CI/CD๋ฅผ ์ค์ ํ ๋ ํ์ํฉ๋๋ค.)
๋ค ์ค์ ํ์ผ๋ฉด Generate token์ ํด๋ฆญํฉ๋๋ค.
์์ฑ๋ ํ ํฐ์ ๋ณต์ฌํด์, ์ด๋๊ฐ์ ๊ธฐ๋กํด๋์ธ์.
(๋จ๋ค์๊ฒ ๋ ธ์ถ๋๋ฉด ์๋ฉ๋๋ค. ํฐ์ผ๋ฉ๋๋ค.)
(๋์ค์ Jenkins๋ก CI/CD ์ค์ ํ ๋ ๋ ๊ท์ฐฎ๊ฒ ์์ฑํ๋ ์ผ์ด ์์ผ๋ ค๋ฉด ์ง๊ธ ์ ๊ธฐ๋กํด๋์ธ์)
์ด์ ๋ค์ EC2๋ก ๋์๊ฐ์ PASSWORD ์ ๋ ฅ ๋ถ๋ถ์ ๋ณต์ฌํ ํ ํฐ์ ์ ๋ ฅํด์ฃผ๋ฉด ์ธ์ฆ์ ์ฑ๊ณตํฉ๋๋ค.
์ดํ cloneํ ํ๋ก์ ํธ ํด๋๋ก ์ด๋ํด์ฃผ์ธ์
์ด์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด ๋น๋๋ฅผ ํ๋ฒ ํด๋ณด๊ฒ ์ต๋๋ค.
./gradlew build
์์ ๊ฐ์ด ์๋ฌ๊ฐ ๋จ๋ฉด ์ ์์ ๋๋ค.
์ด๋ ์์ง EC2 ์๋ฒ์ ์๋ฐ๋ฅผ ์ค์นํ์ง ์์์ ๋ฐ์ํ ๋ฌธ์ ์ ๋๋ค.
๐ง EC2 ์ ์๋ฐ ์ค์นํ๊ธฐ
์๋ฐ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก ์ค์นํ ์ ์์ต๋๋ค.
(์ฐธ๊ณ - https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/generic-linux-install.html)
wget -O- https://apt.corretto.aws/corretto.key | sudo apt-key add -
sudo add-apt-repository 'deb https://apt.corretto.aws stable main'
sudo apt-get update; sudo apt-get install -y java-11-amazon-corretto-jdk
๐ 11๋ฒ์ ๋ง๊ณ , ๋ค๋ฅธ ๋ฒ์ ์ด ํ์ํ ๊ฒฝ์ฐ
11 ๋ฒ์ ์ด ์๋ ๋ค๋ฅธ ๋ฒ์ ์ด ํ์ํ๋ค๋ฉด, ๋ค์์ ์ฐธ๊ณ ํด์ฃผ์ธ์ - https://docs.aws.amazon.com/corretto/index.html
์๋ฅผ ๋ค์ด 17๋ฒ์ ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ค์นํ ์ ์์ต๋๋ค.
์๋ฐ๋ฅผ ์ค์นํ์ผ๋ฉด, java -version ๋ช ๋ น์ด๋ฅผ ํตํด์ ํ์ธํ ์ ์์ต๋๋ค.
์ด์ ๋ค์ ํ๋ก์ ํธ๋ฅผ ๋น๋ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง EC2 ์์ ์คํ๋ง ํ๋ก์ ํธ ๋น๋ํ๊ณ ์คํํ๊ธฐ
๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด ๋น๋๋ฅผ ์งํํ ์ ์์ต๋๋ค.
./gradlew build
๋น๋๊ฐ ๋๋๋ฉด jar ํ์ผ์ด build/libs ๋๋ ํ ๋ฆฌ ๋ด๋ถ์ ์์ฑ๋๊ฒ ๋๋๋ฐ์, ์ด๋ํด์ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ : plain jar๊ณผ ๊ทธ๋ฅ jar์ ์ฐจ์ด
๊ฐ๋จํ๊ฒ plain jar์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํ์ํ ๋ชจ๋ ์์กด์ฑ์ ํฌํจํ์ง ์๊ณ , ์์ฑ๋ ์์ค์ฝ๋์ ํด๋์ค ํ์ผ๊ณผ ๋ฆฌ์์ค ํ์ผ๋ง์ ํฌํจํฉ๋๋ค.
plain์ด ์๋ jar์ Executable Jar๋ก์จ, ์ฝ๋ ์คํ์ ํ์ํ ๋ชจ๋ ์์กด์ฑ์ด ํฌํจ๋์ด ์์ต๋๋ค.
Executable Jar ๊ด๋ จํ ํค์๋๋ก ๊ฒ์ํ๋ฉด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํด์ jar ํ์ผ์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ๊ณ , ์ด์ ํด๋น JAR ํ์ผ์ ์คํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก jar ํ์ผ์ ์คํํ ์ ์์ต๋๋ค.
nohup java -jar [์์ฑ๋ JAR ํ์ผ] &
nohup java -jar jwp-shopping-order.jar &
nohup์ ํฐ๋ฏธ๋์ด ์ข ๋ฃ๋ ๋ ๋ฐ์ํ๋ ์๊ทธ๋์ธ SIGHUP๋ฅผ ๋ธ๋ฝํ์ฌ, ํฐ๋ฏธ๋์ด ์ข ๋ฃ๋๋๋ผ๋ ๊ณ์ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์๋๋ก ํด์ค๋๋ค.
&๋ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ํ๋ก์ ํธ๋ฅผ ์คํํ๋ ๋ช ๋ น์ด์ ๋๋ค.
์ด๋ค์ ๋ํด ๊ถ๊ธํ๋ค๋ฉด ์ง์ nohup์ ๋นผ๊ฑฐ๋ &๋ฅผ ๋นผ๊ฐ๋ฉด์ ์ด๋ป๊ฒ ๋ฌ๋ผ์ง๋์ง ํ์ธํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐธ๊ณ :
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [0] - ์ ์ด ํ๋ฆ๊ณผ ์์ธ ์ํฉ
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [1] - ํ๋ก์ธ์ค
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [2] - ํ๋ก์ธ์ค์ ์ ์ด
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [3] - ์๊ทธ๋
nohup์ ์ฌ์ฉํ๋ฉด nohup.out ํ์ผ์ด ์์ฑ๋๋๋ฐ์, cat nohup.out ๋ช ๋ น์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์คํ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๐ง ์คํํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ ๋ณด๋ด๊ธฐ
์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ํ๋ ์์ฑํด ๋์์ต๋๋ค.
@Controller
public class MemberViewController {
private final MemberDao memberDao;
public MemberViewController(MemberDao memberDao) {
this.memberDao = memberDao;
}
@GetMapping("/settings")
public String members(Model model) {
model.addAttribute("members", memberDao.getAllMembers());
return "settings";
}
}
/settings URI๋ก ์ด๋ํ์ฌ ํ๋ฉด์ ์ ๋ณด์ฌ์ฃผ๋์ง ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ 8080 ํฌํธ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฐ์ ํ์, ์๋ฒ์ ip ์ฃผ์๋ EC2 ์ธ์คํด์ค ์ ๋ณด์์ ํ์ธํ ์ ์์ต๋๋ค.
ํผ๋ธ๋ฆญ IPv4 ์ฃผ์์ 123.456.789.123 ์ด๋ผ ๋์์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ url๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
http://123.456.789.123:8080/settings
๊ทธ๋ฐ๋ฐ, ๋ง์ ํด๋ณด์๋ฉด ์์ ๊ฐ์ด ์ฐ๊ฒฐ์ ์คํจํ ๊ฒ์ ๋๋ค.
๊ทธ ์ด์ ๋ ์ธ๋ถ TCP ์์ฒญ์ ๋ณด๋ผ ๋ 8080 ํฌํธ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ํ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ธ๋ฐ์, ์ด์ ์ด๋ฅผ ํด๊ฒฐํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง EC2 ์ธ์คํด์ค ์ธ๋ฐ์ด๋ ๊ท์น ํธ์งํ๊ธฐ
๋ค์ ์ฌ์ฉ์ค์ธ EC2 ์ ๋ณดํ๋ฉด์ผ๋ก ๋์์์, ๋ณด์์ ํด๋ฆญํฉ๋๋ค.
๋ณด์ ๊ทธ๋ฃน์ ํด๋ฆญํฉ๋๋ค.
์ธ๋ฐ์ด๋ ๊ท์น ํธ์ง์ ํด๋ฆญํฉ๋๋ค.
๊ท์น ์ถ๊ฐ - ์ฌ์ฉ์ ์ง์ TCP - 8080 ํฌํธ - ๋ด IP๋ฅผ ์ ํํ๊ณ ๊ท์น์ ์ ์ฅํฉ๋๋ค.
(๋ง์ฝ ๋ชจ๋ ๊ณณ์์ ๋ฐฐํฌํ ์๋ฒ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ์ถ์ผ๋ฉด Anywhere IPv4๋ฅผ ์ ํํด์ฃผ๋ฉด ๋๊ณ ,
ํน์ ํ๋ก ํธ์๋ ์๋ฒ์์๋ง ์ ๊ทผ์ ํ์ฉํ ๊ฒ์ด๋ค! ๋ผ๊ณ ํ๋ค๋ฉด ์ฌ์ฉ์ ์ง์ - ํ๋ก ํธ์๋ ์๋ฒ์ IP๋ฅผ ์ ๋ ฅํด์ฃผ์๋ฉด ๋ฉ๋๋ค.)
์ด์ ์ ์ํ ์ ์์๋ url๋ก ๋ค์ ์ ๊ทผ์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
http://ํผ๋ธ๋ฆญ IPv4 ์ฃผ์:8080/URI
์ฑ๊ณตํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค!
์ด๋ ๊ฒ ํด์ ์์ฑํ EC2 ์๋ฒ์์ ์์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ์งํํด ๋ณด์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์์๋ณด๊ณ ์ด๋ฒ ํฌ์คํ ์ ๋๋ด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃํ๊ธฐ
์ฐ์ ps ๋ช ๋ น์ด๋ฅผ ํตํด ์ด๋ค ํ๋ก์ธ์ค๋ค์ด ์๋์ค์ธ์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
์์ ๊ฐ์ด java ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ์, ํด๋น ํ๋ก์ธ์ค์ PID๊ฐ 3560์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ฐ๋จํ๊ฒ๋ kill -9 3560 ํน์ kill -2 3560์ ํตํด์ ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃํ ์ ์์ต๋๋ค.
ํน์ ํฌํธ ๋ฒํธ๋ฅผ ํตํด PID๋ฅผ ์ฐพ์์ ์ข ๋ฃํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ์, ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
lsof -i :ํฌํธ๋ฒํธ -t | xargs kill -15(ํน์ -2 ํน์ -9)
์๋ฅผ ๋ค์ด 8080 ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
lsof -i :8080 -t | xargs kill -15