개발 ON
  • [전자정부프레임워크] globals.properties 적용하기
    2024년 06월 22일 11시 40분 35초에 업로드 된 글입니다.
    작성자: 이주여이

    사진 게시판에 사진 등록하는 로직에서 개발 환경이랑 배포 환경의 디렉토리 구조가 달라 사진이 화면에 출력안되는 이슈가 있었다. 로그를 확인해보지 않아도 학원에서 리액트 반이랑 협업할 때 자연스레 알게된 점이긴 했지만..

     

    여튼 spring boot는 profile을 적용하면 됐었는데 전자정부프레임워크는 globals.properties를 적용한다고 한다!

     

    환경에 따라 보다 효율적으로 관리하기 위해 globals.properties를 적용시켜보았다.

    1. classpath에 globals.properties 추가

     

    dev - windows

    prod - linux(rocky linux)

     

    나는 resources 내에 생성했으며 globals.properties는 파일 내에 active=dev 혹은 active=prod를 적어두고 개발할 때는 dev를 적어둠으로써 개발 환경에서 세팅되어야 할 값들을 적어놓고, 배포할 때는 prod를 적어둠으로써 배포 환경에서 세팅되어야 할 값들을 적어놨다.

     

    globals.properties

    active=dev

    globals- 뒤에 오는 값을 적어준다.

    배포할 때는 dev를 지우고 prod를 적어준 후 war 파일을 압축하면 된다.

     

    globals-dev.properties

    upload.prefix.path=C:/survey

    개발 환경은 windows이며 파일 저장 경로를 C 드라이브 내에 폴더를 따로 만들어뒀는데 배포 환경인 linux에는 당연히 C 드라이브가 없으니 에러가 발생헀던 것이다. 여튼 내가 properties를 나누어 관리하려는 궁극적인 목적은 이렇게 운영체제마다 저장 경로를 나누어 관리하기 위함이다.

     

    아래는 배포 환경인 linux에서 파일을 저장할 경로를 적어줬다.

     

    globals-prod.properties

    upload.prefix.path=/usr/local/project/survey

    2. context-common.xml 수정

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:util="http://www.springframework.org/schema/util"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
                               http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

    util과 관련된 부분을 추가한다.

     

        <util:properties id="global" location="classpath:/globals.properties" />
        <util:properties id="prop" location="classpath:/globals-#{global['active']}.properties" />

    global이라는 properties의 경로는 active를 적어줬던 파일 경로이다.

     

    prop라는 properties의 경로를 보면 classpath(resources) 내 globals- 라고 적혀져있고 그 뒤에 global이라고 되어 있는데 이것은 prop 위에서 선언한 global의 경로 내에 active에 있는 value 값을 가져온다. 현재 글에서는 dev로 되어있기 때문에 다른 곳에서 prop에 있는 값을 가져온다면 globals-dev.properties의 값을 가져오게 되는 것이다.

    3. java 코드 수정

    ~ 수정 전 ~

    @Component
    public class FileUtils {
        private final MessageSource messageSource;
        private final String prefixPath;
        Logger log = LoggerFactory.getLogger(getClass());
    
        // context-common.xml에 등록된 messageSource 빈을 사용
        public FileUtils(MessageSource messageSource) {
            this.messageSource = messageSource;
            this.prefixPath = messageSource.getMessage("upload.prefix.path", null, Locale.getDefault());
        }
    
        // ... 생략
    
    }

    이 전에는 전정부에 있는 message-common.properties를 이용했었다.

     

    ~ 수정 후 ~

    @Component
    public class FileUtils {
        private final String prefixPath;
        Logger log = LoggerFactory.getLogger(getClass());
    
        // context-common.xml을 참조
        public FileUtils(@Value("#{prop['upload.prefix.path']}") String prefixPath) {
            this.prefixPath = prefixPath;
        }
    
        // ... 생략
    
    }

    4. 확인

    전정부에서 war 파일 압축하기 전에 active를 prod로 수정하고 ftp를 통해 war 파일을 linux 내에 tomcat/webapps/로 이동시켰다. 이후 context-common.xml에서 설정했던대로 해당 경로에 루피 사진이 저장되는 것을 확인할 수 있었다.(참고로 개발 환경에서도 테스트 해봤는데 캡처를 안했다. 정상 작동한다)


    관련 레퍼런스

    https://haenny.tistory.com/271

    https://hyeounstory.tistory.com/111

    https://blog.naver.com/deersoul6662/222044609070

     

    댓글