개발 기록/Java

[Springboot] 기본작업 #4 - applicaion.yml 설정과 서버 환경분리

JasonM 2023. 5. 30. 23:28
반응형

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
application.properties

 

application.properties 파일을 우클릭해서  [Conver .properties to .yaml] 옵션을 선택. (기억에는 이런 옵션이 없는 경우 그냥 파일명을 강제로 바꿔도 무방 했던 것 같다.) 

 

.properties 파일을 .yaml로 변환
.properties 파일을 .yaml로 변환

 

 

Refactoring 창이 뜨는데, 새로 생성한 프로젝트라서 아무런 내용도 없다. 바로 "OK" 클릭. 

.yaml 변환 과정
.yaml 변환 창

 

옵션 이름은 Convert to .properties to .yaml 이었지만 확인을 누르고 나서 변경된 파일명을 보면 우리가 원하는 .yml이다. 

application.yml 폴더 구조
application.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 재기동

Springboot Application 기동 화면 - local profile이 Active 상태 인 것을 확인 할 수 있다.
Springboot Application 기동 화면 - local profile이 Active 상태 인 것을 확인 할 수 있다.

 

 

이렇게 각 환경별로 application 프로퍼티 값을 정해주었다. 앞으로의 개발은 환경 신경 안 쓰고 비즈니스 로직 구현에 집중하고 배포는 환경 구분 없이 언제나 같은 방식으로 진행하면 된다. 

 

 


 

 

 

[리눅스/유닉스] vi 편집기 명령어

사용하는 사람이 아직 많이 있는지는 모르겠지만 예전에 어디선가 받아둔 vi 편집기 명령어 모음 1.시작 vi file vi를 시작하여 지정한 파일 편집 vi -R file 읽기 전용(read- only) 편집기로서 vi를 시작

jsonm.tistory.com

 

 

[Springboot] 기본작업 #1 - Eclipse 개발 환경 구성

Spring Framework가 가진 사상과 철학을 잘 이해하고 사용하는 Spring 전문가라 절대 말할 수는 없지만, Spring Boot를 이용해서 개발 요청이 들어오는 경우가 종종 있어서, 프레임워크에서 기본적으로 지

jsonm.tistory.com

 

 

[Springboot] 기본작업 #2 - 이클립스에서 프로젝트 생성과 의존성 설정

이클립스에서 개발환경 세팅이 완료되면 Spring Boot Project를 생성할 수 있다. 여기서는 이클립스에서 신규 프로젝트 생성하는 방법과 gradle.build 파일을 통해 Java 기반 프로그램의 의존성을 설정하

jsonm.tistory.com

 

 

[SpringBoot] 스프링부트 기초 #3 - 최초 접속 테스트

Springboot 프로젝트 생성을 마쳤다면 가장 먼저 하고 싶은 일은 아마도 내가 만든 앱이 일단 접속이 되는지 확인하는 것일 것 같다. 브라우저에 localhost:8080을 쳐서 뭐라도 떠야 안심이 되지 않을까

jsonm.tistory.com

 

 

 

 

 

 

 

 

 

반응형