AWS

샘플 프로젝트 배포

JJJAEOoni 2022. 4. 7. 02:35
반응형

지금까지는

 

RDS 생성

root

root1234!

포트 개방 3306

외부 액세스 가능 설정

 

EC2 생성

 포트 개방 8080

 

 

끝!

 

샘플 프로젝트 만들어서 연결하고 배포해보자.

 


 

프로젝트를 생성하고

개발용 yml(dev)과 배포용 yml(prod) 두 개를 만들 것이다.

 

이름을 지을 때 하이픈(-)이 프로토콜이고

이름은 마음대로 적어도 된다.

 

 

이전에 yml 파일을 하나만 만들었을 때 로그를 자세히 봤다면

프로파일이 설정되지 않았다고 경고 로그가 뜬 걸 봤을 것이다.

 

스프링을 실행할 때 어떤 설정 파일을 사용할지를 정하지 않았기 때문에 뜬 것이다.

 

application.yml 파일에서 사용할 설정파일을 설정해주자.

 

dev 파일을 사용하겠다고 설정하면 dev 설정파일을 찾을 것이다.

개발할 때는 dev, 배포할 때는 prod 사용!!

 

spring:
  profiles:
    active:
    - dev

 

- dev라고 적은 것처럼

yml에서 -가 있다는 것은 그게 배열이라는 것이다.

여러 개를 담을 수 있다.

 

application-dev에는 이전에 사용했던 yml을 붙여 넣어준다.

 

server:
  port: 8080
  servlet:
    context-path: /
    encoding:
      charset: utf-8
    session:
      timeout: 30

spring:
  mustache:
    expose-session-attributes: true
  datasource:
      url: jdbc:mariadb://localhost:3306/greendb 
      driver-class-name: org.mariadb.jdbc.Driver
      username: green
      password: green1234

  jpa:
    open-in-view: true
    hibernate:
      ddl-auto: create
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    show-sql: true
    properties:
      hibernate.format_sql: true

  output:
    ansi:
      enabled: always

 

dev는 로컬 환경이라 맞지만

prod는 EC2에 배포되고 나서는 데이터베이스 환경이 localhost가 아닌

액세스 주소를 넣어줘야 한다.

 

IP 주소 넣어주는 것보다 도메인 주소를 넣어주는 게 좋다.

헤이디 사용할 때 넣어줬던 엔드포인트 주소!

 

server:
  port: 8080
  servlet:
    context-path: /
    encoding:
      charset: utf-8
    session:
      timeout: 30

spring:
  mustache:
    expose-session-attributes: true
  datasource:
      url: jdbc:mariadb://database-1.cgpr3ybkrki6.ap-northeast-2.rds.amazonaws.com:3306/greendb 
      driver-class-name: org.mariadb.jdbc.Driver
      username: green
      password: green1234

  jpa:
    open-in-view: true
    hibernate:
      ddl-auto: create
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    show-sql: true
    properties:
      hibernate.format_sql: true

  output:
    ansi:
      enabled: always

 

 

이전에 사진 업로드할 때 

/upload/ 라고 한다면

윈도우라면 C:\upload/ 를 잡고

리눅스라면 /home/ubuntu/upload/ 를 잡는다.

 

배포 전에는 /upload/라고 적으면 되고

테스트가 다 끝나면 배포 환경에서  /home/ubuntu/upload/ 이렇게 바뀌어야 한다.

 

실제로 사진을 업로드하진 않을 거지만 경로 테스트하기 위해 이렇게 작성해보자.

application-dev.yml에 해당 코드를 넣어주면 C드라이브에 해당 경로를 잡을 것이다.

 

pic:
  path: /upload/

 

application-prod.yml 에는 아래 코드를 추가해준다.

pic:
  path: /home/ubuntu/upload/

 

일단 이대로 서버를 실행시켜 디비에 연결이 잘 되는지 확인해보자.

 

 

잘 실행된다.

Ctrl + C로 서버를 종료하고 서버를 만들어보자.

 

package site.metacoding.greenaws;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private Integer price;
}
package site.metacoding.greenaws;

import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Integer> {

}

 

이제 응답을 위한 Dto를 따로 만들지 않고

ResponseEntity 객체를 사용해줄 것이다.

 

원래처럼 1, -1로 응답하지 않고

Http 상태 코드로 응답할 수 있다.

 

이미지 경로를 리턴해줄 건데

dev에서 실행했을 때와 prod에서 실행했을 때를 다르게 하기 위해

