본문 바로가기
Java/SpringBoot

[Spring Boot] GlobalsProperties 클래스 생성하기 - 정적변수, 전역변수 사용

by 리요_ 2024. 11. 18.
반응형

[Spring Boot] GlobalsProperties 클래스 생성하기 - 정적변수, 전역변수 사용

 

Srping Boot ,Spring 적용 가능합니다.

properties 값들을 파일로부터 읽어와 Globals 클래스의 정적변수로 로드시켜주는 클래스를 만들어보려합니다.

해당 클래스를 생성하기 위한 준비를 위한 준비,,,, 를 먼저 해줍니다.


아래의 유틸 클래스 4개를 추가한 채로 작성된 클래스입니다.

 

WebUtil 클래스 

2024.11.14 - [Java/SpringBoot] - [Spring Boot] WebUtil Class 생성 - XSS, SQL injection 보안 취약점 방지

 

[Spring Boot] WebUtil Class 생성 - XSS, SQL injection 보안 취약점 방지

Spring Boot 에서 사용한 유틸클래스여서 해당 카테고리에 넣었지만, Spring 에서도 적용 가능합니다!⭐ WebUtil.java교차 사이트 스크립팅(XSS) 공격과 경로 조작 공격을 방지하기 위한 유틸리티 클래

li-yo.tistory.com


BasicLogger 클래스

2024.11.15 - [분류 전체보기] - [Spring Boot] BasicLogger Class 생성 - 디버깅, 정보 기록 관리

 

[Spring Boot] BasicLogger Class 생성 - 디버깅, 정보 기록 관리

Spring Boot 프로젝트에 사용하여서 Spring Boot 카테고리에 있지만 Spring 에서도 적용 가능한 유틸 클래스입니다.⭐ BasicLogger애플리케이션의 디버깅, 정보 기록 등을 체계적으로 관리하기 위해 로깅

li-yo.tistory.com

 

ResourceCloseHelper 클래스

2024.11.16 - [Java/SpringBoot] - [Spring Boot] ResourceCloseHelper Class 생성 - 리소스 관리

 

[Spring Boot] ResourceCloseHelper Class 생성 - 리소스 관리

Spring Boot 에서 사용한 유틸클래스여서 해당 카테고리에 넣었지만, Spring 에서도 적용 가능합니다! 아래의 유틸 클래스를 적용하여 생성한 클래스입니다. BasicLogger 클래스 - https://velog.io/@bi-sz/Spring

li-yo.tistory.com

 

 

StringUtilClass 클래스 

2024.09.27 - [Java/SpringBoot] - [Spring Boot] StringUtilClass

 

[Spring Boot] StringUtilClass

eGovFrame 에서 사용하는 StringUtil 클래스입니다. Spring Boot, Spring 적용 가능합니다. 주석이 잘 달려있어,, 상세 정리는 생략......... 다음에 기회가 된다면,, ㅎㅎ기록용으로 남겨둡니다.package com.

li-yo.tistory.com

 

 

 

StringUtilClass 의 경우 해당 코드 부분만 사용하기 때문에 전체 코드가 너무 길어 일부만 적용해도 문제 없습니다!


💫 GlobalsProperties.java

properties 값들을 파일로부터 읽어와 Globals 클래스의 정적변수로 로드시켜주는 클래스를 만들어보려합니다.

문자열 정보를 기준으로 사용할 전역변수를 시스템 재시작으로 반영할 수 있도록 합니다.

 

 

FILE_SEPARATOR : 운영체제에 따른 파일 구분자를 가져옵니다.

RELATIVE_PATH_PREFIX : 프로퍼티 파일의 상대 경로를 가져옵니다.

GLOBALS_PROPERTIES_FILE : 전역 프로퍼티 파일의 절대 경로를 가져옵니다.

 

 

getPathProperty(String keyName)

  • 특정 키 값에 해당하는 프로퍼티 상대 경로 값을 절대 경로 값으로 반환합니다.
  • FileInputStream을 사용하여 파일을 열고, Properties 객체에 파일 내용을 로드합니다.
  • 키 값에 해당하는 프로퍼티 값을 가져온 후, 상대 경로 값을 절대 경로 값으로 변환하여 반환합니다.
  • 파일을 찾을 수 없거나 입출력 예외가 발생하는 경우 예외를 처리합니다.

 

 

