이번에는 Springboot기반의 쇼핑몰 프로젝트를 EC2를 이용해서 배포해 보았다. 중간 중간에 발생하는 에러가 굉장히 많았지만, Stackoverflow와 많은 블로그를 참고해가며 해결했다. 후에 도움이 될 것같아 과정 설명을 해보겠따.
전체적인 flow -> EC2에 직접 mysql을 설치한 후, springboot와 연동하고, war파일을 이용해서 배포한다.
😊배포 준비 환경
- AWS EC2 ubuntu20.04
- jdk 11
- Springboot + Maven
- jsp
- Mysql
1. 로컬에서 Ubuntu Mysql 접속, 관리하기
이 단계는 선택적으로 해도 되고 안해도 되지만, 본인의 경우 로컬에서 HeidiSQL을 사용해 원격 DB를 관리하고자 진행했다.
1-1) ubuntu mysql 외부 접속하기
Reference : https://ujin-dev.tistory.com/15
1-2) 1단계 완료 후 ubuntu에서 mysql접속 시 Access denied for user 'root'@'localhost'가 발생하면 다음을 참고한다.
Reference https://wakestand.tistory.com/495
1-1 과정을 조금 더 설명하자면 다음과 같다.
- EC2의 mysql 설정 파일에 들어가 bind-address를 주석처리함으로써 모든 외부 포트에 대해 접속을 허용해준다.(bind-address란 데이터베이스 서버가 어떤 주소로의 요청을 허용할 것인지 설정하는 것인데, 이를 주석처리 했으므로, 모든 트래픽에 대해 요청을 허용한다는 의미이다.)
- mysql에 접속하여 다음과 같이 SQL문을 적어준 것은, 외부에서 root라는 이름을 갖고 접속할 수 있도록 권한을 부여한 것이다.
1
2
|
create user 'root'@'%' identified by '{password}';
grant all privileges on *.* to 'root'@'%' with grant option;
|
cs |
이제 아래와 같이 호스트명에 퍼블릭IP, 사용자에 root, 암호에는 위 1-1과정에서 설정한 password를 입력하여 로컬에서 원격 DB에 접속할 수 있게 된다.
2. 프로젝트 내 로컬 경로로 되어있던 URI를 모두 호스팅 서버 주소로 변경
로컬에서 개발한 프로젝트를 서버에 올릴 때에는 IP주소가 달라지다 보니깐 수정해야 될 것이 생긴다. 일단 본인의 경우 바꿔줘야 했던 것들은 다음 4가지였다.
- application.yml > datasource url, username, password
- application.yml > 이미지 업로드 폴더 경로
- application.yml > 소셜로그인 redirect-uri
- 기타 js파일에 명시한 로컬로 redirect했던 uri
1의 경우는 원격DB에 접속하니 당연히 바꿔줘야 한다. 다음과 같이 url에는 호스팅IP를, username과 password는 앞서 mysql에서 설정했던 계정을 입력한다.
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://3.39.81.107:3306/shop?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul
username: root
password: 1234
3의 경우는 oauth2의 소셜로그인을 구현할 때 작성했던 redirect-uri가 기존 로컬로 작성되었기 때문에 바꿔줘야 한다. 본인은 google, naver, kakao 각각의 uri를 수정했다. 아래 블로그를 참고하면 쉽게 바꿀 수 있다.
Reference: https://ironmask43.tistory.com/25
3. war파일로 빌드 및 원격서버로 파일 전송
기본적으로 jar, war 모두 java의 jar옵션(java -jar)을 이용하여 생성된 압축파일로, 애플리케이션을 쉽게 배포할 수 있도록 관련 파일을 패키징한 것이다.
처음에는 jar로 빌드를 한 후, 로컬에서 서버를 돌리니 Whitelabel Error Page문제가 발생했다.
내장된 톰캣 패키지에는 기본적으로 jsp가 포함되어 있지 않기 때문이라고 한다. jsp로 화면 구성을 했기 때문에 문제가 발생한 것이다.
war을 사용하기 위해서 pom.xml에 다음 의존성을 추가하자.(마지막 line)
<groupId>com.likelion</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging> <!--war로 작성 -->
이제 다음 명령어로 본인의 프로젝트 폴더에서 터미널로 빌드를 한다면,
mvnw clean package
위와 같이 BUILD SUCCESS가 뜨면서 빌드가 성공했다는 문구가 뜬다.
동시에 프로젝트 폴더 하위 target폴더에 {파일명}.war 파일이 생성된 것을 확인할 수 있다.
2번까지 진행했다면, war패키징 파일은 현재 로컬에 있는 상태일 것이다. 우리는 war파일을 가지고 배포를 할 것이기 때문에 이는 EC2의 원격서버에 보내야한다. 파일 전송을 위한 프로그램들이 많이 있지만 본인의 경우 FileZilla를 사용했다.
FileZilla를 설치한 후 왼쪽 상단 파일 -> 사이트 관리자를 열어 다음과 같이 원격서버의 정보를 적어주면 쉽게 연결이 가능하다. (당연히 EC2서버는 실행 중이여야 한다.)
프로토콜은 SFTP로 설정, 호스트에 EC2 IP, 키 파일에는 .ppk 형식의 EC2 인스턴스 키 파일 경로를 적는다.
아래와 같이 로컬의 war파일을 원격 서버의 원하는 경로에 업로드한다.(본인의 경우 /home/ubuntu/에 업로드했다.)
4. 서버 실행
모든 준비가 끝났다. war파일이 있는 경로로 간 다음, 아래의 명령어로 서버를 실행시켜보자.
java -jar {파일명}.war
퍼블릭IP주소:8080포트로 들어가면, 정상적으로 웹 서버가 구동되는 것을 확인할 수 있다!!
데이터베이스의 경우 application.yml 설정파일에 Spring.jpa.hibernamte.ddl-auto 옵션을 create로 했기 때문에 애플리케이션 실행 시 자동으로 원격에 테이블이 생성된 모습을 볼 수 있다.(처음 테이블을 만들 경우 원치 않은 테이블이 생성될 수 도 있기 때문에 직접 SQL쿼리로 만드는 것을 권장한다고 한다.)
후기..
사실 이 과정이 한번에 되지는 않았다. 빌드 후에 배포를 했을 때 파일 경로문제, uri, db connection에러가 계속 뜨면서 날 괴롭게 했지만, 원인을 파악하고 해결을 해보면서 전체적인 flow가 잡힌듯 하다. 지금은 docker-compose를 사용해서 docker내에 mysql컨테이너와 application컨테이너를 묶어서 관리한 후에, EC2서버에 배포가 가능하게 해보고 있다.(에러에 막히는중..)
'Projects > 쇼핑몰 프로젝트' 카테고리의 다른 글
Can not issue data manipulation statements with executeQuery() 에러 해결 (0) | 2023.03.30 |
---|---|
트랜잭션 스크립트 패턴 > 도메인 모델 패턴으로 변환해보기 (0) | 2023.03.03 |
[JUnit] Spring Security 로그인 테스트 (0) | 2023.02.27 |
[장바구니] 장바구니 기능구현(상품추가, 수량변경) (0) | 2023.01.13 |
[주문] 아임포트 결제 & 결제 성공 시 주문 로직 구현 (4) | 2023.01.09 |
댓글