앞선 포스트에서 Spring-Cloud를 활용하여 properties파일을 관리하는 방법을 알아보았습니다.
이번 포스트에서는 config server에서 제공받은 properties정보를 사용하는 config client 설정 방법을 알아보겠습니다.
Spring-Cloud config client는 애플리케이션이 구동되는 시점에 프로그래머가 명시해둔 이미 구동중인 config server로부터 properties정보를 받아오게됩니다. 앞서 8888번 포트에 config-test.yml파일 내용을 확인할 수 있는 config server를 구현해보았습니다.
이번 포스트에서는 실제로 전달받은 properties를 어떻게 사용하는지 알아보도록 하겠습니다.
Spring Initializr로 프로젝트를 생성합니다. config server 프로젝트 생성 시 Spring-Cloud config server 의존을 추가하였기 때문에 이번에는 Spring-Cloud config client의존을 추가하도록 하겠습니다. 또한 Spring Web 의존을 추가하여 받아온 속성 정보를 크롬과 같은 웹 브라우저로 확인해보겠습니다.
config client 애플리케이션의 application.yml에 속성 정볼를 받아올 config server에 대한 정보를 작성하도록 하겠습니다.
spring:
application:
name: application ## 애플리케이션의 이름을 작성합니다.
profiles:
active: test ## 활성화 시킬 프로필에 대해 명시합니다.
config:
import: optional:configserver:http://localhost:8888 ## config server의 주소를 작성합니다. 웹 요청으로 속성을 받아올 것이므로 optional:configserver:{http/https를 포함한 config server 주소} 형태로 작성합니다.
앞서 원격 리포지토리에서 application-test.yml이름으로 속성 파일을 등록하였습니다. 위 작성한 내용을 확인해본다면 원격지의 yml 파일명이
으로 작성된 것을 확인할 수 있습니다. 만약 application name이 tutomato인 프로젝트의 dev환경 속성을 활성화하고 싶을 때 tutomato-dev.yml과 같은 이름으로 파일을 작성하면 되는 것을 알았습니다.
프로젝트를 구동하면 작성된 정보를 바탕으로 localhost:8888에 속성 정보를 요청하는 로그 내용을 확인할 수 있습니다.
사실 주입받은 속성값을 사용하는 방식은 기존의 application.yml파일을 프로젝트 내부에 보관하는 방식과 큰 차이가 없습니다.
우선 @Configuration 어노테이션을 사용하여 WebConfiguration bean을 생성하고 @Value 어노테이션을 사용하여 값을 주입받도록 합시다.
@Configuration
public class WebConfiguration {
@Value("${application.name}")
private String appName;
@Value("${application.owner}")
private String appOwner;
@Value("${application.message}")
private String initMessage;
// getter, setter
@Override // 값이 올바르게 주입되었는지 확인을 위해 toString()을 사용하겠습니다.
public String toString() {
return "Configuration Information From Config server { /n" +
" applicaiton.name: " +this.appName +
"\n application.owner: " + this.appOwner +
"\n application.message: " + this.initMessage +
" }";
}
}
config server로부터 값을 정상적으로 주입받았다면 각각
가 초기화되어 있을것입니다.
확인을 위해 RestController를 하나 작성해보도록 하겠습니다.
@RestController
public class WebController {
@Autowired
WebConfiguration config;
@GetMappint("/test")
public String configTest(){
return config.toString();
}
}
이제 애플리케이션을 구동 후 브라우저에서 localhost:8080/test를 입력하여 속성값들이 정상적으로 입력되었는지 확인해보도록 하겠습니다.
원했던 속성값들을 불러오는 것을 확인할 수 있습니다.
Spring-Cloud를 활용하여 config파일을 관리하면 하나의 원격 저장소에서 여러 속성 정보를 다룰 수 있기 때문에 개발자 입장에서는 비지니스 로직에 집중할 수 있게 되어 생상 효율이 향상되는 것은 맞습니다. 하지만 Config파일은 데이터베이스 접속 정보나 API 접근 토큰 등 민감한 정보를 포함하고 있기 때문에 이 부분에서의 신중한 관리가 필요합니다.
만약 애플리케이션 내부에 yml파일로 속성 정보를 저장하고, private 권한의 프로젝트 원격 repository에서 각각 속성 파일을 관리한다면 Github계정이 탈취되거나 서버가 직접적으로 해킹당하지 않는 한 속성 정보가 유출 될 가능성은 희박할 것입니다.
하지만 Spring-Cloud서버를 통해 속성 파일을 전달 받는다면 기본적으로 public영역에 속성 정보들이 공개되게되고, https://{config server domain}/application/prod와 같은 간단한 요청만으로도 많은 정보를 탈취당할 수 있습니다.
때문에 상용 서비스에 이와같은 방식을 도입하기 전에 Spring-Cloud 애플리케이션을 private subnet영역으로 분리하여 내부 네트워크를 통해서만 정보를 조회할 수 있게하는 등의 기타 처리가 필요합니다.
두 포스트를 통해 간단하게 Spring-Cloud server/client를 구현해보았습니다. 애플리케이션 설정과 관련해서 더욱 자세한 내용을 확인해볼 필요가 있다면 Spring Doc을 확인해보시고, 적용에 앞서 운영 환경에 맞게 적절한 설계가 필요할것같습니다.