[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개의 댓글

관련 채용 정보