프레임워크 - 설정파일(Propertise)

go·2024년 8월 29일

데이터 종류

- 가벼우면서 변경성이 높은 데이터
: 이 데이터는 크기가 작고 자주 변경될 수 있다. (예: 사용자의 ID, 이름 설정정보 등) 그래서 빠르게 접근하고 처리해야하며, 설정파일(Properties 파일)에서 관리될 수 있다. 설정 파일은 가벼운 데이터의 저장과 읽기에 용이하며 쉽게 수정이 가능하다.

- 무거우면서 변경성이 높은 데이터
: 이 데이터는 크기가 크고 보안이 중요한 정보이다.(예: 금융 거래 내역, 사용자 계좌 정보 등) 이러한 데이터는 보안이 중요하기 때문에 데이터베이스(DB)에 저장하고 관리한다. DB는 대량의 데이터를 안전하게 저장하고 높은 성능으로 처리할 수 있는 환경을 제공하기 때문이다.


💡 데이터 특성에 따라 설정파일을 사용하여 더 효율적이고 유연한 방법을 선택할 수 있는데요.여기서 생소한 단어 (Properties 파일)에 대해서 알아보는 시간을 가져보겠습니다!


프레임워크와 Properties 파일의 관계

  1. 프레임워크
    : 프레임워크는 개발자가 애플리케이션을 더 쉽게 개발할 수 있도록 구조와 패턴을 제공한다. Java의 경우 Spring이나 Struts 같은 프레임워크가 대표적인데, 이 프레임워큰는 애플리케이션 특정 부분(예: 웹 요철 처리, DB접근 등)을 표준화 하고 자동화 해줍니다.

  2. Properties 파일
    : Properties 파일은 프레임워크와 애플리케이션이 동작할 때 필요한 설정 정보를 담고 있는 파일이다. 주로 키-값 쌍의 형태로 저장되며, 각종 설정값(예: 요청 처리 클래스, DBB연결 등)관리하는데 사용된다.


🦊왜 Propertise 파일을 사용할까?

  1. 설정의 분리
    : 코드를 수정하지 않고 설정 파일만 수정하여 애플리케이션의 동작 방식을 변경할 수 있다. 예를 들어, 데이터베이스 연결 정보를 설정 파일에 두면, 코드 수정 없이 데이터베이스를 변경할 수 있다.

  2. 유연성
    : 여러 환경(예: 개발,테스트,프로덕션)에서 서로 다른 설정을 사용할 수 있다. 각각의 환경에 맞는 Propertise 파일을 준비해 두면, 환경마다 다른 설정을 사용할 수 있다.

  3. 간결함
    : 코드에서 설정 관련 로직을 제거하고, 설정 파일로 분리함으로써 코드가 더 간결해진다. 설정 파일만 수정하면 새로운 기능을 쉽게 추가하고 변경할 수 있어 코드가 복잡해지는 것을 막아준다.


🪄 따라서, Propertise파일은 프레임워크의 기능을 더 잘 활용하는 도구로 볼 수 있다.



Properties 파일을 설정하는 방법

1. 설정파일 생성

설정 파일은 txt 파일 형태로 정의되고 이 설정 파일은 주로 키-값 쌍의 형태로 저장된다. 여기서 'list','write','content'는 키(key)이고 'list=com.yong.controller.ListAction' 등은 이 키에 해당하는 값(value) 입니다. 이 값은 클래스의 이름으로 애플리케이션에서 사용자가 요청한 타입에 따라 어떤 클래스를 실행할 지 결정한다.


2. 설정파일의 정보를 로드

'getServletContext().getRealPath()' 메서드를 사용해 설정 파일의 실제 경로를 가져온다. 이 경로는 'WEB-INF' 폴더 아래에 있는 'yourCommand.properties' 파일의 위치를 나타낸다.

'Properties' 객체를 생성한 후 'FileInputStream' 을 사용해 설정 파일을 읽어온다. 'pr.load(fis)' 메서드를 통해 파일의 내용을 메모리에 로드하고 이로써 설정 파일에 정의된 키-값 쌍이 'Properties' 객체에 저장된다.


3. 키와 벨류를 구분

설정 파일에서 모든 키를 가져와 순회하며 각 키에 대해 해당 값(클래스 이름)을 가져온다.


4. 벨류값을 통한 객체 생성
5. map객체에 키와 실제 객체들을 저장

'Class.forName(value)'로 클래스 이름을 사용해 클래스 객체를 로드한다.
'newInstance()' 메서드를 사용해 해당 클래스의 인스턴스를 생성한다.
이 인스턴스를 'cmdMap'에 키와 함께 저장한다. 이 'cmdMap'은 요청 타입에 따라 적절한 처리 클래스를 찾아내는 데 사용된다.


[전체코드]

package com.yong.controller;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.io.*;

public class YongController extends HttpServlet {
	
	private Map<String, CommandHandler> cmdMap;
	
	public YongController() {
		cmdMap = new HashMap<String, CommandHandler>();
	}
	
	@Override
	public void init() throws ServletException {
		String path = this.getServletContext().getRealPath("/WEB-INF/yongCommand.properties");
		System.out.println(path);
		
		Properties pr = new Properties();
		
		try {
			FileInputStream fis = new FileInputStream(path);
			pr.load(fis);
			fis.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		
		Iterator keys = pr.keySet().iterator();
		
		while(keys.hasNext()) {
			String key = (String)keys.next();
			String value = pr.getProperty(key);
			
			try {
				Class originClass = Class.forName(value);
				CommandHandler temp = (CommandHandler)originClass.newInstance();
				cmdMap.put(key, temp);
			} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
		        e.printStackTrace();
		    }
		}
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		userProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		userProcess(req, resp);
	}
	
	protected void userProcess(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
		String type = req.getRequestURI();
		if(type.indexOf(req.getContextPath()) == 0) {
			type = type.substring(req.getContextPath().length());
		}
		
		CommandHandler cmd = cmdMap.get(type);
		String goPage = cmd.process(req, resp);
		
		RequestDispatcher dis = req.getRequestDispatcher(goPage);
		dis.forward(req, resp);
	}
}

profile
안녕하세요!

0개의 댓글