인프런에서 주최하는 Warming-up 클럽 0기 백엔드 스터디에 참여하고 있다.
스터디에 참여하면서 배우게 된 내용을 전체적으로 정리하고, 참여하면서 느낀 부분을 회고해 보고자 한다.
(1) 12일 차 : 2024-03-05(Tue)
1. Amazon EC2 접속 방법
(1) 다운로드 받은 Key pair(Pem 키)를 통해 접속하는 방법
(2) AWS Console을 통해 접속하는 방법
1-1. Key pair를 사용해서 접속
(1) 우선 접속하려는 EC2의 IP 주소를 확인한다.
- 실행 중인 인스턴스에 접속해서 퍼블릭 IP 주소를 확인한다.
(2) Key pair를 확인한다.
(3) 접속하기 위한 프로그램을 사용한다. (Git CLI 또는 MacOS의 iterm)
1-2. Iterm으로 접속
(1) 접속 명령어 : ssh -i [path]/[키 페어 이름].pem/ec2-user@[IP address]
(2) 개인적으로는 터미널로 접속하는 방식이 간편한 것 같다.
2. 기본적인 Linux command
2-1. mkdir [디렉토리명]
mkdir dir1
(1) 디렉토리 생성
2-2. ls
ls -l
(1) 현재 위치에 존재하는 폴더나 파일 리스트를 확인
(2) drwxr-xr-x
d - 디렉토리 / r : 읽기 권한 / w : 쓰기 권한 / x : 실행 권한
rwx : 폴더 소유자의 권한 / r-x : 폴더 소유 그룹의 권한 / r-x : 아무나 접근했을 때의 권한
2-3. cd
cd dir1
(1) 현재 디렉토리 위치 변경
(2) cd .. : 상위 디렉토리로 이동
2-4. rmdir
rmdir dir1
(1) 현재 비어있는 디렉토리를 삭제
3. AWS Linux에서 스프링 서버 배포를 위한 환경 구성하기
3-1. Git Install
sudo yum update
(1) 현재 설치된 여러 프로그램들을 최신 버전으로 최신화한다.
sudo yum install git
(2) 관리자를 통해 git을 설치한다.
(3) Complete! 문구가 확인될 때까지 기다린다.
3-2. Java 17 Install
sudo yum install java-17-amazon-corretto -y
(1) 자바를 설치하는 명령이다. 마찬가지로 complete!가 보일 때까지 대기한다.
(2) java -version을 통해 현재 설치된 자바의 버전 확인이 가능하다.
3-3. MySQL Install
## MySQL
wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql80-community-release-el7-5.noarch.rpm
sudo yum install mysql-community-server
## MySQL aws 2023 server인 경우
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf install mysql-community-server
## aws 2023 server에 MariaDB 설치
sudo yum install -y mariadb105-server
(1) 위와 같이 정상 설치됨을 확인할 수 있다.
(2) 패키지 충돌 시 sudo yum --skip-broken update 후 진행한다.
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf install mysql-community-server
(3) 만약 amazon 2023인 경우 위의 커맨드로 진행한다.
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
(4) 만약 gpgkey가 이전 버전으로 만료되어 오류가 발생한다면 위와 같이 최신 버전을 임포트하고 재설치한다.
(5) 그러면 위와 같이 정상적으로 실행되는 것을 확인할 수 있었다.
(6) sudo systemctl restart mysqld로 MySQL을 활성화한다.
(7) mysql -u root -p를 통해 MySQL에 접속한다.
(8) sudo cat /var/log/mysqld.log | grep "A temporary password"으로 임시 비밀번호를 확인한 후 접속한다.
(9) 임시 비밀번호로 접속한 상태에서 명령을 주게 되면 임시 비밀번호로 접속한 계정으로 명령을 줄 수 없다는 문구가 나온다.
(10) 임시 비밀번호를 변경하자.
alter user 'root'@'localhost' identified with mysql_native_password by "변경할 비밀번호";
(11) 위와 같이 루트 계정에서 사용할 본인의 비밀번호로 변경한다.
4. 기존 테이블 생성, 원격 저장소에서 코드 가져오기, 빌드와 배포
4-1. EC2 환경 데이터베이스에 테이블 생성
4-2. 코드 가져오기
git clone [Repository address]
ls
cd [생성된 리포지토리 폴더]
ls
(1) 원격 저장소에 저장된 코드를 git clone를 통해 불러올 수 있다.
4-3. 현재 사용 중인 프리티어는 성능이 좋지 않다.
(1) 빌드 과정에서 많은 렉이 발생할 수 있는 데 이를 위한 조치가 필요하다.
(2) 해결책 : Swap setting
- 메모리가 부족한 경우 디스크를 사용할 수 있도록 설정해야 한다.
- RAM이 많이 부족하기 때문에 일부러 속도가 느린 디스크 저장소를 사용하도록 설정해야 하는 것.
# swap memory 할당
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
# swap file에 대한 권한 업데이트
sudo chmod 600 /swapfile
# swap 영역 설정
sudo mkswap /swapfile
# swap file을 사용할 수 있도록 설정한다.
sudo swapon /swapfile
# swap 성공 확인
sudo swapon -s
4-4. 빌드 준비
# gradlew를 사용하기 위해 실행할 수 있도록 설정한다.
chmod +x ./gradlew
# gradle을 이용해 프로젝트를 빌드, 테스트는 진행하지 않음
./gradlew build -x test
# 테스트까지 포함한다면
./gradlew build
# 빌드 결과물 제거
./gradlew clean
(1) 테스트를 돌리지 않는 이유 : 테스트 코드 작성 X, 무료 서버이다보니 테스트를 돌리지 않는 부분이 성능상 유리
(2) 위와 같이 빌드를 성공하면 이전에 없던 build 파일이 생성된 것을 확인할 수 있다.
(3) cd build > cd libs로 이동하면 .jar 파일이 확인된다. 해당 파일이 현재까지 우리가 작성한 코드가 모여있는 jar 파일이다.
(4) 이 빌드된 jar 파일을 통해 서버를 실행할 수 있다. jar 파일은 개발한 소스코드를 모두 뭉쳐놓은 artifact이다.
4-5. 서버 실행
java -jar build/libs/library-app-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
##
java -jar [path][.jar file name] --spring.profiles.active=[profile policy name]
(1) 서버가 정상적으로 실행되는 것을 확인할 수 있다.
5. 종료되지 않는 실행
(1) EC2 접속이 종료되더라도 서버가 계속 실행되도록 하는 방법은 무엇일까?
5-1. foreground & background
(1) foreground는 쉽게 말해서 사용자가 보고 있는 프로그램을 말한다.
(2) background는 직접 사용자와 상호작용하진 않지만 시스템에서 실행 중인 프로그램이다.
(3) jar 파일을 실행시켜서 서버를 올리는 명령을 background 기반으로 실행되게 설정해 보자.
5-2. background로 동작하도록 하는 명령어
## 해당 명령이 백그라운드로 돌게 된다.
nohup [명령어] &
(1) 현재 nohup.out이라는 파일이 생성된다.
(2) background로 실행되면서 발생하는 로그들이 해당 파일에 저장된다.
5-3. 프로세스 PID 확인 후 Back-ground 실행 중지
(1) 아래와 같은 커맨드로 실행한 스프링 서버 .jar 파일명을 입력해 실행 중인 프로세스 PID를 확인할 수 있다.
ps -ef || grep "실행했던 jar 파일 이름"
(2) 위와 같이 PID를 확인하고 sudo kill -9 "PID_Number"를 통해 백그라운드 프로세스를 종료시킬 수 있다.
5-4. 로그 확인을 위한 Vim Editor 사용하기
vi nohup.out
5-5. 파일 내부 확인 cat, tail, tail -f
## 파일 양이 많지 않고 실시간 업데이트가 거의 없는 파일을 확인
cat [파일명]
## 파일의 거의 마지막 부분을 실시간으로 출력
tail -f [파일명]
6. 개인 회고
(1) 배포에 대한 과정을 빠르게 한 번 정리할 수 있었던 파트인 것 같다. 서버 애플리케이션은 리눅스 환경에서 다루어지므로 리눅스를 거리낌 없이 사용하는 데 있어 익숙해져야 할 것 같다.
7. Reference
(1) 관련 레퍼런스는 인프런에서 활동하고 계시는 최태현 강사님의 온라인 강의를 듣고 내용을 정리했습니다.
※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다
'기록, 회고 > InFlearn Warming-up 0기 BE' 카테고리의 다른 글
[13일 차] - 내용 정리(build.gradle, 스프링 & 스프링 부트 차이), 개인 회고 (0) | 2024.03.06 |
---|---|
[11일 차] - 내용 정리(배포, Git 기초 사용 방법, AWS EC2), 개인 회고 (0) | 2024.03.02 |
[10일 차] - 내용 정리(JPA와 연관 관계, 지연 로딩(객체지향적 설계)), 개인 회고 (0) | 2024.02.28 |
[9일 차] - 내용 정리(추가된 기능에 대한 API 개발), 개인 회고 (2) | 2024.02.27 |
[8일 차] - 내용 정리(트랜잭션, JPA 영속성 컨텍스트), 개인 회고 (0) | 2024.02.26 |
댓글