Springboot 프로젝트의 Resources 디렉토리에보면 application.properties 또는 application.yml 파일이 있는데, 이 파일이 각종 환경 변수들을 정의하는 파일이다. 특히, application.yml 파일 하나로 로컬, 개발 및 운영서버 각각의 환경 설정이 가능하다. 여기서는 한개의 yml 파일과 각 서버에서 기동중인 Tomcat의 setenv.sh 파일을 이용해서 로컬/개발/운영을 분리 구성하는 방법을 사용했다.
공부차원에서 로컬에서만 개발하고 끝낸다면 굳이 필요 없는 설정이겠으나 어차피 결국은 운영환경에 Deploy 해서 서비스를 오픈할 때까지 개발을 하는 것이 최종 목표이니 본격적인 개발을 진행하기에 앞서 미리 환경을 구성해 놓는 것도 괜찮은 방법이다.
분리 구성 환경설정의 장점
미리 로컬 개발 운영을 분리해서 환경 설정을 해 놓게 되면 장점으로는, 환경 구분없이 로컬에서 gradle로 빌드한 뒤 개발 또는 운영서버의 WAS (여기서는 Tomcat)에 war 파일을 업로드하면 각 환경에 맞는 환경을 알아서 적용 하기 때문에 신경이 덜 쓰인다는 점과 (Jenkins와 같은 빌드/배포 툴을 이용할 때도 마찬가지), 오픈을 앞두고 운영서버 세팅하느라 오픈 직전에 진땀 뺄 일이 없다는 점 정도 될 것 같다.
로컬 및 서버 환경
로컬 환경: Windows + Springboot 내장(embedded) Apache Tomcat 9.0.65
개발 서버: Ubuntu 20.04.4 LTS + Apache Tomcat 8.5.79
운영 서버: N/A
시나리오
Spring 2.7.4 기반의 Springboot 어플리케이션을 로컬 Window에 설치된 Eclipse에서 개발 하였고, gradle을 통해 빌드 된 war 파일을 개발 서버에 배포.
분리환경 설정 방법
1. application.properties를 application.yml로 변환 (필요시)
이클립스에서 생성한 신규 Springboot 프로젝트를 보니 아래와 같이 application.properties라는 파일이 resources 폴더 밑에 생성이 되어 있는데, 이 파일을 우선 application.yml로 변경한다.
application.properties 파일을 우클릭해서 [Conver .properties to .yaml] 옵션을 선택. (기억에는 이런 옵션이 없는 경우 그냥 파일명을 강제로 바꿔도 무방 했던 것 같다.)
Refactoring 창이 뜨는데, 새로 생성한 프로젝트라서 아무런 내용도 없다. 바로 "OK" 클릭.
옵션 이름은 Convert to .properties to .yaml 이었지만 확인을 누르고 나서 변경된 파일명을 보면 우리가 원하는 .yml이다.
이렇게 간편하게 파일명을 변경했다. 사실 .properties로 구성된 파일을 yml로 알아서 바꿔주는 것이 convert의 핵심 기능인데 나는 처음부터 빈 파일을 확장자만 변경했기 때문에 굉장히 단순한 작업이 되었다.
2. application.yml 설정
application.yml 파일의 분리 환경 설정의 핵심은 --- 라고 볼 수 있다.
--- 를 통해서 각 환경별로 다른 설정 값을 적용할 수 있다.
2.1. 환경 구분 없이 사용할 설정 값들은 --- 전에 다 적는다.
# App Properties
spring:
profiles:
active: local
로컬/개발/운영의 구분이 필요 없는 프로퍼티 값들은 --- 전에 사용하면 된다. 위와 같이하면 기본적인 active profile은 local 환경이라는 뜻이고, 개발이나 운영서버에 이 프로젝트가 Deploy 되면 알아서 각 환경에 맞는 프로파일을 읽기 때문에 저렇게 둬도 걱정할 필요는 없지만 Eclipse와 같은 로컬에서 실행하는 IDE에 값을 설정해도 무방하다. 다만 application.yml에저렇게 해 두면, 소스를 통째로 다른 팀원과 공유하고 난 뒤 공유받은 사람은 별도로 IDE에서 설정할 것 없이 바로 로컬 PC에서 실행이 가능하다.
[참고] #은 application.yml에서 주석이다.
2.2. --- 을 통해 환경을 구분한다.
--- #local window
--- #development
--- #production
2.3. 각 환경 별로 profile 이름을 명시한다
--- #local window
spring:
config:
activate:
on-profile: local
--- #development
spring:
config:
activate:
on-profile: development
--- #production
spring:
config:
activate:
on-profile: production
2.4. contextPath나 port 등 server 관련 프로퍼티 값도 환경 별로 추가한다.
--- #local window
server:
servlet:
contextPath: /
port: 8282
--- #development
server:
servlet:
contextPath: /
port: 8280
--- #production
server:
servlet:
contextPath: /
port: 8281
2.5. DB 접속정보도 환경 별로 세팅해 준다.
spring:
datasource:
driverClassName: org.mariadb.jdbc.Driver
url: jdbc:mariadb://[로컬DB서버 주소]:[포트번호]/[DB명]?characterEncoding=UTF-8&serverTimezone=UTC
username: 계정
password: 비밀번호
로컬 DB는 사용하지 않고 개발 DB을 사용할 경우는 Local 환경 설정의 datasource에 개발 DB 정보를 입력하면 된다.
2.6. 로그 관련 설정도 환경별로 다르게 적용될 수 있는 요소다.
--- #local window
logging:
level:
root: DEBUG
--- #development
logging:
level:
root: INFO
--- #production
logging:
level:
root: ERROR
2.7. 파일 업로드 경로와 같은 값들도 Custom으로 추가해준다.
--- #local window
upload:
path: C:\TomcatUploads
--- #development
upload:
path: /var/webapps/upload
--- #production
upload:
path: /var/webapps/upload
로컬은 윈도우 환경이고 운영은 다른 경우 특히 유용하며, SNS 로그인 등 별도로 지정하고자 하는 프로퍼티 값들도 모두 application.yml 파일에 환경 별로 구성할 수 있다.
완성된 application.yml 파일
# App Properties
spring:
profiles:
active: local
--- #local window
server:
servlet:
contextPath: /
port: 8282
logging:
level:
root: INFO
spring:
config:
activate:
on-profile: local
datasource:
driverClassName: org.mariadb.jdbc.Driver
url: jdbc:mariadb://[로컬DB서버 주소]:[포트번호]/[DB명]?characterEncoding=UTF-8&serverTimezone=UTC
username: 계정
password: 비밀번호
upload:
path: C:\TomcatUploads
--- #development
server:
servlet:
contextPath: /
port: 8080
logging:
level:
root: info
spring:
config:
activate:
on-profile: development
datasource:
driverClassName: org.mariadb.jdbc.Driver
url: jdbc:mariadb://[개발DB서버 주소]:[포트번호]/[DB명]?characterEncoding=UTF-8&serverTimezone=UTC
username: 계정
password: 비밀번호
upload:
path: /var/webapps/upload
--- #production
server:
servlet:
contextPath: /
port: 8080
logging:
level:
root: info
spring:
config:
activate:
on-profile: production
datasource:
driverClassName: org.mariadb.jdbc.Driver
url: jdbc:mariadb://[운영DB서버 주소]:[포트번호]/[DB명]?characterEncoding=UTF-8&serverTimezone=UTC
username: 계정
password: 비밀번호
upload:
path: /var/webapps/upload
3. 개발 환경 Tomcat에 setenv.sh 생성
로컬에서 위의 프로퍼티로 세팅된 springboot 앱의 war를 tomcat/webapps 경로 아래에 업로드를 하게 되면 Tomcat이 자동으로 Deploy를 시작하는데 이때 setenv.sh 라는 파일이 tomcat/bin 경로 아래에 존재할 경우 Tomcat 구동 시 파일 안의 값을 읽어 들이게 되고, Sprinboot App이 실행될 때 해당 값을 적용시키게 된다.
setenv.sh 생성은 아주 간단하다.
3.1. Tomcat 설치경로 아래 bin 디렉토리에 setenv.sh 파일 생성
vi $CATALINA_HOME\bin\setenv.sh
3.2 vi 에서 아래를 입력 후 저장
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=development"
[참고] vi 편집기 명령어는 글 맨 아래를 참조
3.3 Tomcat 재기동
이렇게 각 환경별로 application 프로퍼티 값을 정해주었다. 앞으로의 개발은 환경 신경 안 쓰고 비즈니스 로직 구현에 집중하고 배포는 환경 구분 없이 언제나 같은 방식으로 진행하면 된다.
'개발 기록 > Java' 카테고리의 다른 글
Springboot Gradle Project 복사 후 할일들 (0) | 2023.07.24 |
---|---|
[Spring Framework] RestTemplate을 이용한 서버간 API 통신과 예외처리 (0) | 2023.06.08 |
[Springboot] 기본작업 #3 - WebSecurityConfig 구성과 접속 확인 (2) | 2023.05.25 |
[Springboot] 기본작업 #1 - Eclipse 개발 환경 구성 (0) | 2023.05.21 |
[Springboot] 기본작업 #2 - 이클립스에서 프로젝트 생성과 의존성 설정 (0) | 2023.05.21 |