지금까지 만든 프로젝트를 AWS에 배포하는 과정을 알아보겠습니다. EC2 생성, 탄력적 IP 등등 기본적인 내용은 아래 링크에서 확인 부탁드립니다.

사용되는 ec2는 ubuntu로 진행했습니다.

https://dingdingmin-back-end-developer.tistory.com/entry/AWS-EC2-%EC%83%9D%EC%84%B1-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EA%B3%BC%EC%A0%95%EC%9D%80-%EC%83%9D%EB%9E%B5?category=904393 

 

AWS EC2 생성 (회원가입 과정은 생략)

1. AWS에 로그인한 후 EC2를 검색하여 클릭해준다. 2. 인스턴스 생성을 클릭해준다. 3. Amazon linux 2를 사용할 예정이므로 Amazon linux2로 시작한다. 4. 프리티어는 일정한 사용량 밑으로는 요금이 무료이

dingdingmin-back-end-developer.tistory.com

https://dingdingmin-back-end-developer.tistory.com/entry/AWS-EC2-%ED%83%84%EB%A0%A5%EC%A0%81-IP?category=904393 

 

AWS EC2 탄력적 IP

탄력적 IP 할당하기 탄력적 IP를 사용하는 이유는 무엇일까?? 예시로 살펴보겠습니다. 기존에 생성했던 ec2 인스턴스 입니다. 퍼블릭 IP 주소는 3.34.52.45입니다. 해당 인스턴스를 중지 시키고 재가

dingdingmin-back-end-developer.tistory.com

https://dingdingmin-back-end-developer.tistory.com/entry/AWS-EC2-%EC%B4%88%EA%B8%B0-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0?category=904393 

 

AWS EC2 초기 설정하기

AWS EC2의 초기 설정을 진행하겠습니다. 추후에 Spring Application을 배포할 예정입니다. ▶ 가장 먼저 java 8을 설치 1. 자바 8을 설치합니다. sudo yum install -y java-1.8.0-openjdk-deve1.x86_64 // java 8..

dingdingmin-back-end-developer.tistory.com


1. 기존 프로젝트에서 수정할 사항이 있어서 수정하겠습니다. 

  • buildgradle에서 mysql 관련 의존성을 추가합니다. 
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'mysql:mysql-connector-java'       //추가 
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
  • application.yml의 기존 내용은 다른 곳에 복사해둔 뒤 아래와 같이 변경해줍니다. 
spring:
  profiles:
    include: real-db
application.yml은 보안적인 부분이 포함될 수 있습니다. 지금과 같이 내부에 mysql을 설치하여 사용할 수도 있지만 AWS의 서비스 중의 하나인 RDS의 설정 정보, Oauth2의 보안 사항이 들어갈 수도 있기 때문에 git에 올리지 않는 경우가 많습니다. 따라서 서버 내에 별도의 yml 파일을 만듭니다.

 

  • EC2에 yml 파일을 하나 만듭니다. 아래 명령어를 실행합니다. 
vim application-real-db.yml
  • 그리고 저희가 복사해두었던 내용을 복사붙여넣기 합니다. 저의 경우 /home/ubuntu/app 경로에 yml 파일이 있습니다.
  • username: mysql에 권한을 부여받은 유저 아이디 입니다.
  • password: mysql에 권한을 부여받은 유저의 비밀번호입니다.
  • url: EC2내부에 있으므로 localhost:3306/league(DB이름)이고 뒤에는 세부 설정입니다.

 

2. EC2에 Mysql을 설치해줍니다.

1. sudo su

2. apt get update

3. sudo apt install mysql-server (아래와 같이 설치되며, 중간에 y를 눌러줍니다.)

4. mysql -u root -p (초기 비밀번호는 없습니다. enter 눌러줍니다.)

  • database를 만들어줍니다. table은 처음 실행시킬 때 ddl-auto: create로 해놨기 때문에 생성됩니다. (추후에 none으로 바꿔야 합니다.) -> ddl-auto: create는 프로젝트가 실행될 때 table을 모두 내려놓고, 다시 만드는 설정입니다.
  • create database league; 입력합니다.
  • show databases;를 입력하여 생성됐는지 확인합니다.

 

5. mysql 유저를 생성해줍니다.

  • create user 'admin'@'%' identified by 'kim2299'; (application.yml에 적었던 username과 password를 적어줍니다.)

