이제부터 클라우드 환경에서 RDS와 EC2를 사용하여 직접 EC2 환경에서 내가 만든 로컬 게시판을 빌드해보겠다.
첫 번째 단계로 내가 만들었던 코드들을 github에 올리는 과정이 필요하다.
git을 활용하여 직접 내 계정과 연결하여 코드를 commit하고 push하는 방법도 있지만 IntelliJ에서 쉽게 commit과 push를 하는 방법이 있다.
후자의 방법으로 github에 올려보겠다. 너무 간단하고 편한 방법이다.
이렇게 왼쪽 화면의 두 번째 부분이 commit을 할 수 있는 기능을 수행하는 것인데 여기서 github에 올릴 수 있다.
사진에선 이미 내가 실습으로 올렸기에 바뀐 내용이 없는데 여기서 체크박스를 누른 뒤 commit anyway and push를 하면 gui 상에서 바로 올릴 수 있다.
올리려고 누르면 이런 식으로
이런 화면이 나오는데 그냥 Commit anyway and push를 누르면 된다.
이쯤에서 드는 생각이 있을텐데, properties 파일까지 같이 올려야 하는건가? 하는 생각이 들 수 있다.
어차피 properties는 후에 mobaxterm을 통해서 ec2와 연결한 후 직접 수정할 것이기 때문에 올려도 된다.
일단 파일을 ec2 환경에서 받을 수 있도록 해야 하므로..
이렇게 내 github 환경에서 확인할 수 있다.
내가 workbench에서 사용했던 mariaDB를 대신하여 RDS 서비스의 mariaDB를 사용할 예정이고
amazon linux 2 버전과 M5.large 인스턴스를 활용하여 ec2를 생성할 것이다.
RDS에서 DB 생성
보안 그룹은 기존 default로 설정했다. 이렇게 하면 일단 db가 생성된다.
db를 건들려면 db가 완성되고 나서 나오는 엔드포인트를 보고 접근하면 된다.
이런 식으로
mysql -h board-db.clk0weis8g03.ap-northeast-2.rds.amazonaws.com -uroot -proot1234
명령어를 사용하여 나중에 접근할 때 치고 들어가서 db 테이블을 건들면 된다.
EC2 생성
여기서 유저 데이터 스크립트는 Amazon EC2 인스턴스를 프로비저닝할 때 실행되는 셸 스크립트이다.
#!/bin/bash: 이 스크립트는 Bash 셸에서 실행.
yum update -y: 인스턴스의 패키지를 최신 버전으로 업데이트.
yum install -y httpd: Apache HTTP 서버 패키지(httpd)를 설치.
systemctl start httpd.service: Apache HTTP 서버를 시작.
systemctl enable httpd.service: Apache HTTP 서버가 부팅 시 자동으로 실행되도록 활성화.
echo "Hello World from $(hostname -f)" > /var/www/html/index.html: 간단한 "Hello World" 메시지를 Apache의 기본 웹 페이지 파일(/var/www/html/index.html)에 작성. 이 메시지에는 호스트 이름도 포함.
요약하면, 이 스크립트는 EC2 인스턴스에 Apache HTTP 서버를 설치하고 시작하며, 기본 웹 페이지에 간단한 메시지를 작성. 이를 통해 프로비저닝된 EC2 인스턴스에서 즉시 Apache 웹 서버를 사용할 수 있게 된다.
인바운드에선 웹과 연결하기 위한 80, ssh연결인 22가 필요하다.
아웃바운드에선 3306 포트로 연결만 허용하면 된다. 쓸데없는 내용을 좀 더 인바운드에 추가했지만 내가 적은 이 글만 기억하자
ec2 인스턴스까지 생성했다면 직접 연결해보자
연결하면 이런 완료 페이지가 생긴다
하지만 우리는 여기서 mobaXterm을 쓸 것이다.
MobaXterm은 원격 컴퓨터에 연결하고 관리할 수 있는 강력한 X server와 SSH 클라이언트 프로그램이다.
또한 복사도 되고 좀 더 linux 환경에서 편하게 실시할 수 있다.
이렇게 ip주소와 유저이름, 그리고 보안 키까지 넣어주면
이런 식으로 나오면 연결 된 것이다. 이제 모든 작업은 여기서 수행하겠다.
EC2 빌드
도커, Elastic Beanstalk 등 편리한 배포 도구를 사용하는 것도 좋다.
그러나 기초부터 직접 구축하는 경험을 먼저 쌓아서 실력적인 향상과 성장에 도움이 될 수 있기를 바랐고, 이것이 그 첫번 째 시작일 거라 생각하여 직접 프로비저닝하고 환경을 구축하는 방법을 선택하였다.
이 작업을 수행하면서 db 연결, 프로비저닝, 구축 부분에서 꽤나 많은 오류가 생겼고 고치느라 고생 좀 했다.
특히 db 연결이 workbench에 되지가 않아서 힘들었다.
결론은 직접 안에서 cli를 사용하여 ssh 연결을 통해 db와 연결하여 쿼리문을 작성했다.
다음에 할 FastAPI와 Svelte를 이용하는 프로젝트에선 컨테이너를 활용한 ECS 환경에서 프로젝트를 수행해보겠다.
이 작업을 수행하면서 db 연결, 프로비저닝, 구축 부분에서 꽤나 많은 오류가 생겼고 고치느라 고생 좀 했다.
특히 db 연결이 workbench에 되지가 않아서 힘들었다.
결론은 직접 안에서 cli를 사용하여 ssh 연결을 통해 db와 연결하여 쿼리문을 작성했다.
사용했던 명령어
sudo yum update -y
sudo yum install git -y
sudo yum install wget -y
wget https://download.oracle.com/java/21/archive/jdk-21.0.2_linux-x64_bin.tar.gz
mkdir projects
cd projects
git clone https://github.com/Sungmin214/Board-project.git
cd ..
wget https://services.gradle.org/distributions/gradle-8.7-bin.zip unzip gradle-8.7-bin.zip vi ~/.bash_profile
( AWS EC2 인스턴스나 다른 리눅스 환경에서 자바 프로젝트를 설정하기 위해 수행하는 일련의 단계)
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export JAVA_HOME=/home/ec2-user/jdk-21.0.2/
export GRADLE_HOME=/home/ec2-user/gradle-8.7/
export PATH=$GRADLE_HOME/bin:$JAVA_HOME/bin:$PATH
export PATH
:wq
source ~/.bash_profile
gradle --version
cd /home/ec2-user/projects/Board-project/
sudo yum install mariadb-client
vi src/main/resources/application.properties
spring.datasource.driver.class.name=org.mariadb.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root1234
spring.datasource.url=jdbc:mariadb://board-db.clk0weis8g03.ap-northeast-2.rds.amazonaws.com:3306/board-db?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8
hibernate.dialect=org.hibernate.dialect.MariaDBDialect
hibernate.connection.url=jdbc:mariadb://board-db.clk0weis8g03.ap-northeast-2.rds.amazonaws.com:3306/board-db??createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8
(UTF-8 오류를 위해 추가적인 설정 명령어를 붙였지만 실제 반영이 되지 않았다)
:wq
mysql -h board-db.clk0weis8g03.ap-northeast-2.rds.amazonaws.com -uroot -proot1234
이후에 이제 DB 쿼리를 입력해주면 된다. 워크벤치 연동에 실패했기에 직접 한줄 씩 쿼리문을 쳤다(다음엔 꼭 성공할 것이다..)
create table을 하고 나서
use board;
DELIMITER $$
CREATE PROCEDURE testDataInsert()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 120 DO
INSERT INTO board(title, content)
VALUES(concat('제목',i), concat('내용',i));
SET i = i + 1;
END WHILE;
END$$
DELIMITER $$
call testDataInsert;
//이걸 한 줄씩 입력
db 만들고 나서 결과
Git 저장소에서 최신 코드를 가져오고, 프로젝트를 빌드 및 실행하는 과정을 요약
git pull //중간에 내용 바꾸면 다시 최신화
gradle build
gradle bootrun
bootrun을 성공하면
이런 화면이 뜰 것이다. 그럼 성공!
결과
내 로컬이 아닌 배포한 온라인 서버에서 게시판 사이트에 접속하는 것이 가능해졌다.
직접 글 작성을 해보자.
글 작성이 되는 것을 확인해보았다. 내용을 보자.
이렇게 글을 적는 것이 가능해졌다.
다시 삭제까지 완료하였다. 여기까지 게시판 실습을 이제 마무리하겠다.
EC2를 중지했다가 다시 키면 IP 주소가 바뀌기 때문에 탄력적 IP를 쓰거나 웹 서버를 재시작해줘야 다시 정상작동한다.
프론트적인 UI보단 기능에 더 초점을 두었고 다음 프로젝트에선 도커와 cicd 등 개발에 효과적인 툴도 사용할 것이고 UI적으로도 이쁘게 하여 운영을 해볼 것이다
개발부터 배포까지 직접 해본 이 경험은 정말 소중하다고 생각한다. 더 발전해나가자.
인생에서 가장 큰 영광은 넘어지지 않는 것에 있는 것이 아니라 매번 일어선다는 데 있다. (넬슨 만델라)
'Backend > Spring Boot' 카테고리의 다른 글
lombok이란? (2) | 2024.09.03 |
---|---|
MVC 패턴 (63) | 2024.08.18 |
spring-boot-devtools 라이브러리를 통한 핫 리로드 활성화 (35) | 2024.07.24 |
Maven과 Gradle (18) | 2024.06.19 |
스프링부트와 aws 활용한 게시판 구축과 배포 -1 (61) | 2024.05.27 |