작업 환경

 eGovFramework Version : 3.8

Eclipse Version : Oxygen.3a Release (4.7.3a)

JDK Version : 1.8


양방향 암호화 복호화를 해야 하는 경우에 사용하는 알고리즘으로 아리아(ARIA) 알고리즘에 대한 위키에 있는 설명을 참조하면

 아리아(ARIA) 대한민국 국가보안기술연구소에서 개발한 블록 암호 체계이다. ARIA라는 이름은 학계(Academy), 연구소(Research Institute), 정부 기관(Agency) 공동으로 개발한 특징을 함축적으로 표현한 것이다2004 산업자원부 KS 인증(KS X 1213:2004) 획득하여 현재까지 대한민국의 국가 표준 암호 알고리즘으로 기능하고 있으며2010  표준 하나가 되었다.


라고 되어 있습니다사용법은 상당히 간단하게 되어 있습니다.


1. pom.xml

다음 항목이 pom.xml 에 포함되어 있는지 확인을 하고 없으면 추가해 줍니다.

        <dependency>

            <groupId>egovframework.rte</groupId>

            <artifactId>egovframework.rte.fdl.crypto</artifactId>

            <version>${egovframework.rte.version}</version>

        </dependency>

 

 

2. globals.properties


globals.properties에 설정 값을 추가해 줍니다.

# Message digest algorithm using EgovPasswordEncoder..

crypto.password.algorithm=SHA-256

#crypto.plain.password=egovframe #이건 프로그램에 하드코딩 필요

# hashed password (ex: egovframe (SHA-256) => gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=)

crypto.hashed.password=gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=

Service 프로그램에서 사용하게 키값들 입니다.

 

3. context-ariacrypto.xml 추가

 

ARIA 알고리즘을 사용할 수 있도록 설정을 하기 위해 /resources/egovframework/spring/com/ 위치에 xml 파일을 생성 합니다.



egovframework aria 암호화


package explorer 로 보면 다음과 같은 위치 입니다.


egovframework aria 암호화


 

        <bean id="egov.propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

        <property name="locations">

            <list>

                <value>classpath:/egovframework/egovProps/globals.properties</value>

                <!-- value>file:/product/jeus/egovProps/globals.properties</value-->

            </list>

        </property>

    </bean>

   

    <bean id="passwordEncoder" class="egovframework.rte.fdl.cryptography.EgovPasswordEncoder">

        <property name="algorithm" value="${crypto.password.algorithm}" /><!-- default : SHA-256 -->

        <property name="hashedPassword" value="${crypto.hashed.password}" />

    </bean>

   

    <bean id="ARIACryptoService" class="egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl">

        <property name="passwordEncoder" ref="passwordEncoder" />

        <property name="blockSize" value="1025" /><!-- default : 1024 -->

    </bean>

   

    <bean id="digestService" class="egovframework.rte.fdl.cryptography.impl.EgovDigestServiceImpl">

        <property name="algorithm" value="SHA-256" /><!-- default : SHA-256 -->

        <property name="plainDigest" value="false" /><!-- default : false -->

    </bean>

 

 

4. package 및 파일 생성

이제 알고리즘을 이용하여 프로그램을 작성 하기 위해 그럴싸한 이름으로 service web 패키지를 생성 합니다.

package copycoding.com.util.crypto.service;


egovframework aria 암호화


package copycoding.com.util.crypto.web;


egovframework aria 암호화


service 에는 실제 암호화 복호화를 진행할 서비스 파일을 생성 합니다.

CryptoARIAService.java에 실제 암호 모듈을 넣고 CryptoARIAController.java에 화면에서 호출하는함수를 작성 합니다.

 

4.1 CryptoARIAService.java

 

@Resource(name="ARIACryptoService")

EgovCryptoService cryptoService;

       

@Resource(name = "passwordEncoder")

private EgovPasswordEncoder passwordEncoder;

       

public static String plainPassword = "egovframe";   

//EgovProperties.getProperty("crypto.plain.password");

public static String passwdAlgorithm = EgovProperties.getProperty("crypto.password.algorithm");

       

public String encryptData(String plainText) {

        String encodeText = null;

              

        try {

               byte[] encrypted = cryptoService.encrypt(plainText.getBytes("UTF-8"), plainPassword);

               encodeText = Base64.encodeBase64String(encrypted);

        } catch (UnsupportedEncodingException uee) {

            uee.printStackTrace();

        }

              

        return encodeText;

}

       

       

