[Spring] 나만의 셀렉샵 프로젝트 - 배포(AWS RDS, EC2, MySQL, Filezilla, Port Forwarding)
프로젝트 배포하기
- AWS RDS의 MySQL을 연결
- 그 동안은 H2를 사용했기 때문에, 서비스를 내렸다 올리면 모든 데이터가 초기화되었음
➡️ 데이터를 클라우드에 저장하여 서비스를 껐다 켜도 데이터가 유지되도록 함
- 그 동안은 H2를 사용했기 때문에, 서비스를 내렸다 올리면 모든 데이터가 초기화되었음
- AWS EC2에 배포
- 누구나 서비스에 접속할 수 있게 하려면 원격으로 항상 작동하는 컴퓨터 필요
- 도메인 붙이고 카카오톡으로 공유하기
- OG 태그: 카카오톡으로 링크를 공유할 때, 자동으로 이미지, 제목, 내용을 가져오게 함
AWS RDS 구매하고 MySQL 세팅하기
RDS 구매하기
- AWS에 접속하여 RDS 검색
- 데이터베이스 생성 > 표준 생성 > MySQL > 프리 티어 선택
- 설정 입력 - DB 인스턴스 식별자: 원하는 이름 작성 / 마스터 사용자 이름, 암호: DB 접속용으로 만들고 싶은 계정의 아이디, 비밀번호
- DB 인스턴스 크기, 스토리지 설정 그대로
- 연결 > 추가 연결 구성 탭 클릭 후 다음과 같이 설정
- 퍼블릭 액세스 기능: "예" (이 설저이 되어 있어야 MySQL 연결 가능)
- VPC 보안 그룹: "새로 생성"
- 새 VPC 보안 그룹 이름: sprinboot-db-security
- 가용 영역: 옵션 중 아무거나 - 추가 구성 > 초기 데이터베이스 이름에 "myselectshop" 입력 후 데이터베이스 생성 클릭
RDS 포트 열어주기
- 생성한 데이터베이스 클릭 > 연결 & 보안 > 보안 > VPC 보안 그룹의 springboot-db-security > 보안 그룹 ID 클릭
- 인바인드 규칙 편집 > 소스 > 위치 무관 -> 0.0.0.0, :/0 생성 후 "규칙 저장" 클릭
IntelliJ에서 확인
- RDS 앤드포인트 확인 후 드래그하여 복사
- <나만의 셀렉샵> 프로젝트 열기 > 우측 Database 탭 > Data Source > MySQL
- Name: 생성한 데이터베이스 이름
- Host: 앤드포인트
- User: Username
- Password: 비밀번호
- Database: myselectshop - Test Connection > 성공적으로 연결되면 OK
스프링부트를 MySQL과 연결하기
- 스프링부트 설정의 대부분은 application.properties 에서 관리
spring.datasource.url=jdbc:mysql://나의앤드포인트:3306/myselectshop
spring.datasource.username=나의USERNAME
spring.datasource.password=나의패스워드
spring.jpa.hibernate.ddl-auto=update
OG 태그
<meta property="og:title" content="00만의 셀렉샵">
<meta property="og:description" content="관심상품을 선택하고, 최저가 알림을 확인해보세요!">
<meta property="og:image" content="images/og_selectshop.png">
AWS EC2 준비하고 배포하기
SSH(Secure Shell Protocol)
- 다른 컴퓨터에 접속할 때 사용하는 프로그램으로 다른 프로그램보다 보안이 상대적으로 뛰어남
- 접속할 컴퓨터의 22번 포트가 열려있어야 접속 가능
- AWS EC2의 경우 이미 22번 포트가 열려있음
리눅스 명령어
ls: 내 위치의 모든 파일을 보여줌
pwd: 내 위치(폴더의 경로)를 알려줌
mkdir: 내 위치 아래에 폴더 하나 생성
cd [이동할 곳]: [이동랗 곳] 폴더로 이동
cd ..: 상위 폴더로 이동
cp -r [복사할 것] [붙여넣기 할 것]: 복사 붙여넣기
rm -rf: 삭제
sudo [실행할 명령어]: 관리자 권한으로 명령어 실행
sudo su: 관리가 권한으로 들어감 (나올 땐 exit)
AWS EC2 서버 구매
https://ap-northeast-2.console.aws.amazon.com/ec2/home?region=ap-northeast-2#Home:
AWS EC2 접속
- Mac OS의 경우 ssh가 있어서 명령어로 AWS EC2에 바로 접근 가능
# Keypair 접근 권한 바꿔주기 sudo chmod 400 받은키페어경로 # SSH로 접속하기 ssh -i 받은키페어 ubuntu@AWS에적힌내아이피
배포 파일 빌드
- 프로젝트 실행 후 우측 탭 중 "Gradle" 선택
- Tasks > build > build 더블 클릭
- 좌측 build 폴더 > libs 아래 .jar 확장자로 끝나는 파일 생기면 빌드 성공
OpenJDK 설치
- ubuntu 안에 설치
sudo apt-get update
sudo apt-get install openjdk-17-jdk
java -version
Filezilla 이용하여 배포 파일 업로드
- Filezilla 실행 후 왼쪽 상단 사이트 관리자 클릭
- 새 사이트 생성 후 연결
- 프로토콜: SFTP - SSH File Transfer Protocol
- 호스트: EC2 퍼블릭 IPv4 주소
- 로그온 유형: 키 파일
- 사용자: ubuntu
- 키 파일: EC2 인스턴스 생성 시 생성한 .pem 파일 - 마우스로 드래그하여 .jar 파일 업로드
스프링부트 작동시키기
cd jar파일상위폴더
java -jar jar파일명.jar
⚠️ 오류 발생 ⚠️
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
‼️ 해결 방법 ‼️
lsof -i tcp:8080 으로 8080 포트 사용 중인 프로세스 확인
sudo kill -9 [PID] 로 해당 프로세스 종료
AWS에서 80, 8080 포트 열어주기
- AWS EC2 에서도 자체적으로 포트를 열고 닫을 수 있게 관리하고 있음
➡️ AWS EC2 Security Group 에서 인바운드 요청 포트 열어줘야 함 - EC2 관리 콘솔 > 보안그룹 > 인바운드 규칙 편집 > 8080포트 추가
- 80포트: HTTP 접속을 위한 기본 포트
- 8080포트: 스프링부트 기본 포트
포트포워딩(Port Forwarding)
- http 요청에서는 80포트가 기본이기 때문에 굳이 :80을 붙이지 않아도 자동으로 연결
- 지금은 8080 포트에서 웹 서비스가 실행되고 있기 때문에, 매번 :8080 이라고 뒤에 포트 번호 입력해야함
- 포트 번호를 입력하지 않아도 자동으로 접속되기 위해, 80포트로 오는 요청을 8080 포트로 전달하게 함 ➡️ 포트포워딩
포트 번호 없애기
- 돌아가고 있던 서비스 종료하고 터미널에 포트포워딩 룰 입력
- 다시 서비스 시작
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
- 포트 번호 입력 없이 웹 브라우저에서 접속
java -jar JAR파일명.jar
SSH 접속을 끊어도 서버가 계속 돌게 하기
- 현재 상황: SSH 접속을 끊으면 프로세스가 종료되면서 서버가 돌아가지 않음
- 원격 접속을 종료하더라도 서버가 계속 돌아가게 하기
# 아래의 명령어로 실행하면 된다 nohup java -jar JAR파일명.jar &
- 서버 종료하기(강제 종료)
# 아래 명령어로 미리 pid 값(프로세스 번호)을 본다 ps -ef | grep java # 아래 명령어로 특정 프로세스를 죽인다 kill -9 [pid값]
- 다시 켜기
# 아래의 명령어로 실행하면 된다 nohup java -jar JAR파일명.jar &
- SSH 접속 종료 후 다시 접속해보기
도메인 붙이고 카카오톡에 공유
- 도메인 구매: 네임서버릉 운영해주는 업체에, IP와 도메인 매칭 유지비를 내는 것
- '가비아'에서 도매인 구매 후 관리툴 > 도메인 연결 > DNS 설정 클릭
- 호스트 이름: @, IP 주소: IP 주소 입력 후 10분 정도 대기
- 내 도메인으로 접근하여 접속하고 카카오톡으로 공유하기