์ด์ ๊ธ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฉ EC2 ์๋ฒ์์๋ง ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ฉ EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ํด๋น ์ธ์คํด์ค์ MYSQL์ ์ค์นํ๋ ๊ณผ์ ์ ์งํํ์ต๋๋ค.
์ด๋ฒ์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ DB๋ฅผ ์ง์ ์ฐ๋ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์คํ๋ง ์ฝ๋ ์์ฑํ๊ธฐ
์ฐ์ ํ ์คํธ๋ฅผ ์ํด์ ๊ฐ๋จํ ์ฝ๋๋ฅผ ํ๋ ์์ฑํ ์์ ์ ๋๋ค.
public class Member {
private Long id;
private String email;
private String password;
public Member(Long id, String email, String password) {
this.id = id;
this.email = email;
this.password = password;
}
public Long getId() {
return id;
}
public String getEmail() {
return email;
}
public String getPassword() {
return password;
}
}
@Repository
public class MemberDao {
private final JdbcTemplate jdbcTemplate;
public MemberDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void addMember(Member member) {
String sql = "INSERT INTO member (email, password) VALUES (?, ?)";
jdbcTemplate.update(sql, member.getEmail(), member.getPassword());
}
}
@RestController
public class MemberController {
private final MemberDao memberDao;
public MemberController(MemberDao memberDao) {
this.memberDao = memberDao;
}
@PostMapping("/members")
ResponseEntity<String> signUp(
@RequestBody SignUpRequest request
) {
memberDao.addMember(request.toMember());
return ResponseEntity.ok("OK!");
}
}
/members๋ก POST ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์์ ์ ๋๋ค.
์ด์ DB์ ๋ํ ์ค์ ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ ์ํด ํ์ํ ์ค์ ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โ๏ธ application.yml
spring:
datasource:
url: DB์ ์ฃผ์
driver-class-name: ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ Driver class์ ์ด๋ฆ
username: DB ์ ์ ์์ด๋
password: DB ์ ์ ๋น๋ฐ๋ฒํธ
๊ทธ๋ฌ๋ ์ด๋ค์ ๊ฐ์ ๋จ์ํ ์ฑ์์ ์ฐ๊ฒฐํด์๋ ์๋๊ณ , ๋ค์๊ณผ ๊ฐ์ ์ฌํญ๋ค์ ๊ณ ๋ คํด์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
๐ ํ๋ก๋์ ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ๋ฐ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถ๋ฆฌ
์ฒซ๋ฒ์งธ ๊ณ ๋ ค์ฌํญ์ ์ค์ ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ๋ฐ์ ์ํ ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
์ด๋ค์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ฐ๋ฐ ์์ ์ค์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ช ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๋ฑ์ ์์ ์ ์ํํ๋๋ผ๋ ์ค์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฅ์ ๋ฏธ์น๋ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ ์ ์์ต๋๋ค.
๐ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด ๊ฐ์ถ๊ธฐ
๋ ๋ฒ์งธ๋ก ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฃผ์, ์์ด๋, ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ์ง ์๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ์ ๋ณด๊ฐ ๋ ธ์ถ๋๋ฉด ๋ณด์์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ฆ ์ด๋ฌํ ์ ๋ณด๋ ๋ค๋ฅธ ์ฌ๋์ด ํ์ธํ ์ ์๋๋ก ๊ด๋ฆฌํด์ผ ํ๋ฉฐ, ์ด๋ฌํ ์ค์ ๊ฐ์ GitHub์ public repository์ ์ฌ๋ ค์๋ ์๋ฉ๋๋ค.
๐ง ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ํ๋ก๋์ ํ๊ฒฝ ๋ถ๋ฆฌํ๊ธฐ
์ด๋ฅผ ์ํ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋๊ฐ์ง๊ฐ ์๋๋ฐ์, ์ ๋ ์ด๋ค ์ค ํ๊ฐ์ง ๋ฐฉ๋ฒ๋ง ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ด์ ๋ถํฐ ๊ฐ๋ฐ ํ๊ฒฝ์ dev, ํ๋ก๋์ ํ๊ฒฝ์ prod๋ก ์นญํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ธฐ์กด application.yml์ด ๋ค์๊ณผ ๊ฐ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
spring:
datasource:
url: jdbc:h2:mem:testdb;MODE=MySQL
driver-class-name: org.h2.Driver
username: sa
password:
my-env:
first: ${FIRST_MALLANG_ENV}
second: ${SECOND_MALLANG_ENV}
์ด์ ์ด๋ค์ ๊ฐ๊ฐ application.yml, application-dev.yml, application-prod.yml ๋ก ๋๋ ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
โ๏ธ application.yml
spring:
profiles:
active: dev
my-env: # ๊ณตํต์ผ๋ก ์ ์ฉ๋๋ค.
first: ${FIRST_MALLANG_ENV}
second: ${SECOND_MALLANG_ENV}
โ๏ธ application-dev.yml
spring:
datasource:
url: jdbc:h2:mem:testdb;MODE=MySQL
driver-class-name: org.h2.Driver
username: sa
password:
โ๏ธ application-prod.yml
spring:
datasource:
url: ์ค์ DB ์ฃผ์
driver-class-name: com.mysql.cj.jdbc.Driver
username: DB ์์ด๋
password: DB ๋น๋ฒ
์ด์ ๊ฐ์ด ์ค์ ํ์ผ์๋ค ๋ง๋ค์ด์ฃผ์๋ค๋ฉด ์ดํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ํฌ ๋ SPRING_PROFILES_ACTIVE ๋ผ๋ ์ด๋ฆ์ ํ๊ฒฝ๋ณ์๋ฅผ dev๋ก ์ค์ ํด์ฃผ๋ฉด application-dev.yml์ด, prod๋ก ์ค์ ํด์ฃผ๋ฉด application-prod.yml์ด ์ค์ ๋ฉ๋๋ค.
SPRING_PROFILES_ACTIVE=dev -> application-dev.yml
SPRING_PROFILES_ACTIVE=prod -> application-prod.yml
๋ํ ๊ธฐ๋ณธ application.yml์ ๊ธฐ๋ณธ spring.profiles.active๋ฅผ dev๋ก ์ค์ ํด ์ฃผ์์ผ๋ฏ๋ก, SPRING_PROFILES_ACTIVE์ ์๋ฌด ๊ฐ๋ ์ค์ ํ์ง ์์ผ๋ฉด dev๊ฐ ์ ์ฉ๋ฉ๋๋ค.
๐ง ์ค์ DB ์ ๋ณด ๊ฐ์ถ๊ธฐ
์ด๋ฅผ ์ํด์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ง๋ง, ์ด๋ฒ ๊ธ์์๋ ๊ฐ์ฅ ๊ฐ๋จํ ํ๊ฒฝ๋ณ์๋ฅผ ํตํด์ ๊ฐ์ ์จ๊ธฐ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์์์ ์ดํด๋ณธ application-prod.yml ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ๊ฒฝ๋ณ์๋ฅผ ํตํด์ ๊ฐ์ ์จ๊ธธ ์ ์์ต๋๋ค.
spring:
datasource:
driver-class-name: ${RDS_DRIVER}
url: ${RDS_URL}
username: ${RDS_USERNAME}
password: ${RDS_PASSWORD}
์ค์ ์ด ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์๋ฒ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์กฐ๊ธ ์์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค.
(์งํํ๊ธฐ ์ ์ ํ์ฌ๊น์ง์ ์ฝ๋๋ฅผ ๊นํ๋ธ์ push ํด์ฃผ์ด์ผ ํฉ๋๋ค.)
๐ง EC2 ์ ์คํฌ๋ฆฝํธ ์์ ํ๊ธฐ
์ฐ์ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ฉ EC2์ ์ ์ํฉ๋๋ค.
์ด์ ๋ฐฐํฌ๋ฅผ ์ํ ์ ์คํฌ๋ฆฝํธ ํ์ผ(์ ๊ฒฝ์ฐ bapo.sh)์ ์์ ํด ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
vim [๋ฐฐํฌ ์คํฌ๋ฆฝํธ ํ์ผ]
ํ์ฌ ์ ๊ฐ ์์ฑํ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โ๏ธ bapo.sh
#!/bin/sh
PROJECT_PATH=/home/ubuntu/mallang-projects
PROJECT_NAME=bapo-test
PORT=8080
BUILD_PATH=build/libs
JAR_NAME=jwp-shopping-order.jar
echo "\n ๐ณ [$PROJECT_PATH/$PROJECT_NAME] ๊ฒฝ๋ก๋ก ์ด๋ํฉ๋๋ค.\n"
cd $PROJECT_PATH/$PROJECT_NAME
echo " ๐ณ ์ต์ ์ฝ๋๋ฅผ PULL ํฉ๋๋ค!\n"
git pull
echo " ๐ณ ํ๋ก์ ํธ๋ฅผ ์๋กญ๊ฒ ๋น๋ํฉ๋๋ค.\n"
./gradlew clean build
echo " ๐ณ [$PORT] ๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฐพ์ต๋๋ค...\n"
PID=$(lsof -i :$PORT -t)
if [ -z $PID ]; then
echo " ๐ ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ด์ ๊ณง๋ฐ๋ก ์คํํฉ๋๋ค.\n"
else
echo " โ ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ด์ ์ด๋ฅผ ์ข
๋ฃํฉ๋๋ค. [PID = $PID]\n"
kill -15 $PID
fi
echo " ๐ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋๋ฐ ํ์ํ ํ๊ฒฝ๋ณ์๋ฅผ ์ธํ
ํฉ๋๋ค.\n"
export FIRST_MALLANG_ENV="mallang1"
export SECOND_MALLANG_ENV=1234
echo " ๐ ์ ํ๋ฆฌ์ผ์ด์
์คํํฉ๋๋ค~ ๐\n"
nohup java -jar $PROJECT_PATH/$PROJECT_NAME/$BUILD_PATH/$JAR_NAME &
์ฐ์ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ธํด ๋ณด๊ธฐ ์ํด ํด๋น ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํํด ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ ์คํ๋๋ ๊ฒ ๊ฐ์๋ฐ, ํ๋ฒ nohup.out ๋ก๊ทธ๋ฅผ ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
(์ ์ค์ ์ ๊ทธ๋๋ก ๋ฐ๋ผํ์ จ๋ค๋ฉด mallang-projects/bapo-test ์ ์์นํฉ๋๋ค.)
์ ์คํ๋์์ง๋ง ํ๋ ๋ฌธ์ ๊ฐ ์๋๋ฐ์, ๋ถ๋ช ํด๋น EC2๋ ํ๋ก๋์ ํ๊ฒฝ์ ๋ชฉ์ ์ผ๋ก ์์ฑํ ์๋ฒ์ธ๋ฐ profile์ด dev๋ก ์ค์ ๋์์ต๋๋ค.
์ด๊ณณ์์๋ dev๊ฐ ์๋ prod ํ๊ฒฝ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋์ด์ผ ํ๋๋ฐ์, ์ด๋ฅผ ์ํด ์ ์คํฌ๋ฆฝํธ๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ ์ ์์ต๋๋ค.
์ถ๊ฐํ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export SPRING_PROFILES_ACTIVE="prod"
โ๏ธ ๋ณ๊ฒฝ๋ bapo.sh
#!/bin/sh
PROJECT_PATH=/home/ubuntu/mallang-projects
PROJECT_NAME=bapo-test
PORT=8080
BUILD_PATH=build/libs
JAR_NAME=jwp-shopping-order.jar
echo "\n ๐ณ [$PROJECT_PATH/$PROJECT_NAME] ๊ฒฝ๋ก๋ก ์ด๋ํฉ๋๋ค.\n"
cd $PROJECT_PATH/$PROJECT_NAME
echo " ๐ณ ์ต์ ์ฝ๋๋ฅผ PULL ํฉ๋๋ค!\n"
git pull
echo " ๐ณ ํ๋ก์ ํธ๋ฅผ ์๋กญ๊ฒ ๋น๋ํฉ๋๋ค.\n"
./gradlew clean build
echo " ๐ณ [$PORT] ๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฐพ์ต๋๋ค...\n"
PID=$(lsof -i :$PORT -t)
if [ -z $PID ]; then
echo " ๐ ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ด์ ๊ณง๋ฐ๋ก ์คํํฉ๋๋ค.\n"
else
echo " โ ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ด์ ์ด๋ฅผ ์ข
๋ฃํฉ๋๋ค. [PID = $PID]\n"
kill -15 $PID
fi
echo " ๐ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋๋ฐ ํ์ํ ํ๊ฒฝ๋ณ์๋ฅผ ์ธํ
ํฉ๋๋ค.\n"
export FIRST_MALLANG_ENV="mallang1"
export SECOND_MALLANG_ENV=1234
# ํด๋น ๋ถ๋ถ ์ถ๊ฐ
export SPRING_PROFILES_ACTIVE="prod"
echo " ๐ ์ ํ๋ฆฌ์ผ์ด์
์คํํฉ๋๋ค~ ๐\n"
nohup java -jar $PROJECT_PATH/$PROJECT_NAME/$BUILD_PATH/$JAR_NAME &
์๊น ์ ์ ์ดํด๋ณธ SPRING_PROFILES_ACTIVE ํ๊ฒฝ๋ณ์๋ฅผ prod๋ก ์ค์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์์ต๋๋ค.
๋ค์ nohup.out ๋ก๊ทธ๋ฅผ ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ์ prod๋ก ์ ๋๋ก ์ค์ ๋์์ง๋ง, DB ์ค์ ์ ๋ณด๋ฅผ ์์ง ์ค์ ํด์ฃผ์ง ์์๊ธฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ ์ํด ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐ๋ก ์ค์ ํด ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ถ๊ฐํ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export RDS_DRIVER="com.mysql.cj.jdbc.Driver"
export RDS_URL="jdbc:mysql://[DB์ฉ EC2 Private IPv4 ์ฃผ์]:3306/[์ด์ ๊ธ์์ ์์ฑํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ]"
export RDS_USERNAME="root"
export RDS_PASSWORD="์ด์ ๊ธ์์ ์ค์ ํ root ๊ณ์ ๋น๋ฐ๋ฒํธ"
์ด๋ DB์ฉ EC2 Private IPv4 ์ฃผ์๋ ๋ค์ ์ค ํํฌ์ ๋ฐ์ค์น ๋ถ๋ถ๊ณผ ๊ฐ์ต๋๋ค.
์ด์ ๊ธ์์ ์์ฑํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ์ ์๋์ ๊ฐ์ต๋๋ค.
โ๏ธ ๋ณ๊ฒฝ๋ bapo.sh
#!/bin/sh
PROJECT_PATH=/home/ubuntu/mallang-projects
PROJECT_NAME=bapo-test
PORT=8080
BUILD_PATH=build/libs
JAR_NAME=jwp-shopping-order.jar
echo "\n ๐ณ [$PROJECT_PATH/$PROJECT_NAME] ๊ฒฝ๋ก๋ก ์ด๋ํฉ๋๋ค.\n"
cd $PROJECT_PATH/$PROJECT_NAME
echo " ๐ณ ์ต์ ์ฝ๋๋ฅผ PULL ํฉ๋๋ค!\n"
git pull
echo " ๐ณ ํ๋ก์ ํธ๋ฅผ ์๋กญ๊ฒ ๋น๋ํฉ๋๋ค.\n"
./gradlew clean build
echo " ๐ณ [$PORT] ๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฐพ์ต๋๋ค...\n"
PID=$(lsof -i :$PORT -t)
if [ -z $PID ]; then
echo " ๐ ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ด์ ๊ณง๋ฐ๋ก ์คํํฉ๋๋ค.\n"
else
echo " โ ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ด์ ์ด๋ฅผ ์ข
๋ฃํฉ๋๋ค. [PID = $PID]\n"
kill -15 $PID
fi
echo " ๐ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋๋ฐ ํ์ํ ํ๊ฒฝ๋ณ์๋ฅผ ์ธํ
ํฉ๋๋ค.\n"
export FIRST_MALLANG_ENV="mallang1"
export SECOND_MALLANG_ENV=1234
export SPRING_PROFILES_ACTIVE="prod"
export RDS_DRIVER="com.mysql.cj.jdbc.Driver"
export RDS_URL="jdbc:mysql://[DB์ฉ EC2 Private IPv4 ์ฃผ์]:3306/bapo_test"
export RDS_USERNAME="root"
export RDS_PASSWORD="1234"
echo " ๐ ์ ํ๋ฆฌ์ผ์ด์
์คํํฉ๋๋ค~ ๐\n"
nohup java -jar $PROJECT_PATH/$PROJECT_NAME/$BUILD_PATH/$JAR_NAME &
์ด์ ๋ค์ ์คํํ๊ณ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
๋ฐ๋ก ์คํจํด ๋ฒ๋ ธ์ต๋๋ค.
์ด์ ๋ ๋ฐ๋ก DB์ root ๊ณ์ ์ ์ธ๋ถ ์ ์ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์ธ๋ฐ์, ์ด์ ๋ถํฐ ๊ถํ์ ๋ถ์ฌํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง ์ธ๋ถ ์ ์ ๊ถํ์ ๊ฐ์ง DB ์ ์ ์์ฑํ๊ธฐ
์ฐ์ DB์ฉ EC2์ ์ ๊ทผํด ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
ssh -i mallang-test-ec2-key.pem ubuntu@[DB์ฉ private IPv4 ์ฃผ์]
์ ์ํ์ผ๋ฉด mysql์ ์ ์ํฉ๋๋ค.
mysql -u root -p
๊ธฐ์กด root ๊ณ์ ์ ์ธ๋ถ ์ ์ ๊ถํ์ ๋ถ์ฌํ๊ธฐ๋ณด๋ค๋ ์๋ก์ด ๊ณ์ ์ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
create user '์ ์ ์ด๋ฆ'@'์ธ๋ถ ์ ์ ip' identified by '๋น๋ฐ๋ฒํธ';
localhost๋ฅผ ์ ์ธํ ๋ชจ๋ ์ธ๋ถ ip๋ฅผ ํ์ฉํ ๋์๋ %๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ex: create user '์ ์ ์ด๋ฆ'@'%' identified by '๋น๋ฐ๋ฒํธ';
์ด๋ ์ธ๋ถ์ ์ ip๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฉ EC2์ ํ๋ผ์ด๋น IPv4 ์ฃผ์๋ฅผ ์ ๋ ฅํด ์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ ๋ mallag์ด๋ผ๋ ๊ณ์ ์ ๋ง๋ค๋๋ก ํ๊ฒ ์ต๋๋ค.
create user 'mallang'@'[์ ํ๋ฆฌ์ผ์ด์
์ฉ EC2 Private IPv4 ์ฃผ์]' identified by '๋น๋ฐ๋ฒํธ';
grant all privileges on ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช .* to '์ ์ ์ด๋ฆ'@'์ค์ ํ IP';
[*.*] ์ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ถํ์ ์ค๋๋ค.
[๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช .ํ ์ด๋ธ๋ช ] ์ ํน์ ํ ์ด๋ธ์ ๊ถํ์ ์ค๋๋ค.
์ด์ mallang ์ด๋ผ๋ ๊ณ์ ์๊ฒ ์ด์ ๊ธ์์ ์์ฑํ bapo_test๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ชจ๋ ๊ถํ์ ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
grant all privileges on bapo_test.* to 'mallang'@'[์ ํ๋ฆฌ์ผ์ด์
์ฉ EC2 Private IPv4 ์ฃผ์]';
์ด๋ฅผ ์ ์ฉํด ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
flush privileges;
์ด์ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ฉ EC2๋ก ๋์๊ฐ ์ ์คํฌ๋ฆฝํธ์์ datasource์ username๊ณผ password ๋ฅผ ์์์ ์ค์ ํ ์ ์ ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํฉ๋๋ค.
export RDS_USERNAME="mallang"
export RDS_PASSWORD="1234"
์ด์ ๋ค์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
๊ฒฐ๊ณผ๋ ๋ ์คํจ์ ๋๋ค.
์ด์ ๋ ์์ง MYSQL์ ์ธ๋ถ ์ ์ ์ค์ ์ ํด์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ธ๋ฐ์, ์ด์ ๋ถํฐ ์ค์ ์ ํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง MYSQL ์ธ๋ถ ์ ์ ์ค์
๋ค์ DB์ฉ EC2์ ์ ๊ทผํด ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
ssh -i mallang-test-ec2-key.pem ubuntu@[DB์ฉ private IPv4 ์ฃผ์]
์ด์ mysqld.cnf ํ์ผ์ ์์ ํด์ผ ํฉ๋๋ค.
cd /etc/mysql/mysql.conf.d
sudo vi mysqld.cnf
์์ bind-address๊ฐ ํ์ฌ๋ 127.0.0.1๋ก ์ค์ ๋์ด ์๋๋ฐ, ์ด๋ฅผ 0.0.0.0์ผ๋ก ๋ฐ๊พธ์ด์ค๋๋ค.
sudo service mysql restart
mysql ์๋ฒ๋ฅผ ์ฌ์์ํฉ๋๋ค.
์ด์ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ EC2๋ก ๋์์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฑ๊ณตํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
DB์ ์ฐ๋์ด ์ ๋๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋งจ ์ฒ์์ ๋ง๋ค์๋ "/member" ๋ก ํ์๊ฐ์ ์์ฒญ์ ๋ณด๋ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
(๊ฐ๋ ค์ง ์ฃผ์๋ ์ ํ๋ฆฌ์ผ์ด์ EC2์ public IPv4 ์ฃผ์์ ๋๋ค.)
์์ฒญ์ ์ฑ๊ณตํ๋ ๊ฒ์ ํ์ธํ์ผ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ์ฌ ๋ฐ์ดํฐ๊ฐ ์ ์ ์ฅ๋๋์ง ํ์ธํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฑ๊ณตํ์ต๋๋ค ํด
๐ง ์ฐธ๊ณ - Datagrip์ MYSQL ์๋ฒ์ ์ฐ๋ํ๊ธฐ
์ด๋ถ๋ถ์ Datagrip์ ํตํด์ MYSQL ์๋ฒ์ ์ฐ๋ํ๋ ๋ถ๋ถ์ ๋ค๋ฃน๋๋ค.
๊ตณ์ด ์ฐ๋ํ์ง ์์ผ์ ๋ ๋๊ฑฐ๋ Datagrip์ ์ฌ์ฉํ์ง ์์ผ์๋ ๋ถ๋ค์ ๋์ด๊ฐ์ ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
+๋ฒํผ์ ๋๋ฅธ ๋ค, Data Source -> MySQL์ ์ ํํฉ๋๋ค.
SSH/SSL ์ฐฝ์ผ๋ก ๋ค์ด๊ฐ์ Use SSH tunnel์ ์ฒดํฌํฉ๋๋ค.
์ดํ ...์ ๋๋ฌ SSH ์ค์ ์ฐฝ์ ์ฝ๋๋ค.
SSH ์ค์ ์ฐฝ์์ Host๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฉ EC2 ์๋ฒ์ ํผ๋ธ๋ฆญ IPv4 ์ฃผ์๋ฅผ ์ ๋ ฅํฉ๋๋ค.
username์ ubuntu์ ๋๋ค.
์ดํ Authentication type์ Key pair๋ฅผ ์ ํํ ๋ค, ํคํ์ด์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด์ค๋๋ค.
์์ฒ๋ผ ์ค์ ํ ์ดํ SSH ์ค์ ์ฐฝ์์ OK๋ฅผ ๋๋ฌ์ค๋๋ค.
์ดํ General ์ฐฝ์ผ๋ก ๋์์์ Host์ User, Password๋ฅผ ์ ๋ ฅํฉ๋๋ค.
Host๋ DB์ฉ EC2 ์๋ฒ์ ํ๋ผ์ด๋น IPv4 ์ฃผ์์ด๋ฉฐ,
User์ Password๋ ์ธ๋ถ ์ ์ ๊ถํ์ด ์ค์ ๋ Mysql ์ ์ ์ ๋ณด๋ฅผ ์ ๋ ฅํด์ค๋๋ค.
์ ๋ธ๋ก๊ทธ์ ์์๋ก๋ mallang๊ณผ 1234๋ฅผ ์ ๋ ฅํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฑ๊ณตํ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๐ง ๋ง๋ฌด๋ฆฌ
์ด๋ฒ ๊ธ์์๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ MYSQL์ ์ฐ๋ํ๋ ๊ณผ์ ์ ์งํํด ๋ณด์์ต๋๋ค.
์๊ฐ๋ณด๋ค ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด์ง ๊ฒ ๊ฐ๋ค์.. ใ ใ ๐ญ
๋ค์ ๊ธ์์๋ ์ด๋ฒ์ ์ค์ ํ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ ์ค์ ์ ๋ณด๋ฅผ ๊ฐ์ถ๋ ๋ฐฉ๋ฒ ์ธ์ ์ฌ์ฉํ ์ ์๋ git submodule์ ๋ํด ํ์ตํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.