public String decryptData(String encodeText) {

        String plainText = null;

        try {

               byte[] base64dec = Base64.decodeBase64(encodeText);

               byte[] decrypted = cryptoService.decrypt(base64dec, plainPassword);

                      

                       plainText = new String(decrypted, "UTF-8");

        } catch (UnsupportedEncodingException uee) {

            uee.printStackTrace();

        }

       

        return plainText;

}

 

일반 텍스트를 받아 암호화 하는 함수와 encryptData(String plainText)  암호화된 텍스트를 받아 복호화 하는 함수 decryptData(String encodeText)를 구현 합니다.

 

4.2 CryptoARIAController.java


@Resource(name = "cryptoService")

private CryptoARIAService cryptoService;

       

@RequestMapping("/copycoding/cryptoAriaTest.do")

public void cryptoEncryptTest(ModelMap model) {

              

        String plainText = "암호화 해보아요!";

              

        String encryptText = cryptoService.encryptData(plainText);

        LOGGER.debug("encrypt :" + encryptText);

 

        plainText = cryptoService.decryptData(encryptText);

        LOGGER.debug("encrypt :" + plainText);

              

}

 

Service에 구현된 암호화와 복호화를 호출하여 처리를 하는 모듈을 만듭니다.

잘 작동 되는지 Debug 모드로 확인을 해 봅니다.

http://localhost:7001/CopyCoding/copycoding/cryptoAriaTest.do


egovframework aria 암호화


암호화가 잘 되었습니다.


egovframework aria 암호화


복호화도 잘 되는군요.

 

 

5. 전체 소스

 

CryptoARIAService.java


package copycoding.com.util.crypto.service;

 

import java.io.UnsupportedEncodingException;

 

import javax.annotation.Resource;

 

import org.apache.commons.net.util.Base64;

import org.springframework.stereotype.Service;

 

import egovframework.com.cmm.service.EgovProperties;

import egovframework.rte.fdl.cryptography.EgovCryptoService;

import egovframework.rte.fdl.cryptography.EgovPasswordEncoder;

 

@Service("cryptoService")

public class CryptoARIAService {

 

        @Resource(name="ARIACryptoService")

        EgovCryptoService cryptoService;

       

        @Resource(name = "passwordEncoder")

        private EgovPasswordEncoder passwordEncoder;

       

        public static String plainPassword = "egovframe";   

         public static String passwdAlgorithm = EgovProperties.getProperty("crypto.password.algorithm");

       

        public String encryptData(String plainText) {

               String encodeText = null;

              

               try {

                       byte[] encrypted = cryptoService.encrypt(plainText.getBytes("UTF-8"), plainPassword);

                       encodeText = Base64.encodeBase64String(encrypted);

               } catch (UnsupportedEncodingException uee) {

                   uee.printStackTrace();

               }

              

               return encodeText;

        }

       

        public String decryptData(String encodeText) {

               String plainText = null;

               try {

                       byte[] base64dec = Base64.decodeBase64(encodeText);

                       byte[] decrypted = cryptoService.decrypt(base64dec, plainPassword);

                      

                       plainText = new String(decrypted, "UTF-8");

               } catch (UnsupportedEncodingException uee) {

                   uee.printStackTrace();

               }

              

               return plainText;

        }

} 

 

CryptoARIAController.java


package copycoding.com.util.crypto.web;

 

import javax.annotation.Resource;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

 

import copycoding.com.util.crypto.service.CryptoARIAService;

 

@Controller

public class CryptoARIAController {

        private static final Logger LOGGER = LoggerFactory.getLogger(CryptoARIAController.class);

       

        @Resource(name = "cryptoService")

        private CryptoARIAService cryptoService;

       

        @RequestMapping("/copycoding/cryptoAriaTest.do")

        public void cryptoEncryptTest(ModelMap model) {

               String plainText = "암호화 해보아요!";

              

               String encryptText = cryptoService.encryptData(plainText);

               LOGGER.debug("encrypt :" + encryptText);

 

               plainText = cryptoService.decryptData(encryptText);

               LOGGER.debug("encrypt :" + plainText);

        }

} 


- copy coding -

작업환경

 eGovFramework Version : 3.8

Eclipse Version : Oxygen.3a Release (4.7.3a)

JDK Version : 1.8

1. 파일 업로드

 

1.1 화면 구성

 