6. 유저에게 권한 부여

  • grant all on league.* to 'admin'@'%'; ( database:league username:amdin으로 모든 권한 줍니다.)

3. git clone으로 프로젝트 다운로드하기

1. mkdir app 을하여 디렉터리를 만들어줍니다.

2. cd app 하여 이동합니다.

3. git clone '주소'를 해줍니다.

 

4. cd blogProject 이동후 build를 해줍니다.

  • sudo chmod 777 ./gradlew (권한 부여입니다.)
  • sudo./gradlew build -x test (테스트 코드는 실행하지 않습니다. 약간의 시간이 소요됩니다.)


5. 만든 application.yml을 설정 파일로 해서 프로젝트 백그라운드로 실행하기

  • 현재 application.yml은 없는 상태입니다. 그래서 -Dspring을 이용하여 저희가 만든 application.yml을 주입시켜주고 백그라운드로 실행합니다. 자동으로 생성된 nohup.out는 로그를 담고 있습니다. 
  • nohup: 프로세스나 쉘을 실행할 수 있습니다. 
  • -Dspring: 저희는 application-real-db.yml을 프로젝트 내부 파일이 아닌 외부에서 가져옵니다. 이에 대한 경로를 주입을 해주는 설정입니다.
  • classpath:/ -> 원래 application.yml이 담겨있던 resources에서 시작합니다. 거기에는 application.yml이 담겨 있으며 profiles:
      include: real-db가 있으므로 ,를 찍고 application-real-db.yml의 파일이 있는 절대경로를 입력해줍니다.
  • 맨 마지막에 &를 해줘야 session을 끊어도 프로젝트가 백그라운드로 실행됩니다.
nohup java -jar -Dspring.config.location=classpath:/application.yml,/home/ubuntu/app/application-real-db.yml league-0.0.1-SNAPSHOT.jar 2>&1 &

   

 

6. Postman test

  • localhost가 아닌 aws의 ip로 요청을 보냅니다. 

 

  • mysql DB에 잘 들어왔는지 확인해줍니다. ( mysql -u root -p -> use league; -> select * from user;)

잘 들어온 것을 볼 수 있습니다. 

7. 주의점!! application-real-db.yml에 만들었던 설정은 ddl-auto: create입니다. 이것을 바꾸지 않으면 서버가 재실행될 때마다 테이블이 drop 됐다가 생성되므로 DB의 내용이 사라집니다. 확인해보겠습니다.

1. pgrep -f jar -> jar로 실행되는 pid 번호를 찾습니다.

2. kill -9 {pid} 강제 종료됩니다.

3. 다시 실행하겠습니다.

4. mysql DB에 접속하여 이전에 회원가입했던 정보가 남아있는지 확인해보겠습니다.

비어있는 걸 확인할 수 있습니다. 

8.application-real-db.yml을 다음과 같이 변경하고 재실행해보겠습니다.

 

spring:
  datasource:
#    url:
#    username: sa
#    password:
#    driver-class-name: org.h2.Driver
    url: jdbc:mysql://localhost:3306/league?serverTimezone=UTC&characterEncoding=UTF-8
    username: admin
    password: kim2299
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: none  # 변경 부분
    properties:
      hibernate:
        format_sql: true
        default_batch_fetch_size: 100



server:
  error:
    include-message: always
    include-stacktrace: always

logging:
  level:
    org.hibernate_SQL: debug

10. 회원가입을 진행하고 서버를 종료했다가 재실행해도 mysql DB에 데이터가 남아있는지 확인

  • 회원 가입 진행

  • DB 확인

  • 서버 종료 후 재실행 (pgrep -f jar -> kill -9 {pid} 강제 종료 서버 재실행)
  • Postman으로 동일한 회원가입 진행 시 오류

  • DB 확인

서버를 종료했다가 실행해도 잘 남아있는 것을 볼 수 있습니다. 따라서 ddl-auto 속성은 운영서버에서 반드시 none으로 해주셔야 합니다.

지금까지 SpringBoot 프로젝트를 처음부터 끝까지 만들고 배포까지 진행해봤습니다. 부족한 부분이 많았지만 읽어주셔서 감사합니다. 

 

모든 코드는 아래 링크에서 확인 가능합니다.

https://github.com/rlaehdals/blogProject

 

GitHub - rlaehdals/blogProject

Contribute to rlaehdals/blogProject development by creating an account on GitHub.

github.com