스프링 설정 환경 분리
들어가기에 앞서
프로젝트를 만들게되면 결국 언젠가는 운영으로 배포를 해야될 때가 있다. 설령 혼자서 만드는 토이 프로젝트라고 할지라도 테스트를 위해서 또는 실제로 운영해보기 위해서 서버에 배포하게 될 것이다.
그런데 로컬에서만 사용하던 설정이 운영에서 그대로 사용되면 문제가 생길 수 있다. DB접근하는 Datasource도 다를 것이고 파일을 저장한다면 저장하는 파일경로도 다를 것이다. 이것 외에도 외부에 보여지면 안되는 중요한 정보들이 있을 수도 있다.
이러한 이유들 때문에 로컬에서 사용하는 설정파일과 운영에서 사용하는 설정파일을 분리하는 작업을 해보도록 하자.
필자가 사용한 환경은 IntelliJ, gradle, SpringBoot를 사용하고있다.
스프링부트 2.4버전 이전과 이후의 작성방법이 다르다. 필자는 2.4이상의 버전을 사용하고 있기때문에 2.4이후의 버전 방법으로 설명하도록 하겠다.
환경 분리하기
가장 대표적으로 로컬과 운영이 나뉘는 부분이 DB연결일 것이다. 먼저 application.yml을 만들어서 로컬과 운영에서 공통으로 사용하는 내용을 입력하고 defualt로 실행시킬 파일을 등록하자.
## application.yml
spring:
profiles:
active: local
messages:
basename: errors
- profiles.active : defualt로 실행시킬 파일이름을 지정할 수 있다. local로 지정하면 local로 지정된 파일을 실행시킨다. 이후에 파일을 만들어보면서 자세히 알아보자.
- messages.basename : 화면에서 보여주는 에러메세지 내용을 외부에서 지정해서 설정할 수 있다. 필자는 errors.properties라는 파일을 만들어서 에러내용을 따로 작성해놓았고 그 파일을 추가하는 작업이다. 이 파일은 로컬이나 운영이나 공통으로 동작해야하기 때문에 이 파일에 넣었다.
다음으로 로컬에서 동작시킬 application-local.yml을 만들어보자.
## application-local.yml
spring:
config:
activate:
on-profile: local
datasource:
url: jdbc:h2:tcp://localhost/~/[DB이름]
username: [DB아이디]
password: [DB비밀번호]
driver-class-name: org.h2.Driver
- config.activate.on-profile : 현재 파일의 이름을 지정해준다. 이 파일은 local로 지정되서 local을 호출하면 이 파일이 실행된다.
- datasource : DB연결 관련된 내용을 작성한다. 로컬에서 사용할 DB의 내용을 입력해주면 된다. 로컬에서는 H2를 사용하였다.
그리고 운영에서 사용할 application-prod.yml을 만들어보자.
## application-prod.yml
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://[DB주소]:3306/[DB이름]
username: [DB아이디]
password: [DB비밀번호]
driver-class-name: com.mysql.cj.jdbc.Driver
local에서의 설정과 동일하다. 해당 파일의 이름을 prod로 지정해주고 운영에서 사용할 DB 설정내용을 작성하면된다. 운영에서는 mysql을 사용하였다.
ouath를 사욯하는 경우이거나 설정을 더 세밀하게 분리해서 사용하는 경우에는 여러개를 한 번에 등록하는 방법도 있다.
## application-local.yml
spring:
profiles:
group:
local:
local
oauth
datasource:
url: jdbc:h2:tcp://localhost/~/[DB이름]
username: [DB아이디]
password: [DB비밀번호]
driver-class-name: org.h2.Driver
group을 만들어서 사용할 수 있다. profiles.group.[그룹명]을 입력하고 실행시킬 파일이름을 넣어주면 active에서 group이름으로 실행시킬 수 있다.
분리된 환경 실행방법
이렇게 설정하고 스프링부트를 실행시키면 application.yml이 실행되면서 spring.profiles.active에서 설정한 파일의 내용을 포함해서 실행시키게 된다. 위의 코드에서 local로 설정했기 때문에 기본실행 파일은 local이 된다.
로컬에서 IDE를 사용해서 바꾸고 싶으면 active자리에 원하는 이름을 입력하면 된다. prod로 입력하면 prod를 기반으로 실행이 된다.
운영으로 배포할 떄는 jar를 조건을 걸어서 실행시킨다. 운영서버에 프로젝트를 옮긴 후 application.yml을 수정하는 방법도 있겠지만 그렇게 하면 로컬에서 수정된 파일을 다시 서버로 옮길때마다 수정해줘야하는 번거로움이 발생한다.
먼저 jar파일을 만들어야 한다. 여러 방법이 있지만 프로젝트를 build시켜서 생성해보도록 하자.
IDE에서 Terminal탭에 들어가면 현재 프로젝트 경로를 가리키고 있을 것이다. 명령어 ./gradlew build를 입력해서 프로젝트를 빌드시키자.
gradlew는 gradle wrapper로서 gradle을 프로젝트에 포함시켜 배포하는 방법이다. 이 방식을 사용하면 실행시키는 환경에 gradle이 설치되어 있지 않아도 사용할 수 있기 때문에 환경에 종속되지 않고 사용할 수 있다.
빌드가 실패한다면 정말 수 많은 이유가 있을 수 있다. 만약 스스로 설정이 완벽하게 잘 됐는데도 실패한다고 생각하면
2022.06.15 - [에러모음] - 스프링부트 gradle build 실패를 참고해보도록 하자.
빌드가 성공했다면 build - libs 안에 jar파일이 생성됐을 것이다.
이제 cmd를 띄운 후 jar파일이 있는 폴더로가서 java -jar [jar파일이름].jar 을 입력하자. 그러면 스프링이 실행될 것이다. 아무 옵션없이 실행했기 때문에 당연하게도 local로 지정되서 실행된다.
prod로 실행시키길 원하면 java -jar -Dspring.profiles.active=prod [jar파일이름].jar 을 입력해주면 된다. 그러면 성공적으로 prod로 실행될 것이다. 운영에 jar파일을 빌드시키고 실행시킬 때 이 방법으로 실행시키면 운영에서 적용하고자 하는 설정으로 실행시킬 수 있다. 만약 github와 같이 외부에서 접근할 수 있는 방법을 사용한다면 application-prod.yml과 같은 운영 DB의 정보가 있는 파일은 .gitignore에 등록해서 github에 올라가지 않도록 주의해야 할 것이다.
'Spring > Boot' 카테고리의 다른 글
ExceptionResolver를 이용한 API예외 처리 (0) | 2022.05.25 |
---|---|
스프링부트 검증기능 사용하기(Bean Validation) (0) | 2022.03.19 |
댓글
이 글 공유하기
다른 글
-
ExceptionResolver를 이용한 API예외 처리
ExceptionResolver를 이용한 API예외 처리
2022.05.25 -
스프링부트 검증기능 사용하기(Bean Validation)
스프링부트 검증기능 사용하기(Bean Validation)
2022.03.19