프로젝트 연습 깃 주소
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에 설정되어야 되는 포트 번호이다.
여기서 특정 조건을 튕겨낼 수 있다.