1. 배포 방법
1) ./gradlew build : gradle 과 maven 을 활용해 애플리케이션을 빌드할 수 있다. /build/libs 경로에 빌드파일이 생성된다.
2) 빌드파일 종류
- SNAPSHOT.jar : 배포용
- SNAPSHOT-plain.jar : 라이브러리용
# 라이브러리로 활용하는 예시
implementation files('SNAPSHOT-plain.jar')
3) 빌드 파일 실행
// 터미널 명령어
java -jar <빌드파일이름>
java -jar build/libs/baisc-0.0.1-SNAPSHOT.jar
4) 배포 환경
- 로컬(local) : 개발자 개인 컴퓨터 환경
- 개발(dev) : 팀 내 통합된 코드의 기능을 확인하기 위한 환경
- 스테이지(stage) : 운영 환경과 동일한 인프라, QA 팀에서 테스트를 진행하는 환경
- 운영(prod) : 실제 운영 환경
5) 환경별 설정 파일 - Profiles
- 공용 설정 파일 : application.yml
# 기본 활성화 프로파일 설정
spring:
profiles:
active: local
- Local 설정 파일 : application-local.yml
spring:
datasource:
url: jdbc:mariadb://localhost:3306/데이터베이스명
username: root
password: Test1234!
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
- Prod 설정 파일 : application-prod.yml
spring:
datasource:
url: jdbc:mariadb://localhost:3306/prod_db
username: root
password: Test1234!
jpa:
hibernate:
ddl-auto: none # 운영 환경에서는 스키마 변경 금지
show-sql: false # 운영 환경에서는 SQL 출력 비활성화
server:
port: 8000
※ 설정 적용 우선순위 : 명령어(환경변수) > application-{환경}.yml > application.yml
6) 프로파일을 활용한 배포 방법 (터미널 명령어)
java -jar <파일이름> --spring.profiles.active=local
java -jar build/libs/baisc-0.0.1-SNAPSHOT.jar --spring.profiles.active=local
2. 배포 실습 - 트러블 슈팅
< 문제 상황 >
/.gradlew build 를 한 후 로컬 프로파일을 활용해 배포를 시도했으나 APPLICATION FAILED TO START
< 문제 원인 >
port란?
- TCP나 UDP에서 어플리케이션이 상호구분을 위해 사용하는 번호로, IP 내에서 프로세스 구분을 하기 위해 사용한다.
즉, 프로토콜의 데이터가 통하는 논리적 통로이다. 이 port number는 한 번에 하나의 서버만 이용할 수 있으며 중복될 수 없다.
포트 넘버는 중복되면 안된다는 것을 까먹고 프로파일 설정 파일 세 개 모두 서버를 8080이라고 지정해놨다. 인텔리제이 어플리케이션이 실행 중이어서 8080 서버는 이미 내 컴퓨터에선 사용중이었는데, 다른 서버도 8080을 사용하려고 하니 에러가 난 것이었다.
< 문제 해결 >
인텔리제이 실행을 중단하고, 서버를 모두 다른 포트로 지정해주니 정상적으로 작동되는 것을 확인할 수 있었다.
Opinion
실제 서버를 배포하기도 전부터 에러가 나서 굉장히 당황했지만.. 내가 백엔드를 배우고 나서 실제로 내 코드로 만든 무언가가 배포된다는 것이 설레기도 했다. 네트워크 관련으로 습득해야 하는 지식이 너무나도 방대해서 겁이 나지만 늘 처음엔 내가 여기까지 해낼 수 있을 줄 모르고, 겁먹었어도 해냈던 것을 기억하면 이번에도 자신감을 얻을 수 있다!