▶️상황
현재 프로젝트에서 금융결제원 오픈 API를 사용하고있는데, 테스트 API와 실제 운용 API가 나누어져있다.
개발 서버에서 실제 운용 API를 사용하여 테스트하면 안되기 때문에 이를 각각 개발 서버와 운영 서버에 맞게 분리 해야하고, 환경 설정 값들을 그에 맞게 적용해야한다.
▶️Spring 에서 설정 값을 어떻게 적용시키는가?
참고문헌 https://docs.spring.io/spring-boot/docs/1.2.0.M1/reference/html/boot-features-external-config.html
Spring Boot 에서는 Environment 추상화를 통해 환경 설정 값들에 접근할 수 있다고 한다. 우리는 PropertySource Interface 가 Environment에 로드되어 있으므로 이를 편리하게 사용하면 된다.
▶️환경 설정값을 적용하는 방법
내부,외부 설정 파일을 이용하는 경우
ex) application.properties , application.yml
OS 환경 변수
커맨드 라인 옵션 인수
$ java -jar artCare-0.0.1-SNAPSHOT.jar --server.port=8086
자바 시스템 속성
$ java -jar -Dserver.port=8086 artCare-0.0.1-SNAPSHOT.jar
▶️코드 내에서 사용하기
application.properties 또는 application.yml 에 해당 값이 있다고 가정하자.
@Value
@Value로 외부 설정 정보의 키 값을 입력받고, 해당하는 value 값을 가져올 수 있다.
@Value("${jwt.client-secret}")
private String jwtClientSecret;
@Value("${jwt.issuer}")
private String jwtIssuer;
@Value("${jwt.refresh-token-expire}")
private Integer jwtRefreshTokenExpire;
@Value("${jwt.token-expire}")
private Integer jwtTokenExpire;
@ConfigurationProperties
외부 설정 값을 객체를 통해서 활용할 수 있다.
▶️개발 서버와 운영 서버의 설정 값 분리하기.
개발 서버와 운영 서버 jar 마다 설정 값을 변경하기는 어려우니 profile을 사용하여 편리하게 사용한다. profile 을 사용하면 내 입맛대로 내부에 있는 설정 파일을 선택할 수 있다. 즉, 개발 서버에서는 spring.profiles.active=local 을 이용하여 application-local.properties 파일을 적용하고, 운용 서버에서는 spring.profiles.active=prod을 이용하여 application-prod.properties 파일을 적용할 수 있다.
application-{profile}.properties처럼 파일을 나누어서 사용하거나 하나의 파일에서 사용할 수 있다.
아래는 하나의 파일을 사용하여 설정하는 예시이다. #-- 를 기준으로 profile을 나눌 수 있는데, 아무 값이 없으면 default이다.
보기 쉽게 실제 프로젝트에서 사용하는 다른 값들은 삭제하였다. spring.config.activate.on-profile을 이용하여 profile 값을 설정할 수 있다.
개발 서버에서는 그냥 실행하면 되고, 운용 서버에서는
java -jar *.jar --spring.profiles.active=prod
를 사용하여 실행하면된다.
현재 프로젝트에서는 .properties를 사용하였는데, 설정 값들이 많다보니 가독성이 떨어진다. 이후에 yml로 바꾸는 작업을 해야한다. properties 에서는 Profile 구분을 #--- 로 하였지만, yml 에서는 ---로 해야한다.
▶️개발 서버와 운영 서버에 등록되는 Bean 분리하기.
개발 서버에서는 금융결제원의 Test Api 를 사용하는 LocalFinanceService를 적용하고 운용 서버에서는 실제 Api를 사용하는 ProdFinanceService를 적용하고 싶다.
@Profile 사용하기
FinanceService
public interface FinanceService {
void send(int money);
}
LocalFinanceService
@Profile("local")
public class LocalFinanceService implements FinanceService {
@Override
public void send(int money) {
}
}
ProdFinanceService
@Profile("prod")
public class ProdFinanceService implements FinanceService{
@Override
public void send(int money) {
}
}
Profile에 맞게 Bean을 등록해주어야 한다.
FinanceServiceConfig
@Configuration
public class FinanceServiceConfig {
@Bean
@Profile("prod")
public FinanceService prodFinanceService() {
return new ProdFinanceService();
}
@Bean
@Profile("local")
public FinanceService localFinanceService() {
return new LocalFinanceService();
}
}
profile 을 local 또는 prod 값을 적용할 경우 각각 다른 Bean 이 등록되어 FinanceController 에서 FinanceService 만 사용하면 Local 환경에서는 LocalFinanceService 를 적용하고, Prod 환경에서는 ProdFinanceService를 적용하게 된다. 결국 추상화가 핵심이다.
'개발 이야기 > Spring' 카테고리의 다른 글
Spring WebClient 적용기 (1) | 2024.04.26 |
---|---|
Spring paging count query 조건 (0) | 2024.03.29 |
ResponseEntityExceptionHandler 사용하는 이유 (1) | 2024.03.15 |
Spring ThreadPoolTaskExecutor @Async 비동기 (1) | 2024.02.20 |