getProperty(String keyName)

  • 지정된 키 값에 해당하는 프로퍼티 값을 반환합니다.
  • FileInputStream을 사용하여 파일을 열고, Properties 객체에 파일 내용을 로드합니다.
  • 키 값에 해당하는 프로퍼티 값을 가져와 반환합니다.
  • 프로퍼티 값이 null인 경우 빈 문자열을 반환합니다.
  • 파일을 찾을 수 없거나 입출력 예외가 발생하는 경우 예외를 처리합니다.

 

getPathProperty(String fileName, String key)

  • 지정된 파일에서 특정 키 값에 해당하는 프로퍼티 상대 경로 값을 절대 경로 값으로 반환합니다.
  • FileInputStream을 사용하여 파일을 열고, Properties 객체에 파일 내용을 로드합니다.
  • 키 값에 해당하는 프로퍼티 값을 가져온 후, 상대 경로 값을 절대 경로 값으로 변환하여 반환합니다.
  • 파일을 찾을 수 없거나 입출력 예외가 발생하는 경우 예외를 처리합니다.

 

getPropery(String fileName, String Key)

  • 지정된 파일에서 특정 키 값에 해당하는 프로퍼티 값을 반환합니다.
  • FileInputStream을 사용하여 파일을 열고, Properties 객체에 파일 내용을 로드합니다.
  • 키 값에 해당하는 프로퍼티 값을 가져와 반환합니다.
  • 파일을 찾을 수 없거나 입출력 예외가 발생하는 경우 예외를 처리합니다.

loadPropertyFile(String property)

  • 지정된 프로퍼티 파일의 내용을 파싱하여 (키-값) 형태의 구조체 배열을 반환합니다.
  • FileInputStream을 사용하여 파일을 열고, Properties객체에 파일 내용을 로드합니다.
  • Enumeration을 사용하여 프로퍼티 키 목록을 순화하며, 각 키-값 쌍을 Map에 저장하고 ArrayList에 추가합니다.
  • 파일을 찾을 수 없거나 입출력 예외가 발생하는 경우 예외를 처리합니다.
  • 최종적으로 (키-값) 형태의 구조체 배열을 반환합니다.
package com.liyo.cmm.service;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.liyo.cmm.util.ResourceCloseHelper;
import com.liyo.cmm.util.StringUtil;
import com.liyo.cmm.web.WebUtil;

public class GlobalsProperties {
	private static final Logger LOGGER = LoggerFactory.getLogger(GlobalsProperties.class);

	// 파일구분자
	final static String FILE_SEPARATOR = System.getProperty("file.separator");

	public static final String RELATIVE_PATH_PREFIX = GlobalsProperties.class.getResource("") == null ? ""
			: GlobalsProperties.class.getResource("").getPath()
					.substring(0, GlobalsProperties.class.getResource("").getPath().lastIndexOf("com/"))
					.replaceAll("%20", " ");

	public static final String GLOBALS_PROPERTIES_FILE = RELATIVE_PATH_PREFIX + "liyoProps" + FILE_SEPARATOR
			+ "globals.properties";

	/**
	 * 인자로 주어진 문자열을 Key값으로 하는 상대경로 프로퍼티 값을 절대경로로 반환한다(Globals.java 전용)
	 * 
	 * @param keyName String
	 * @return String
	 */
	public static String getPathProperty(String keyName) {
		String value = "";

		LOGGER.debug("getPathProperty : {} = {}", GLOBALS_PROPERTIES_FILE, keyName);

		FileInputStream fis = null;
		try {
			Properties props = new Properties();

			fis = new FileInputStream(WebUtil.filePathBlackList(GLOBALS_PROPERTIES_FILE));
			props.load(new BufferedInputStream(fis));

			value = props.getProperty(keyName);
			value = (value == null) ? "" : value.trim();
			value = RELATIVE_PATH_PREFIX + "liyoProps" + System.getProperty("file.separator") + value;
		} catch (FileNotFoundException fne) {
			LOGGER.debug("Property file not found.", fne);
			throw new RuntimeException("Property file not found", fne);
		} catch (IOException ioe) {
			LOGGER.debug("Property file IO exception", ioe);
			throw new RuntimeException("Property file IO exception", ioe);
		} finally {
			ResourceCloseHelper.close(fis);
		}

		return value;
	}