egovframework에서 파일 업로드 기능을 찾아보면 화면 구현 방법은 2가지로 만들 수 있습니다업로드 파일의 최대 개수를 정하고 필요한 만큼만 선택 계속 선택해서 한번에 묶어 보내는 방법과 각각의 파일을 하나씩만 선택 할 수 있도록 file tag를 사용하여 보내는 방법이 있습니다.  첫 번째 방법은 파일의 개수를 정하고 하단이 파일명으로 늘어나는 것을 감안하여 디자인이 되어야 하고, 두 번째 방법은 사용하지도 않을 수 있는 전송할 파일의 수만큼 미리 입력 화면을 고정해야 하는 단점이 있습니다간단한 화면 구성을 살펴 보면 아래와 같습니다.



egovframework upload download


다중 파일 업로드는 파일선택 버튼이 한 개만 존재 하고 이 버튼을 이용하여 파일을 선택하면 하단에 계속해서 파일 리스트가 추가 됩니다잘못 선택된 파일이 있다면 delete 버튼으로 삭제 합니다그리고 파일 선택이 완료 되었으면 저장 버튼을 이용하여 선택된 파일들을 서버로 전달하면 됩니다.

 

단일 파일 업로드 방식은 필요한 개수만큼 파일선택 버튼을 추가하고 저장버튼을 클릭하여 선택된 파일들을 서버로 전달 합니다.

파일을 선택한 경우의 화면은 아래 이미지 처럼 보입니다.


egovframework upload download


다중파일은 이미지 4개를 선택하고 단일파일은 각각 파일을 선택해 보았습니다.

 

1.2  JSP 파일

 

1.2.1 다중 파일 업로드

 

다중 파일 업로드를 구현 하려면 상단에 js 파일을 하나 추가해야 합니다.


<script type="text/javascript" src="<c:url value='/js/egovframework/com/cmm/fms/EgovMultiFile.js'/>" ></script>


파일을 선택하는 부분은 일반 file tag를 사용하는데 <input type="hidden" name="atchPosblFileNumber" id="atchPosblFileNumber" value="5" /> 이런 식으로 최대 파일 개수를 입력 합니다여기서는 5개로 설정 하였습니다.


egovframework upload download


<input type="hidden" name="savePath" value="Globals.fileTest1Path" /> 이건 파일을 저장하기 위한 위치를 설정하는 부분으로 Server 부분 소스 설명에 나와 있습니다.

 

선택한 파일을 리스트로 보여주는 부분은 javascript로 구현이 되어 있습니다.


egovframework upload download


form 에서 최대 파일 개수를 정하지 않았다면 기본값을 설정할 수도 있고 여기서는 3으로 했습니다.

 

 

1.2.2 단일 파일 업로드

 

단일 파일 업로드는 기존에 사용하는 file tag와 동일 하게 테그 하나에 파일 하나를 추가하는 방식으로 JSP 파일을 작성 합니다.


egovframework upload download


1.3 Server 작업

 

1.3.1 설정


파일을 저장할 위치를 설정 합니다.

Globals.properties

 # 파일 업로드 경로(경로 설정은 반드시 절대경로를 사용해야함, 경로 뒤에 / 붙여 주어야함.)

Globals.fileStorePath =C:/egovframework/upload/

Globals.fileTest1Path =C:/egovframework/upload/filepath1/

Globals.fileTest2Path =C:/egovframework/upload/filepath2/


1.3.2 Controller 생성


임의의 controller를 생성하고 화면에서 호출하는 주소를 입력 합니다.


egovframework upload download


다중 또는 단일 파일 업로드로 화면에서 파일을 보내주면 Server에서는 동일한 로직으로 처리하기 때문에 하나의 함수만 작성하면 됩니다


egovframework upload download


파일을 폴더에 저장한 후에는 결과를 2개의 Table에 반영 합니다.


업로드 정보를 저장하고

select * from COMTNFILE;


egovframework upload download


실제 저장된 파일 정보가 저장 됩니다.

select * from COMTNFILEDETAIL;


egovframework upload download


단일 업로드도 동일한 방법으로 저장이 됩니다. 

 

2. 파일 다운로드

 

2.1 jsp 파일

 

파일 업로드 정보를 담고 있는 테이블에서 ATCH_FILE_IDFILE_SNparam으로 넣어주면 다운로드를 할 수 있습니다.


egovframework upload download


