[Springboot] 환경별 properties 관리방법 본문
[Springboot] 환경별 properties 관리방법
- 2023. 3. 3. 09:51
spring boot를 사용하다가 배포까지 생각을 하다보면
로컬, 테스트, 운영 별로의 설정이 제각각이 됩니다.
그러다 보니 환경파일을 간편하게 조정하고 또한 해당 properties에 있는 값을
전체 시스템에서 가져다 쓰고 싶은 마음이 커집니다.
pom.xml 을 사용해서 active한 환경을 셋팅하고 그에 해당하는 properties를 불러오는 방식도 있지만
어짜피 배포를 할때는 수정을 해야하는게 현실입니다.
따라서 단순 properties 파일들을 이용해서 관리하는 방법과
그 값을 시스템에서 공유하는 방법을 알아보도록 하겠습니다.
일단 아래의 방법은 yml 파일이나 properties 파일 둘다 사용가능해서 일단 제가 선호하는 방법인
properties 파일을 사용하는 방법으로 정리하였습니다.
우선 spring boot에서 properties파일을 가져오는 방식입니다.
기본적으로 여러가지 방법이 있겠지만 저는 resources 폴더 아래에 구성하는 방식으로 하겠습니다.
[참고사항]
Spring Boot 이 파일을 검색하는 위치는 다음과 같습니다.
[classpath [META-INF/resources/webjars/],
[classpath [META-INF/resources/],
classpath [resources/],
classpath [static/],
classpath [public/],
ServletContext [/]
그리고, 샘플은 일단 local 만 설정하겠습니다.
개발이나 운영의 경우는 파일을 복사해서 아래처럼 만드시면 됩니다.
application.properties (기본 환경파일)
application-local.properties
application-dev.properties (필요시 생성)
application-prod.properties (필요시 생성)
* 형식은 application-{profile}.properties 이런 식이어야만 합니다.
기본 환경파일에는 active가 되는 profile 이 뭔지만 설정합니다. 즉, 아래와 같이 저장합니다.
다른 것 없이 한줄만 추가합니다. 뜻은 현재 프레임웍에서 사용할 profile은 local 이라는 것입니다.
application.properties 내용
spring.profiles.active=local
이렇게 하면 자동으로 application-local.properties 을 읽게 됩니다.
server.port = 8080
spring.datasource.initialization-mode=always
spring.datasource.platform=mariadb
spring.datasource.driverClassName=net.sf.log4jdbc.DriverSpy
spring.datasource.jdbcUrl=jdbc:log4jdbc:mariadb://IP주소/DB명?allowMultiQueries=true
spring.datasource.url=jdbc:log4jdbc:mariadb://IP주소/DB명?allowMultiQueries=true
spring.datasource.username = root
spring.datasource.password = 1234
spring.datasource.hikari.maximum-pool-size = 24
spring.datasource.hikari.connection-timeout = 5000
spring.datasource.hikari.connection-init-sql = SELECT 1
spring.datasource.hikari.validation-timeout = 2000
spring.datasource.hikari.minimum-idle = 10
spring.datasource.hikari.idle-timeout = 600000
spring.datasource.hikari.max-lifetime = 1800000
logging.config=classpath:logback-local.xml
# -------------------------------------
# File Extention
# -------------------------------------
file.extention=doc|docx|xls|xlsx|ppt|pptx|pptm|pps|ppsx|gul|hwp|csv|txt|pdf|bmp|jpg|jpeg|gif|tif|tiff|png
# -------------------------------------
# FILE UPLOAD
# -------------------------------------
file.upload.path=C:/upload/
file.download.path=C:/download/
file.upload.size.limit=10000000
# -------------------------------------
# 스케줄러
# -------------------------------------
custom.cron=0 * * * * *
scheduler1.cron=*/20 * * * * *
scheduler2.cron=*/30 * * * * *
#SMTP INFO
mail.host=smtps.mail.com
smtp.port=25
mail.user=hong@common.co.kr
mail.password=12345
#BASE URL
base.url=http://www.staging.com
대충 보시면 아시겠지만 로컬로 동작할 때의 환경 부분이 있습니다.
제 환경이 local 로컬이니 서버설정과는 다릅니다.
아무튼 기본적인 포트, data source, logback 설정과 추가적으로 공유할 정보를 정리합니다.
위에서 추가적인 정보는 # File Extension 주석 아래 쪽이라고 보시면 됩니다.
일단 여기서는 위의 datasource 등의 내용 위주가 아니라서 일단 생략하겠습니다. (따로 정리?를 하도록 하겠습니다.)
여기서는 해당 추가 값들을 가져와서 프레임웍에서 공유하도록 하는 방법을 설명하겠습니다.
우선 받아오기 위한 config 설정 역할을 하는 파일을 하나 만듭니다.
PropertiesConfig.java로 만들겠습니다.
아래 소스 내용 처럼 @Configuration 설정에 포함시켜서 초기에 반영되도록 합니다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
public class PropertiesConfig {
/*
file.extention=doc|docx|xls|xlsx|ppt|pptx|pptm|pps|ppsx|gul|hwp|csv|txt|pdf|bmp|jpg|jpeg|gif|tif|tiff|png
# -------------------------------------
# FILE UPLOAD
# -------------------------------------
file.upload.path=C:/upload/
file.download.path=C:/download/
file.upload.size.limit=10485760
# -------------------------------------
# 스케줄러
# -------------------------------------
custom.cron=0 * * * * *
scheduler1.cron=*/20 * * * * *
scheduler2.cron=*/30 * * * * *
#SMTP INFO
mail.host=smtps.mail.com
smtp.port=25
mail.user=hong@common.co.kr
mail.password=12345
#BASE URL
base.url=http://www.staging.com
*/
@Value("${spring.profiles.active}")
private String systemMode;
@Value("${file.extention}")
private String fileExtention;
@Value("${file.upload.path}")
private String fileUploadPath;
@Value("${file.download.path}")
private String fileDownloadPath;
@Value("${file.upload.size.limit}")
private long fileUploadSizeLimit;
@Value("${mail.host}")
private String mailHost;
@Value("${smtp.port}")
private String smtpPort;
@Value("${mail.user}")
private String mailUser;
@Value("${mail.password}")
private String mailPassword;
@Value("${base.url}")
private String baseUrl;
public String getSystemMode() {
return systemMode;
}
public String getFileExtention() {
return fileExtention;
}
public String getFileUploadPath() {
return fileUploadPath;
}
public String getFileDownloadPath() {
return fileDownloadPath;
}
public long getFileUploadSizeLimit() {
return fileUploadSizeLimit;
}
public String getMailHost() {
return mailHost;
}
public String getSmtpPort() {
return smtpPort;
}
public String getMailUser() {
return mailUser;
}
public String getMailPassword() {
return mailPassword;
}
public String getBaseUrl() {
return baseUrl;
}
}
환경파일에서 값을 가져와서 셋팅해주기 위해서 @Value 어노테이션을 썻습니다.
우선 기본적으로 application.properties 를 읽기 때문에 @Value("${spring.profiles.active}") 를 읽어와서 셋팅할 수 있습니다. 위에서 local로 셋팅했으니 값이 local로 저장됩니다.
나머지 변수도 동일하게 값이 셋팅이 됩니다. 그리고 변수에 대한 get 메소드를 생성합니다.
다른 사이트를 돌아다니면서 알아보니 @Value를 사용할 경우에 lombok을 사용하면 셋팅이 잘 안된다는 얘기가 있었습니다. 그래서 일단 강제로 메소드를 만들었습니다. 다른 분들은 lombok을 한번 사용해서 잘 되신다면 그냥 써도 무방할 것으로 보입니다. 저의 경우에는 잘 안되는 것으로 확인이 되었습니다.
이제 초기값은 셋팅이 되었고 다른 쪽 파일에서 해당 정보를 가져오는 것을 해보겠습니다.
전체를 다 하려면 소스가 너무 많아서 해당 사용된 부분만 발췌하였습니다.
보실 부분은 @Autowired private PropertiesConfig properties; 이고 실제 사용된 부분은 String uploadBasePath = properties.getFileUploadPath(); 입니다. 이렇게 다른 class파일에서 해당 정보를 가져와서 사용할 수 있습니다.
예전보다는 많이 쉬워진거 같습니다.
@Service("fileUploadService")
@SuppressWarnings({"unchecked", "rawtypes", "unused"})
public class FileUploadServiceImpl implements FileUploadService {
/** Log 클래스의 인스턴스를 받아온다. */
private final Log log = LogFactory.getLog(this.getClass());
@Autowired
private PropertiesConfig properties;
public void uploadFile(MultipartHttpServletRequest multiRequest,
final Map<String, DataSetMap> outData, List fileList) throws Exception {
.. 중략 ..
if (files.size() > 0) {
String uploadBasePath = properties.getFileUploadPath();
File saveFolder = new File(uploadBasePath);
// upload root folder create
if (!saveFolder.exists() || saveFolder.isFile()) {
saveFolder.mkdirs();
}
}
}
.. 중략 ..
}
위에서는 서술하지는 않았지만
스케줄러를 사용한다면 스케줄에 대한 cron 설정도 개별적으로 셋팅할 수 있습니다.
@Controller
@EnableScheduling
public class SchedulerController {
@Scheduled(cron = "${scheduler1.cron}") // 매 20초마다 Task 수행
public void schedulerStart1() {
System.out.println("Hello! scheduler 1");
}
@Scheduled(cron = "${scheduler2.cron}") // 매 30초마다 Task 수행
public void schedulerStart2() {
System.out.println("Hello! scheduler 2");
}
}
도움이 되었으며 좋겠습니다.
'프로그램 > JAVA' 카테고리의 다른 글
[STS] SVN Connector 수동설치 (0) | 2023.09.07 |
---|---|
git에 기존 프로젝트 최초 등록 [eclipse, github] (0) | 2023.07.20 |
java split에서 "|" 로 문자 자르기 (feat. 2차원, 도로명주소) (0) | 2023.02.20 |
spring boot 설정시 바뀐 부분 정리 (IFASS) (0) | 2022.11.30 |
Ibatis에서 mybatis로 일괄 변환 (100% 아님) (0) | 2022.11.18 |
RECENT COMMENT