	/**
	 * 인자로 주어진 문자열을 Key값으로 하는 프로퍼티 값을 반환한다(Globals.java 전용)
	 * 
	 * @param keyName String
	 * @return String
	 */
	public static String getProperty(String keyName) {
		String value = "";

		LOGGER.debug("===>>> getProperty" + GlobalsProperties.class.getProtectionDomain().getCodeSource() == null ? ""
				: StringUtil.isNullToString(
						GlobalsProperties.class.getProtectionDomain().getCodeSource().getLocation().getPath()));
		LOGGER.debug("getProperty : {} = {}", GLOBALS_PROPERTIES_FILE, keyName);

		FileInputStream fis = null;
		try {
			Properties props = new Properties();

			fis = new FileInputStream(WebUtil.filePathBlackList(GLOBALS_PROPERTIES_FILE));

			props.load(new BufferedInputStream(fis));
			if (props.getProperty(keyName) == null) {
				return "";
			}
			value = props.getProperty(keyName).trim();
		} catch (FileNotFoundException fne) {
			LOGGER.debug("Property file not found.", fne);
			throw new RuntimeException("Property file not found", fne);
		} catch (IOException ioe) {
			LOGGER.debug("Property file IO exception", ioe);
			throw new RuntimeException("Property file IO exception", ioe);
		} finally {
			ResourceCloseHelper.close(fis);
		}

		return value;
	}

	/**
	 * 주어진 파일에서 인자로 주어진 문자열을 Key값으로 하는 프로퍼티 상대 경로값을 절대 경로값으로 반환한다
	 * 
	 * @param fileName String
	 * @param key      String
	 * @return String
	 */
	public static String getPathProperty(String fileName, String key) {
		FileInputStream fis = null;
		try {
			Properties props = new Properties();

			fis = new FileInputStream(WebUtil.filePathBlackList(fileName));
			props.load(new BufferedInputStream(fis));
			fis.close();

			String value = props.getProperty(key);
			value = RELATIVE_PATH_PREFIX + "liyoProps" + System.getProperty("file.separator") + value;

			return value;
		} catch (FileNotFoundException fne) {
			LOGGER.debug("Property file not found.", fne);
			throw new RuntimeException("Property file not found", fne);
		} catch (IOException ioe) {
			LOGGER.debug("Property file IO exception", ioe);
			throw new RuntimeException("Property file IO exception", ioe);
		} finally {
			ResourceCloseHelper.close(fis);
		}
	}

	/**
	 * 주어진 파일에서 인자로 주어진 문자열을 Key값으로 하는 프로퍼티 값을 반환한다
	 * 
	 * @param fileName String
	 * @param key      String
	 * @return String
	 */
	public static String getProperty(String fileName, String key) {
		FileInputStream fis = null;
		try {
			Properties props = new Properties();

			fis = new FileInputStream(WebUtil.filePathBlackList(fileName));
			props.load(new BufferedInputStream(fis));
			fis.close();

			String value = props.getProperty(key);

			return value;
		} catch (FileNotFoundException fne) {
			LOGGER.debug("Property file not found.", fne);
			throw new RuntimeException("Property file not found", fne);
		} catch (IOException ioe) {
			LOGGER.debug("Property file IO exception", ioe);
			throw new RuntimeException("Property file IO exception", ioe);
		} finally {
			ResourceCloseHelper.close(fis);
		}
	}

	/**
	 * 주어진 프로파일의 내용을 파싱하여 (key-value) 형태의 구조체 배열을 반환한다.
	 * 
	 * @param property String
	 * @return ArrayList
	 */
	public static ArrayList<Map<String, String>> loadPropertyFile(String property) {

		// key - value 형태로 된 배열 결과
		ArrayList<Map<String, String>> keyList = new ArrayList<Map<String, String>>();

		String src = property.replace('\\', File.separatorChar).replace('/', File.separatorChar);
		FileInputStream fis = null;
		try {

			File srcFile = new File(WebUtil.filePathBlackList(src));
			if (srcFile.exists()) {

				Properties props = new Properties();
				fis = new FileInputStream(src);
				props.load(new BufferedInputStream(fis));
				fis.close();

				Enumeration<?> plist = props.propertyNames();
				if (plist != null) {
					while (plist.hasMoreElements()) {
						Map<String, String> map = new HashMap<String, String>();
						String key = (String) plist.nextElement();
						map.put(key, props.getProperty(key));
						keyList.add(map);
					}
				}
			}
		} catch (IOException ex) {
			LOGGER.debug("IO Exception", ex);
			throw new RuntimeException(ex);
		} finally {
			ResourceCloseHelper.close(fis);
		}

		return keyList;
	}
}
 
반응형