ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA Intellij] Maven-Profile을 적용하여 Resources폴더 환경에 맞게 관리하기
    프로그래밍/Java 2022. 5. 24. 09:07
    반응형

    목적

    • Maven을 이용하여 local(로컬), dev(개발), prod(사용) 서버를 다르게 조작하여 간편하게 db접속 정보를 바꾸는 작업을 진행 

    목표

    • java 소스에 resource 폴더를 여러개로 분리(local, dev, prod)
    • Maven profiles 설정
    • 각각에 환경에 맞는 db 정보가 담긴 Properties생성
    • resource에서 properties 파일 불러와 내용 읽기

     

    java 소스에 resource 폴더를 여러개로 분리(local, dev, prod)

    resource 파일을 local(로컬 개발), dev(테스트), prod(상용버전) 별로 만들어 주었음 

    Maven profiles 설정

    각각 환경에 맞게 DB정보를 변경할 수 있도록  설정 아래 와 같이 작성하면 선택한 프로필의 Properties가 설정이 되어 env라는 변수를 사용할 수 있게 됨 동적으로 변경이 되므로 resources-${env}에서 local, dev, prod가 들어가 resource폴더를 따로 설정하지 않아도 Profile만 설정하면 바로 적용되게끔 설정이 된것임

    <project>
      <build>
      ...
        <resources>
          <resource>
            <directory>src/main/resources-${env}</directory>
            <includes>
              <include>**/*.xml</include>
              <include>**/*.properties</include>
              <include>**/*.settings</include>
            </includes>
          </resource>
        </resources>
      ...
      </build>
    
      <profiles>
        <profile>
          <id>local</id>
          <properties>
            <env>local</env>
          </properties>
        </profile>
        <profile>
          <id>dev</id>
          <properties>
            <env>dev</env>
          </properties>
        </profile>
        <profile>
          <id>prod</id>
          <properties>
            <env>prod</env>
          </properties>
        </profile>
      </profiles>
      ...
    </project>

    위와 같이 설정하면 intellij오른쪽에 Maven 설정 탭 안에 Profiles가 보이게 되고 선택한 것으로 Profile이 설정이 되어 바로 resource 폴더가 적용 된것을 볼수 있을 것임. 이렇게 설정하여 개발 할 때는 local 테스트는 dev, 상용버전 만들 때는 prod로 설정이 가능

     

     

    db.properties

    이제는 properties에 대해 설정을 해주면 끝남 각각 환경에 맞게 db.properties를 생성 대충 아래와 같은 느낌으로 생성해 주었음

    db.drivername=com.mysql.cj.jdbc.Driver
    db.url=jdbc:mysql://localhost:3306/dbName?characterEncoding=UTF-8&serverTimezone=UTC
    db.username=root
    db.password=1234

    resource에서 properties 파일 불러와 내용 읽기

    소스에서 getClass().getClassLoader().getResource("파일명")을 이용하여 Profile에서 바라보고 있는 resource폴더의 파일을 쉽게 찾을 수 있음. 이것을 Path를 이용하여 주소를 탐색 및 fileInputStream으로 파일을 불러와 주면 바로 사용 할 수 있고, Properties를 사용하기 위해서 Properties객체를 사용 안에 있는 내용을 읽으면 완성 

    public void setDBProperties() {
        File file = null;
        FileInputStream fis = null;
        Properties properties = null;
        URL resource = null;
    
        try {
            // db.properties파일 주소 가져오기
            // getClass().getClassLoader().getResource = /src/main/resources-${env}/db.properties
            resource = getClass().getClassLoader().getResource("db.properties");
            // resource주소 uri로 바꾼 후 file추출
            file = Paths.get(resource.toURI()).toFile();
            // file의 절대 주소를 사용하여 filesystem에 input - ex : home/user/desktop/src/main/resources/db.properties
            fis = new FileInputStream(file.getAbsolutePath());
    
            // Properties객체를 이용
            properties = new Properties();
            // load 함수를 이용하여 불러오기
            properties.load(new java.io.BufferedInputStream(fis));
            // getProperty를 이용하여 key를 넣어 값을 얻어오기
            driverName = properties.getProperty("db.drivername"); // com.mysql.cj.jdbc.Driver
            dbUrl = properties.getProperty("db.url"); //jdbc:mysql://localhost:3306/dbName?characterEncoding=UTF-8&serverTimezone=UTC
            userName = properties.getProperty("db.username"); //root
            password = properties.getProperty("db.password"); //1234
    
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    반응형

    댓글

Designed by Tistory.