[Spring] Spring-Cloud(2) - config client

KIM Jongwan·2024년 9월 9일
0

SPRING

목록 보기
7/7
post-thumbnail

앞선 포스트에서 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 의존을 추가하여 받아온 속성 정보를 크롬과 같은 웹 브라우저로 확인해보겠습니다.

application.yml

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}-{active profile}.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로부터 값을 정상적으로 주입받았다면 각각

  • appName: sample-app
  • appOwner: jongwan
  • initMessage: This is sample properties file

가 초기화되어 있을것입니다.

확인을 위해 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을 확인해보시고, 적용에 앞서 운영 환경에 맞게 적절한 설계가 필요할것같습니다.

profile
3년차 백앤드 개발자입니다.

0개의 댓글