SW/Spring Boot

Spring : 환경별 스프링 프로파일 사용을 조심해야 하는 이유

얇은생각 2023. 6. 2. 07:30
반응형

스프링의 기능인 프로필에 대해 설명합니다. 일부에서는 이를 잘못된 관행으로 간주할 수 있습니다. 이 문제를 해결할 수 있는 다른 방법을 알아봅니다.

최근에 프로필이라는 스프링 기능에 대한 많은 토론과 기사를 접했는데, 이는 환경별 구성을 분리하는 방법으로 홍보하고 있는데, 이는  나쁜 예제일 수 있습니다.

 

 

일반적인 예

일반적으로 프로파일을 표시하는 방법은 리소스 폴더에 다음과 같은 application-prod.yml을 사용하여 애플리케이션 아티팩트 내에 번들로 제공되는 여러 구성 파일을 두는 것입니다:

Spring : 환경별 스프링 프로파일 사용을 조심해야 하는 이유

 

 

문제

문제의 일부를 즉시 확인할 수 있기를 바랍니다: 

- 응용 프로그램의 프로덕션 자격 증명은 저장소에 대한 액세스 권한이 있는 모든 사용자에게 커밋되고 사용 가능하며, 이는 매우 심각한 보안 문제입니다.

- 지정된 환경에서 구성 값을 변경하려면 다시 컴파일하고 새 아티팩트를 생성해야 합니다.

- 새 환경을 도입하려면 다시 컴파일하고 새 아티팩트를 생성해야 합니다.

 

응용프로그램 로직을 실제로 변경하지 않고 새 응용프로그램 버전을 다시 컴파일하고 릴리스하는 것은 좋은 방식은 아닙니다.

 

 

해결책

구성 값은 12-Factor App의 권장 사항에 따라 애플리케이션의 아티팩트 및 VCS 저장소 외부에 두어야 합니다.

- 지정된 환경에서 application.jar 옆에 구성 파일을 두거나 spring.config.additional-location을 지정하면 특정 키만 재정의됩니다.

- 환경 변수를 사용합니다.

 

후자의 경우 구성 키는 some.resource.username <=> SOMERESOURCE_USERNAME과 같은 환경 변수로 바인딩됩니다.

사용자 지정 키 이름이 필요한 경우 다음과 같이 "에일리어스"를 만들 수 있습니다: 

some-resource.username: ${OTHER_ENV_KEY}

 

 

두 경우 모두 환경별로 구성 파일이 필요합니까?

필요한 것은 애플리케이션에 필요한 내부 및 외부 속성이 모두 포함된 단일 application.yml 파일입니다.

이러한 속성은 비어 있거나 기본값/로컬 값을 가질 수 있습니다.

some-resource.address:
some-resource.username: username
some-resource.password: ${OTHER_ENV_KEY:123456}

  

 

프로필을 사용해야 하는 경우

지금까지 환경별 프로필이 필요하지 않았습니다.  

그러나 환경 구성 파일을 고려하지 않는 "특수" 프로파일이 하나 있습니다. 바로 src/test/resources/에 있는 프로파일을 테스트하는 것입니다. 이 프로필과 해당 구성 파일은 현재 키만 재정의할 수 있습니다.

지정된 폴더에 application.yml 파일이 있는 경우 기본 파일에 정의된 모든 구성 속성을 제공해야 합니다.

이 프로필을 활성화하려면 테스트 클래스에서 @ActiveProfiles 주석을 사용합니다.

제가 생각할 수 있는 프로파일의 유일한 다른 용도는 선택적 기능 구성 그룹화입니다.

구성 파일에서 프로필 메커니즘의 장점 중 하나는 구성 속성을 병합/재지정할 수 있다는 것입니다.

 이 기능이 활성화된 경우에만 추가하려는 별도의 구성 특성 세트가 필요한 일부 선택적 기능이 있는 경우 application-{feature-name}yml을 사용할 수 있으며, 이는 spring.profiles.active/include 속성을 통해 기본 구성 파일에서 활성화할 수 있습니다.

 간단한 피쳐 플래그 지정을 위해 @ConditionalOnProperty 주석을 사용합니다.

 

 

결론

결론적으로, 애플리케이션 내부에 환경별 구성을 저장하지 말고 특정 환경에서 관리/주입된 외부 구성을 사용하십시오.

참고: 환경별 구성 파일 또는 일반적인 프로필 사용에 대한 의견과 경험을 자유롭게 공유하십시오. 제가 뭔가를 놓치거나 실수를 했을 수도 있는데, 저는 제 지식을 넓히고 싶습니다.

반응형