728x90
반응형

현재 상황

  1. spring boot의 각 서비스들을 jar 빌드, Docker 빌드, 서버 배포 하는데 시간이 너무 오래걸림
  2. 마이크로서비스를 쿠버네티스 클러스터 서버에 배포해야하는데 각각의 서비스 수정하고 배포하는데 너무 오래 걸림
  3. git action으로 자동화를 하려고 했지만 디버깅하기가 어려워서 로컬에 동일한 환경을 만들어서 테스트하려고 함.

해결 방법

진행하려는 프로젝트에서 springboot 서비스들 중, 로컬로 실행할 수 있는 것들을 로컬에서 테스트하려고 함

→ 그러기 위해서 springboot의 설정 파일들을 분리해야 함.

예) application.yml , application-local.yml , bootstrap.yml , bootstrap-local.yml

  1. 로컬에서 실행할 파일 설정은 application-local.yml , bootstrap-local.yml 을 적용
  2. 서버에 배포할 파일 설정은 application.yml , bootstrap.yml 로 둠

Intellij에서 설정하기

Intellij에서 spring boot를 run하면 console 제일 상단에 찍히는 로그가 설정 파일 등을 담은 명령어이다.

기본으로 설정하면 default를 잡기 때문에 application.yml 설정 파일을 가지고 실행한다.

해당 사항을 바꾸려면 2가지 방법이 있다.(물론 결국에 같다)

  1. edit configuration에 들어가서 active profiles에 적용할 yml 입력하기
    1. 예를 들어, application-local.yml을 적용하고 싶으면 local만 입력하면 된다.
  2. edit configuration에 들어가서 modify option > Add VM options에서

-Dspring.profiles.active=local 이린식으로 적어주기

시행착오

설정을 local 설정으로 바꿔서 실행했는데, 계속 application.yml에 있는 내용이 적용되는 경우

이 부분에 대해서 오늘 꼬박 고생을 했는데.. 계속해서 application.yml에 있는 내용이 적용되어서 config server의 문제인지.. api-gateway의 문제인지 고민했는데 결국은 스프링 기본을 몰랐던 것이였다.

스프링은 application.yml과 application-local.yml이 실행되고, profile을 application-local.yml로 설정해주더라도, 공통된 내용은 application-local.yml 이 적용되지만 application-local.yml에 없는 내용은 application.yml 내용이 적용된다.

예를 들어서, application.yml과 application-local.yml이 아래와 같을 때

# application.yml
greeting:
  hi
  
  
---
# application-local.yml
greeting:
  hi2
@RestController
@RequiredArgsConstructor
public class controller {

    private final Environment env;

    @GetMapping("/greeting")
    public String get() {
        return env.getProperty("greeting");
    }
}

다음 코드를 active-profile을 local로 지정하면 hi2가 나온다.

즉, 둘 다 같은 키값이 있을 때는 local이 적용된다.

만약 두 파일이 다음과 같으면 어떻게 될까?

# application.yml
greeting:
  hi
  
  
---
# application-local.yml
greeting2:
  hi2

위의 코드를 active-profile을 local로 지정하면 hi가 나온다.

즉, application-local에 없는 greeting 이라는 키의 경우 application.yml 파일의 내용이 적용된 것을 확인할 수 있다.

따라서 **run 모드**가 **local**로 설정되면 Spring Boot는 application.yml 및 **application-local.yml**을 모두 읽어들여서, 중복되는 설정이 있다면 **application-local.yml**의 설정이 우선시된다.

일반적으로 **application.yml**은 모든 환경에서 사용되는 설정을 정의하고, **application-local.yml**은 로컬 환경에서만 필요한 설정을 정의한다. 이러한 설정은 **application-local.yml**에만 포함될 것입니다.

(이 내용을 몰라서 application.yml에 적용한게 실행될 때 같이 적용되어서 문제가 무엇인지 한참 고민했다.)

bootstrap.yml을 적용하고 싶을 때

다음과 같이 사용하면 bootstrap.yml을 application.yml보다 먼저 적용할 수 있다.

spring:
  config:
    import: classpath:/bootstrap.yml

이렇게 하면 bootstrap.yml을 먼저 적용한다. 그럼 위와 같이 만약 profiles를 local로 실행한다면 bootstrap.yml에 있는 내용과 application.yml이 겹치면 bootstrap.yml에 있는 내용이 적용되고, 없는 내용은 application.yml에 있는 키 값의 value를 찾을 수 있다.

728x90
반응형

+ Recent posts