어플리케이션의 실행환경이 계속 달라질 수 있다.
다른 서버, 다른 포트를 사용해야 할 때 마다 어플리케이션을 새로 빌드해야 한다면 정말 불편해진다.
웹 애플리케이션의 실행 환경에 따른 구성설정의 외부화를 이용해 설정파일(yml, properties)을 사용했다.
먼저 알아볼 것은 @EnableConfigurationProperties와 @ConfigurationProperties다.
@ConfigurationProperties 는 Spring Boot 에서 properties 파일에 정의된 프로퍼티 중 주어진 prefix 를 가지는
프로퍼티들을 매핑하여 Bean 으로 만들수 있게 해주는 어노테이션이다.
yml또는 properties 파일의 값을 bean으로 만들어 사용할 수 있게 된다.
@EnableConfigurationProperties는 @ConfigurationProperties을 bean으로 등록했을 때 설정파일로 사용 할 수 있게 해준다.
위와 같이 3개의 설정파일이 있다.
이 어플리케이션은 AWS를 사용하고, AWS를 사용하기 위해 설정파일에 값을 넣어줘야 한다.
설정 파일 구성을 외부화 하지 않으면 로컬에서 테스트 할 때, develop 서버에서 테스트 할 때 , 그 외 다른 환경에서 테스트 할 때 마다
어플리케이션의 설정파일을 다르게 지정해서 다시 빌드해줘야 한다.
그러나 설정파일을 외부화하면 실행 시킬 때 기본적으론 application에 설정한 local, 환경 변수를 통해 develop 이나 다른 설정파일로 구성할 수 있다.
설정파일의 값을 받을 POJO를 작성한다.
prepix에 매핑 할 설정정보를 넣어준다.
설정정보를 가진 POJO를 주입받을 클래스에 어노테이션을 붙여준다.
이제 빌드 후 어플리케이션 실행 시
SPRING_PROFILES_ACTIVE=dev java -jar applicationo.jar
환경변수를 걸어준다
위의 어플리케이션은 AWS를 사용하는 어플리케이션이다.
@Slf4j
public class SpringApplicationStartEvent implements ApplicationListener<ContextRefreshedEvent> {
public SpringApplicationStartEvent() {
}
@Override
public void onApplicationEvent(ContextRefreshedEvent event){
AutoScalingProperties.AWS aws =event.getApplicationContext().getBean(AutoScalingProperties.AWS.class);
//sns 클라이언트 생성
AmazonSNS snsClient = AmazonSNSClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(aws.getAccessKey(), aws.getSecretKey())))
.withRegion(EC2MetadataUtils.getEC2InstanceRegion())
.build();
try {
// SNS 주제에 구독 생성
SubscribeRequest request = new SubscribeRequest(aws.getTopicId(), aws.getNotificationProtocol(), getApplicationEndpoint(aws.getNotificationProtocol()));
SubscribeResult result = snsClient.subscribe(request);
log.info("Subscription ARN: " + result.getSubscriptionArn());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
해당 어플리케이션은 시작될때 ApplicationListener<ContextRefreshedEvent>를 상속받아
context가 초기화되면 호출되는 메서드이다.
AWS API를 사용하기 위해 AWS 객체를 만들어줘야하는데, 이때 설정파일에 입력되어있는 AWS 계정정보가 필요하다.
Component로 선언된 AutoScalingProperties를 가져와서 설정파일에 입력한 정보를 이용해 작업을 수행한다.
이렇게 다른 aws 계정을 사용하거나, 다른 포트번호를 사용해야하는 환경에서도 설정파일만 변경해주면
어플리케이션 내부를 건들을 필요없이 계정정보를 바꿔줄 수 있다.
이러한 설정을 사용할 때는 환경이 바뀌어도 어플리케이션이 유기적으로 대응될 수 있도록 설계하는 것이 중요하겠다.
'SPRING BOOT' 카테고리의 다른 글
Rate limit 알고리즘의 종류 (0) | 2024.08.26 |
---|---|
[SpringBoot] MapStruct에 대하여 (0) | 2023.06.03 |
카멜케이스와 스네이크케이스-Spring Boot와 Mybatis의 활용 (0) | 2021.08.12 |