Search

#012 #SSR 배포

프로젝트 연습 깃 주소

ssr-deploy.git
kdit-2024

1. 프로젝트 정리

//settings.gradle 설 rootProject.name = 'blog'
Java
복사
//build.gradle설정 version = '1.0'
Java
복사
통합 테스트 코드가 필요 (나중에 배움)
Java
복사
// application.yml 설정 spring: profiles: active: - dev
Java
복사
//application-prod.yml 설정 server: servlet: encoding: charset: utf-8 force: true session: tracking-modes: cookie port: 5000 spring: mustache: servlet: expose-session-attributes: true expose-request-attributes: true datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://${RDS_HOSTNAME}:${RDS_PORT}/${RDS_DBNAME} username: ${RDS_USERNAME} password: ${RDS_PASSWORD} jpa: hibernate: ddl-auto: none properties: hibernate: default_batch_fetch_size: 10 open-in-view: true logging: level: '[shop.mtcoding.blog]': INFO
Java
복사
// RuntimeException이 터지면 해당 파일로 오류가 모인다 @Slf4j @ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(Exception400.class) public String ex400(Exception400 e, HttpServletRequest request){ request.setAttribute("msg", e.getMessage()); log.warn("400 : "+e.getMessage()); return "err/400"; } @ExceptionHandler(Exception401.class) public String ex401(Exception401 e, HttpServletRequest request){ request.setAttribute("msg", e.getMessage()); log.warn("401 : "+e.getMessage()); log.warn("IP : "+request.getRemoteAddr()); log.warn("IP : "+request.getHeader("User-Agent")); return "err/401"; } @ExceptionHandler(Exception403.class) public String ex403(RuntimeException e, HttpServletRequest request){ request.setAttribute("msg", e.getMessage()); log.warn("403 : "+e.getMessage()); return "err/403"; } @ExceptionHandler(Exception404.class) public String ex404(RuntimeException e, HttpServletRequest request){ request.setAttribute("msg", e.getMessage()); log.info("404 : "+e.getMessage()); return "err/404"; } @ExceptionHandler(Exception500.class) public String ex500(RuntimeException e, HttpServletRequest request){ request.setAttribute("msg", e.getMessage()); log.error("500 : "+e.getMessage()); return "err/500"; } }
Java
복사

2. 빌드 빛 실행하기

./gradlew clean build // build/libs 내부 폴더를 비우고 다시 jar 파일 굽기
Java
복사
./gradlew clean build -x test // 이거는 테스트를 하지 않고 빌드
Java
복사

실행하고 나서 이미지 폴더 옮기기

dev모드로 실행해보기

java -jar build/libs/blog-1.0.jar
Java
복사

prod 모드로 실행해보기

java -jar -Dspring.profiles.active=prod build/libs/blog-1.0.jar
Java
복사
prod모드로 실행하면 터지는 이유는?? prod로는 로컬에서 테스트를 해보지 못한다. db도 다르고 환경변수도 맞지 않기 때문에

CI/CD 시각화자료

3. 배포 준비 파일 만들기

// procfile 내부 설정 - yml모드를 prod모드로 바꾸기 위한 스크립트 web: java -jar -Dspring.profiles.active=prod application.jar
Java
복사
해당 압출 파일을 엘라스틱빈스톡에 전달하면 1. /var/current/app 이라는 폴더에 압축을 푼다. 2. jar 파일명을 application.jar로 변경한다. 3. Procfile을 실행한다.

4. IAM 생성

ec2-role 생성 해야 한다. (IAM)
Java
복사

5. RDS 보안 그룹 생성하기 ( 그룹명 rds-group )

엘라스틴 빈 스톡 3306 허용은 ELB를 만들고 추가해야 된다.
Java
복사
탄력적 IP를 로드밸런서에 걸어야 된다.
dns에 걸어야 된다. → 단일진입점
api를 사용할려면 그 서버에 내 애플리케이션을 등록을 해줘야 된다.
하지만 문제점은 재배포 할 때 ID가 달라진 다는 것
그래서 LB의 IP를 등록 해야된다.
리버스 프록시의 역할을 한다. → 로드 밸런서
그래서 LB가 유동IP를 만들주면 안되고, 엘라스틱 빈스톡으로 고정IP를 잡아서 api 서비스를 제공하는 곳에 등록 해야 된다.
로드 밸런서의 DNS이름이 LB의 IP이다.
이것이 단일 진입점의 주소라고 생각하면 된다.

HTTPS는 시큐리티가 적용되어있다는 프로토콜

HTTP는 RSA암호화가 되어있지 않은 프로토콜이므로 이런 사이트를 사용하면 모든 정보가 다 털릴 수 있다.

대상그룹으로 전달

HTTP:80 으로

보안그룹

어느 아이피와 포트를 허용할지 검증하는 그룹

상태검사 경로가 구현이 되어있어야 된다.

삭제하는 방법!!!

DB삭제 먼저 RDS

엘라스틱 빈스톡 환경삭제

배포준비

rootProject 이름 설정

build.gradle 버전 설정 ⇒ 최초배포 1.0

resouces에 yml이 있어야 됨

통합 테스트 코드 필요

리눅스 변수 컨벤션

로그를 파일로 만든다.

여기에 스프링의 로그가 다 남겨져있다. (EC2에 저장되어 있다.) 경로찾아가서 확인!!

패키지 내부의 info만 캐치하겠다는 뜻.

jar파일 굽기

이 코드는 테스트 코드를
image 폴더를 blog-1.0.jar 파일 옆에 둬야 된다. 프로덕션 모드도 반드시 확인 해줘야 된다. OS에서도 환경이 안맞아서 안 될 수 있다.

prod모드로 빈스톡에서 실행이 되어야 하는데 그걸 설정하는 방법

java -jar -Dspring.profiles.active=prod blog-1.0.jar
Java
복사
web: java -jar -Dspring.profiles.active=prod *.jar
Java
복사

RDS 보안그룹 생성하기

ELB 3306 허용은 ELB 생성후에 추가해야된다.

RDS 생성

erc2-role 생성 (IAM으로 ) - 우리는 했으니 생략 가능!

원격 접속 테이블 생성

create table board_tb ( id integer auto_increment, user_id integer, created_at timestamp(6), content varchar(255), title varchar(255), primary key (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; create table reply_tb ( board_id integer, id integer auto_increment, user_id integer, created_at timestamp(6), comment varchar(255), primary key (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; create table user_tb ( id integer auto_increment, created_at timestamp(6), email varchar(255), password varchar(255), username varchar(255) unique, primary key (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; alter table board_tb add constraint FKgxwryj58kh66twbp656wo5gnn foreign key (user_id) references user_tb; alter table reply_tb add constraint FKjm6c1ap97ufy07pocvy5m64wj foreign key (board_id) references board_tb; alter table reply_tb add constraint FKps6o6lxgwm5loo2am532rgeuj foreign key (user_id) references user_tb;
Java
복사

ELB생성

호스트 네임 RDS→데이터베이스→ 엔드포인

80번은 뭘까??

sudo find / -name nginx*
Java
복사
서버 80으로 돌고 있구나
여기서 설정된 포트 번호가 prod에 설정되어야 되는 포트 번호이다. 여기서 특정 조건을 튕겨낼 수 있다.