/cmm/fms/FileDown.do에서 넘겨준 param을 이용하여 FileVO에 담아 상세 정보를 이용하여 원래 파일 명을 찾아 다운로드를 진행 합니다.



3. 전체 파일 

3.1 jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

 

 

<script type="text/javascript" src="<c:url value='/js/egovframework/com/cmm/fms/EgovMultiFile.js'/>" ></script>

 

 

<title>Insert title here</title>

<link type="text/css" rel="stylesheet" href="<c:url value='/css/egovframework/com/com.css' />">

</head>

<body>

 

<br>

<br>

<br>

 

<h2>다중 파일 업로드</h2>

<form name="frm" method="post" action="<c:url value='/file/fileUpload.do'/>" enctype="multipart/form-data" >

   <input type="hidden" name="atchPosblFileNumber" id="atchPosblFileNumber" value="5" />

   <input type="hidden" name="savePath" value="Globals.fileTest1Path" />

  

   <table width="400px" cellspacing="0" cellpadding="0" border="1" >

           <tr>

            <td ><input name="file_1" id="egovComFileUploader" type="file" />

                <div id="egovComFileList"></div>

            </td>

           </tr>

           <tr>

            <td align="center">

                <input type="submit" value="저장">

            </td>

           </tr>

        </table>      

</form>

 

<!-- 첨부파일 업로드 가능화일 리스트설 Start..--> 

<script type="text/javascript">

var maxFileNum = document.getElementById('atchPosblFileNumber').value;

if(maxFileNum==null || maxFileNum==""){

        maxFileNum = 3;

}

var multi_selector = new MultiSelector( document.getElementById( 'egovComFileList' ), maxFileNum );

multi_selector.addElement( document.getElementById( 'egovComFileUploader' ) );

</script>

<!-- 첨부파일 업로드 가능화일 리스트 End.--> 

<p>

<h2>단일파일 업로드</h2>

<form id="frm2" action="<c:url value='/file/fileUpload.do'/>" method="post" enctype="multipart/form-data">

        <input type="hidden" name="savePath" value="Globals.fileTest2Path" />

        <table width="400px" cellspacing="0" cellpadding="0" border="1" >

               <tr>

                   <td >

                              <input type="file" name="file1" /><br>

                              <input type="file" name="file2" /><br>

                       </td>

               </tr>

               <tr>

                       <td align="center">

                              <input type="submit" value="저장">

                       </td>

           </tr>

        </table>

 </form>

 

<p>

<p>

<p>

 

 

<a href="javascript:fn_egov_downFile('FILE_000000000000201','0')">

 파일 다운로드

</a>

 

<script type="text/javascript">

 

        function fn_egov_downFile(atchFileId, fileSn){

               window.open("<c:url value='/cmm/fms/FileDown.do?atchFileId="+atchFileId+"&fileSn="+fileSn+"'/>");

        }

</script>

  

 

</body>

</html> 


3.2 Controller


package copycoding.com.util.file.web;

 

import java.util.List;

import java.util.Map;

 

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

 

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.support.SessionStatus;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

 

import egovframework.com.cmm.SessionVO;

import egovframework.com.cmm.service.EgovFileMngService;

import egovframework.com.cmm.service.EgovFileMngUtil;

import egovframework.com.cmm.service.FileVO;

 

@Controller

public class FileUploadDownloadController {

           @Resource(name="EgovFileMngService")

           private EgovFileMngService fileMngService;

          

           @Resource(name="EgovFileMngUtil")

           private EgovFileMngUtil fileUtil;

          

           @RequestMapping(value = "/file/fileUpDownloadTest.do")

           public String daumEditor(ModelMap model) throws Exception {

                     return "copycoding/util/FileUpDownload";

           }

          

           @RequestMapping(value = "/file/fileUpload.do")

           public String uploadSingleFile(

                                final MultipartHttpServletRequest multiRequest,

                                HttpServletRequest request,

                                SessionVO sessionVO,

                                ModelMap model,

                                SessionStatus status) throws Exception{

                      

                                String storePath = request.getParameter("savePath");

                                List<FileVO> result = null;

                                String atchFileId = "";

                                final Map<String, MultipartFile> files = multiRequest.getFileMap();

                               

                                if(!files.isEmpty()){

                                          // 파일 객체, 구분 값, 파일 순번, 파일ID, 저장경로

                                          result = fileUtil.parseFileInf(files, "upfile_", 0, "", storePath);

                                          //파일이 생성되고나면 생성된 첨부파일 ID를 리턴한다.

                                          atchFileId = fileMngService.insertFileInfs(result); 

                                }

                      

                                return null;

           }

}


