JunsuLime / spring-cloud-native-explorer

Spring cloud explorer
1 stars 0 forks source link

12요소 방법론과 설정에 대해서 정리하자. #19

Closed JunsuLime closed 3 years ago

JunsuLime commented 3 years ago

https://12factor.net/

JunsuLime commented 3 years ago

어플리케이션 설정에 대해서 이야기해보자.

왜 필요한가

설정 정보는 실행 환경에 저장한다.

어플리케이션 코드는 설정 정보와 엄격히 분리되어있어야한다. 어플리케이션의 설정 정보는 실행환경에서 읽어올 수 있어야한다. 실행환경에 따라 달라지는 모든 값은 환경설정 정보로 분류해서 환경에 저장되어야하고, 어플리케이션에 포함되면 안된다.

-> 코드변경 없이 환경에 따라 적절하게 동작한다.

이를 스프링으로 어떻게 관리하는지 따라가보자.

JunsuLime commented 3 years ago

"설정정보는 실행환경에 저장한다." 라는 12요소 방법론 중 하나를 Spring / Spring Cloud 환경에서 적용해보려합니다.

Spring 환경에서 적용하기에 앞서

"12요소 방법론" 이라는 친구에 대해서 짚고 넘어가려해요. https://12factor.net/

12요소 방법론은 클라우드 플랫폼 기반에 들어맞는 12가지의 방법에 대해 이야기하고있으며,

그 중 이번에 이야기하고 싶은 내용은 "설정 정보는 실행환경에 저장하자" 입니다.

여기서 말하는 "설정"의 의미는 실행환경에 따라 달라질 수 있는 정보입니다. ex) ...

이러한 정보들은 어플리케이션과 분리되어야하며, 설정정보를 실행환경에서 분리하므로써 동일한 코드베이스를 dev, beta, prod 등 여러 환경에서 배포할 수 있습니다.

===

그럼 이런 설정정보들을 스프링에서는 어떻게 다루는지 알아보도록 할게요!

Spring Framework

[live coding]

@ProperySource 를 이용해 설정값이 들어있는 파일을 지정할 수 있습니다. @Configuration 을 붙여주고 Annotation 기반으로 어플리케이션 컨텍스트를 띄워주고

PropertySourcePlaceHolderConfigurer 를 통해 다룰 수 있으며

이러한 값들은

constructor, setter, @Value field, Environment 등을 통해서 취득할 수 있어요.

Spring Boot

[live coding]

스프링부트에서는 이러한 번잡시런 과정을 거치지않고, @Value, Environment, @ConfigurationProperties 등을 통해서 외부 설정값을 주입받을 수 있습니다.

implementation 'org.springframework.boot:spring-boot-starter'

Spring Cloud

여기까지는 저희가 잘 알고있는 Spring Boot 의 설정이었습니다. 하지만 이러한 설정방법에는 아쉬운 점들이 있죠

이를 Spring Cloud 를 통해서 해결하도록 하겠습니다.

어떻게 이를 해결하는지! Spring Cloud 에서 제공하는 Feature 들을 보면서 알아가보시죠!

설정 서버를 파악하기위해 알아야하는 요소에는 BootstrapContext 가 있습니다.

commons feature 에서 확인가능

Bootstrap application context 는 main application 의 "부모" 컨텍스트이며

자식 컨텍스트 즉 어플리케이션은 부모 컨텍스트의 프로파일 및 설정 값들을 이어받게 됩니다.

Bootstrap application context 는 propertySourceLocator 인터페이스를 통해서 가져올 수 있습니다.

Spring Cloud Config 에서는 [프로젝트 파일의 의존성으로 들어가서] 이 인터페이스를 확장해서 server 와 client 를 구현했습니다.

spring cloud config 에서는 spring.application.name, profile 등으로 설정값을 구분할 수 있습니다.

이거는 예제를 통해서 확인해보도록 하시죠!

Context Refresh

이렇게 Spring Cloud를 도입하여

Spring cloud 는 이 문제를 해결하기위해 ContextRefresher 를 도입하였고, 해당 기능은 다양한 방식을 통해서 사용가능합니다.

이 자리에서는 간단한 확인을 위해 actuator 가 제공하는 "refresh" endpoint 를 사용해보시죠!

이렇게 ContextRefresh 를 통해서 설정값을 변경할 수 있습니다.

다만, DataSource 등과 같이 설정 정보를 가지고 만들어지는 bean 들은 refreshScope 을 이용해서 빈을 폐기하고, 재생성해야합니다.

refreshscope 기능을 사용할 때는 db 와 같이 connection 이 맺어진 친구들은 조심해서 써야하니 사용하시게 되면 이점 챙겨주세용!!

===

여기까지해서 spring cloud 를 이용한 설정까지봤는데 거의 다 왔어요!! 호댜댝 마저 볼게요!

앞서말한 설정 관련 문제들은 모두 해결 했지만, 클라우드 환경에서 개별 서버마다 들어가서 refreesh 를 호출하기는 무리가있죠

이를 Spring Cloud Bus 를 통해 해결하는 것 까지보면서 마무리를 지어보겠습니다.

Spring bus 는 분산시스템에서 메시지브로커를 사용해 여러 노드를 연결해주는 역할을 합니다.

만약 설정 저장소가 github, gitlab 등과 같이 webhook 을 지원하는 저장소라면,

라는 방식으로 자동화까지 할 수 있습니다.

에서 말씀드린 갱신 자동화에대해서 자세히 알수 있습니다!

여기까지 ㅇㅁㅇ

12요소 방법론 중 설정정보는 실행환경에 저장하자. Spring / Spring Cloud 를 통한 설정값 다루기. 설정값 변경 자동화를 보았습니다!!

이번 이야기 보따리를 준비하면서 느낀점 말하고, 질문받고 마무리할게요.

Spring 에서는 저희가 원하는 기능을 cloud project 를 통해 잘 제공해주고 있으므로, 이를 잘 활용해보면 좋을 것 같아요!

다만 같이 본 프로젝트의 버전은 최신버전이고, 저희 버전에서 동작하는지는 조금 확인이 필요합니당

이상입니다. 질문 있으면 해주세요~~

Reference