yml에 있는 property 값을 끌어올 수 있는 어노테이션이 @Value이다.

 

내가 프로파일을 어떻게 설정하는지에 따라 값이 다르게 나올 것이다.

 

package site.metacoding.greenaws;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@RestController
public class ProductController {
    private final ProductRepository productRepository;

    // 이렇게 해야 배포용과 개발용 경로를 다르게 할 수 있음
    @Value("${pic.path}") // application.yml에 있는 property 값을 끌어올 수 있음
    private String path;

    // 경로 테스트
    @GetMapping("/image")
    public ResponseEntity<?> image() {
        return new ResponseEntity<>("이미지 저장 경로 : " + path, HttpStatus.OK);
    }

    @GetMapping("/")
    public ResponseEntity<?> home() {
        return new ResponseEntity<>(productRepository.findAll(), HttpStatus.OK);
    }

    @PostMapping("/product")
    public ResponseEntity<?> save(Product product) {
        return new ResponseEntity<>(productRepository.save(product), HttpStatus.CREATED); // 201
    }
}

 

우선 서버를 실행한 후 이미지 경로부터 확인해보자.

 

포스트맨에서 두 번 post 요청해서 saveAll 해주고 테스트해보자.

 

 

 

서버 테스트는 끝났고 이제 배포만 하면 끝이다.

 

그전에 RDS에 연결되었는지 확인해보자.

 

 

데이터베이스도 없고 사용자도 없기 때문에 헤이디에서 직접 만들어줘야 한다.

 

CREATE USER 'green'@'%' IDENTIFIED BY 'green1234';
CREATE DATABASE greendb;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'green'@'%' WITH GRANT OPTION;

 

yml 파일에 create로 테이블을 한번 만들어놓으면

prod 파일에는 반드시 none으로 바꿔놔야 한다.

 

다시 postman으로 데이터를 집어넣고 잘 들어왔는지 확인해보자.

 

다 확인했으면 깃허브에 push 해줄 건데

push 해주기 전에 접근권한을 바꿔주자.

 

 

이제 깃허브에 push 해준다.

 

이제 EC2에서 git clone 하면서 똑같이 반복해보자.

 

 

sudo apt update
sudo apt-cache search jdk | grep jdk
sudo apt install openjdk-11-jdk
git clone https://github.com/jaewon2336/green-aws.git
cd green-aws/
ls
ls -l
chmod +x ./gradlew
ls -l
./gradlew clean build

 

build 할 때 다음부터는 clean build를 사용하자.

기존에 있는 jar파일을 삭제하고 다시 만들어준다.

충돌이 날 수 있기 때문에 clean build를 사용하자.

 

 

spring web 라이브러리가 톰캣을 내장하고 있기 때문에

톰캣은 따로 설치하지 않아도 된다.

 

근데 build fail이 떴다.

 

 

jar를 구울 때 maven이랑은 다르게 gradle은 test 코드(@Test)가 무조건 필요하다.

 

빌드하기 전에 테스트를 하고 빌드를 하기 때문에 fail이 뜬 것이다.

 

테스트 생략하고 jar로 구우라는 옵션이 있다.

설정해주자.

./gradlew clean build -x test

 

ls로 확인해보니 build 폴더가 생성되었다.

이 폴더 안에 libs 폴더안에 jar파일이 구워져 있다.

 

 

옆에 있는 jar파일은 의존성이 연결되어 있지 않은 plain 파일이니 신경 쓰지 않아도 된다.

 

jar파일을 실행하면 미국 시간에 맞춰져 있기 때문에 시간이 맞지 않다.

맞춰줘야 한다.

 

 

timedatectl
sudo timedatectl set-timezone Asia/Seoul

 

 

잘 바꿔졌다.

 

이제 nohup으로 실행하면 끝이다.

 

이때 -Dspring.profiles.active=prod 라고 걸어줌으로써

application.yml 파일을 보는 게 아니라 바로 application-prod.yml 파일을 읽어서 실행한다.

굳이 내가 직접 바꿔주지 않아도 되는 것이다.

 

nohup java -jar -Dspring.profiles.active=prod ./green-aws-0.0.1-SNAPSHOT.jar &

 

 

백그라운드로 잘 돌아가고 있는지 확인해보자.

 

ps -ef

 

프로세스 아이디가 16644로 돌고 있는 것이다.

 

더 확실히 보기 위해서는 웹에서 요청 한번 해보면 된다.

 

 

끝!!

 

로그가 보고 싶으면

cat nohup.out
tail -f nohup.out

 

 

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형