- copy coding -

작업환경

 eGovFramework Version : 3.8

Eclipse Version : Oxygen.3a Release (4.7.3a)

JDK Version : 1.8


프로젝트를 진행하다 보면 업무를 구분하기 위하여 package를 여러개 만들어야 하는 상황이 발생 합니다.  특히 전자정부프레임워크를 사용하여 개발을 진행할 때에는 기존 egovframework package와 신규로 추가되는 package를 구분하여 작업을 해야 하는 상황이 자주 발생 합니다.  사실 신규 package를 추가하는 방법은 상당히 간단 합니다.

 

egovframework package


설정 xml 수정

base package와 관련된 설정 xml 파일 3개를 수정 합니다. 수정이라기 보다는 신규 package를 등록하는 작업을 진행 합니다. base-package를 등록하면 그 하단의 파일들이 등록이 됩니다.

 

- context-common.xml

/CopyCoding/src/main/resources/egovframework/spring/com/context-common.xml

 <context:component-scan base-package="egovframework, copycoding">

<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>

<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

</context:component-scan>

copycoding 이라는 package를 콤마를 이용하여 추가해주면 적용이 됩니다.


- egov-com-servlet.xml

/ CopyCoding/src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml

 <context:component-scan base-package="egovframework, copycoding">

<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>

</context:component-scan>

여기에도 콤마를 이용하여 추가하려는 패키지 최 상단명을 입력합니다.


위에 두개의 xml 파일을 수정하여 설정은 완료 되었고 그 외에 필요한 aspect 또는 filter등의 설정 파일이 있다면 그곳도 추가를 해주면 됩니다방법은 기존에 있는 설정을 복사하여 추가하면 됩니다.

 

context-aspect.xml

/admin/src/main/resources/egovframework/spring/com/context-aspect.xml

 <aop:config>

<aop:pointcut id="egov.serviceMethod" expression="execution(* egovframework.com..impl.*Impl.*(..)) or execution(* copycoding.com..impl.*Impl.*(..))" />

 

<aop:aspect ref="egov.exceptionTransfer">

        <aop:after-throwing throwing="exception" pointcut-ref="egov.serviceMethod" method="transfer" />

</aop:aspect>

</aop:config>


이렇게 or를 사용하여 추가해주면 설정이 끝나고 필요한 파일들을 추가해서 작업을 진행 합니다.


- copy coding -

eclipse jsp 미리보기

eclipse에서 JSPHTML 파일 편집 작업을 하려는 경우 기본적으로 상단에 미리보기가 나타납니다.


eclipse jsp html 미리보기


JSP 미리보기 숨기기

그런데 미리보기는 성능에도 문제가 되고 소스를 보기에도 불편하여 편집 작업을 진행 하기에 불편한 점이 있습니다간단한 설정으로 미리보기 창이 나타나지 않도록 할 수 있으며 반대로 하면 미리보기가 나타나도록 할 수 도 있습니다.

상단 메뉴에서 Window > Preferences를 선택 합니다.


eclipse jsp html 미리보기


Preferences 창 좌측 메뉴에서 General > Editors > File Associations를 선택 합니다.  


eclipse jsp html 미리보기


그리고 우측에 있는 파일 확장자에서 *.jsp를 선택 하고 하단의 Associated editors에서 그림과 같이 JSP Editor (locked by ‘JSP’ content type)...를 선택 합니다.


eclipse jsp html 미리보기


Default 버튼 클릭 하면 상단으로 이동을 하며 기본 값이 변경 됩니다Apply and Close 버튼 클릭 하여 선택 값을 반영 합니다


eclipse jsp html 미리보기


선택 값이 바로 반영되지 않고 열려있는 jsp 파일을 닫고 다시 열어보면 상단의 미리보기 화면이 사라져 있습니다.


HTML 미리보기 숨기기

*.htm, *.html 파일의 미리보기도 동일한 방법으로 작업을 진행 합니다.


eclipse jsp html 미리보기


*.htm*.html을 각각 선택 하고 HTML Editor를 선택한 상태에서 Default 버튼을 클릭 하면 편집 모드가 우선으로 반영이 됩니다.


1···345678

+ Recent posts