java에서 압축파일을 생성하기 위한 편리한 유틸들도 있지만 기본적인 java 기반으로 압축파일을 생성하는 예제를 작성해 보았습니다.

 

일단 임의의 폴더에 압축 테스트를 진행할 몇개의 파일들을 준비해 줍니다.

 

 

 

zip 파일도 일반 파일과 동일하게 입출력을 통하여 생성을 하기 때문에 입출력에 사용되는 IOStream들을 선언 합니다.

 

               FileInputStream fis = null;

               FileOutputStream fos = null;

               ZipOutputStream zos = null;

 

파일을 읽어오기 위한 스트림과 파일에 쓰기위한 스트림, 나머지 하나는 압축파일에 쓰기위한 스트림 이렇게 3개의 stream을 선언합니다.

3개의 stream을 보면 감이 잡히겠지만 FileInputStream으로 압축하려는 파일을 읽어오고 FileOutputStream으로 읽어온 데이터를 기록하는데 이것을 ZipOutputStream의 입력으로 보내서 쓰게되면 압축파일이 생성되는 프로세스 입니다.

 

간단한 내용이니 소스를 바로 보도록 합니다.

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;

 

 

public class ZipTest {

 

       public static void main(String[] args) {

               // TODO Auto-generated method stub

               FileInputStream fis = null;

               FileOutputStream fos = null;

               ZipOutputStream zos = null;

 

               String fileFolder = "C:/del/ziptest";

               File file = new File(fileFolder);

               File[] fileList = file.listFiles();

              

               try {

                      fos = new FileOutputStream("C:/del/ziptest/test.zip");

                      zos = new ZipOutputStream(fos);

                     

                      for(File f : fileList) {

                             fis = new FileInputStream(f);

                             ZipEntry zipEntry = new ZipEntry(f.getName());

                             zos.putNextEntry(zipEntry);

                            

                             byte[] bytes = new byte[1024];

                             int length;

                             while((length = fis.read(bytes)) >= 0) {

                                    zos.write(bytes, 0, length);

                             }

                             fis.close();

                             zos.closeEntry();

                      }

                      zos.close();

                      fos.close();

               } catch(IOException ie) {

                      ie.getMessage();

               }

       }

 }

 

 

폴더에 있는 압축하려는 파일 목록을 가져오는 부분의 소스는

 

               String fileFolder = "C:/del/ziptest";

               File file = new File(fileFolder);

               File[] fileList = file.listFiles();

 

이렇게 File[] 배열로 받아옵니다.

 

읽어온 파일을 기록하는 output 스트림의 방향을 zip으로 보내는 부분은

 

                      fos = new FileOutputStream("C:/del/ziptest/test.zip");

                      zos = new ZipOutputStream(fos);

 

여기입니다.

저장하려는 파일 위치와 파일명(C:/del/ziptest/test.zip)을 설정합니다.

 

폴더에 파일이 여러 개 이므로 for 문을 이용하여 파일을 하나씩 불러와 zos에 기록하면 작업이 완료 됩니다.

 

                   for(File f : fileList) {

                             fis = new FileInputStream(f);

                             ZipEntry zipEntry = new ZipEntry(f.getName());

                             zos.putNextEntry(zipEntry);

                            

                             byte[] bytes = new byte[1024];

                             int length;

                             while((length = fis.read(bytes)) >= 0) {

                                    zos.write(bytes, 0, length);

                             }

                             fis.close();

                             zos.closeEntry();

                      }

 

프로그램을 실행합니다. 압축파일이 생성되겠죠.

 

 

 

 

생성된 압축파일 test.zip을 열어보면 처음에 준비한 파일 3개파일이 압축되어 들어있는 것을 볼 수 있습니다.

 

 

- copy coding -

 

 

일반적으로 주별 통계를 구하기 위해서 date_format%U를 사용하는 경우가 있습니다.  만약 1개월 또는 년만 간의 통계를 작성하는 경우에는 이 기호를 사용해도 되지만 연속된 기간에 대한 데이터를 사용하여 통계를 작성하게 되면 년도가 넘어서는 기간에서는 통계가 제대로 나타나지 않게 됩니다.

 

 

테스트를 진행하기 위해 2023년에서 2024년을 넘어서 계속해서 주별 통계를 구해보도록 합니다.

 

 

일단 DB에 어떤 데이터들이 들어있는지 확인해 봅니다.

 

SELECT *
FROM test.statistics
ORDER BY INSERT_DT

 

 

 

 

위와 같이 2023 11, 12월 그리고 2024 1월에 데이터가 들어있습니다.

이제 '%Y%U'를 사용해서 일반적인 방법으로 통계를 작성해 보겠습니다.

 

// 주간통계
SELECT DATE_FORMAT(DATE_SUB(INSERT_DT, INTERVAL (DAYOFWEEK(INSERT_DT)-2) DAY), '%Y/%m/%d') as start,
       DATE_FORMAT(DATE_SUB(INSERT_DT, INTERVAL (DAYOFWEEK(INSERT_DT)-8) DAY), '%Y/%m/%d') as end,
       DATE_FORMAT(INSERT_DT, '%Y%U') AS `week`,
       sum(VISIT_CNT)
FROM test.statistics
GROUP BY week;

 

 

위의 쿼리는 주의 시작을 일요일로 하고 토요일 종료하는 경우의 통계입니다.

 

 

 

조회 결과에서 week 컬럼을 보면 년(year)+주번호(week number)로 잘 나와있지만 첫번째 컬럼의 start에는 날짜가 2023년을 넘어가면서 2023년의 마지막 주와 2024년의 첫번째 주의 시작이 같은 주에 맞물리게 되어 결과값이 중복되게 나오게 됩니다.

 

 

이번에는 주번호(week number)를 무시하고 통계를 구해보도록 하겠습니다.

여러 방법이 있겠지만 2단계를 통하여 구하도록 합니다.

먼저 입력된 날짜(INSERT_DT)의 시작 주일(이번에는 한주의 시작을 월요일로)인 월요일과 주의 마지막 요일인 일요일의 날짜 컬럼을 추가해서 목록을 조회합니다.

 

        select
        ADDDATE( INSERT_DT, - WEEKDAY(INSERT_DT) + 0 ) AS MONDAY
        ,ADDDATE( INSERT_DT, - WEEKDAY(INSERT_DT) + 6 ) AS SUNDAY
        ,INSERT_DT
        ,VISIT_CNT
        FROM test.statistics
        ORDER BY INSERT_DT
 

 

 

 

 

DB에 있는 데이터의 입력일을 기준으로 월요일과 일요일의 날짜 컬럼을 구하여 조회가 되었습니다.

각각의 데이터에 대한 주의 시작일과 종료일을 구했으니 다음은 그냥 월요일끼리 그룹으로 묶어주기만 하면 되겠죠

  

SELECT
 dd.monday
 ,dd.sunday
 ,sum(VISIT_CNT)
 
FROM
(
        select
        ADDDATE( INSERT_DT, - WEEKDAY(INSERT_DT) + 0 ) AS MONDAY
        ,ADDDATE( INSERT_DT, - WEEKDAY(INSERT_DT) + 6 ) AS SUNDAY
        ,INSERT_DT
        ,VISIT_CNT
        FROM test.statistics
        ORDER BY INSERT_DT
) DD
GROUP BY DD.Monday

 

이렇게 처음에 구한 목록을 월요일로 그룹화 하면 간단하게 주별 통계를 구할 수 있습니다.

 

 

 

 

동일한 데이터에 대해 월간 통계도 비슷한 방법을 사용하면 쉽게 구할 수 있습니다.

먼저 날짜에 해당하는 년+월의 컬럼을 추가합니다.

 

        SELECT
            DATE_FORMAT(INSERT_DT, '%Y%m') AS YM
               , VISIT_CNT
        FROM test.statistics
        ORDER BY INSERT_DT 

 

 

 

그리고 구해진 년월을 그룹으로 묶어주면 월별 통계를 구할 수 있습니다.

 

SELECT dd.YM
    , SUM(dd.VISIT_CNT) AS SM
FROM(
        SELECT
            DATE_FORMAT(INSERT_DT, '%Y%m') AS YM
               , VISIT_CNT
        FROM test.statistics
        ORDER BY INSERT_DT
)DD
GROUP BY DD.YM
 

 

 

- copy coding -

 

 

datepicker는 급하게 기능을 구현해야 하거나 예쁜 디자인이 필요 없이 간단하게 달력창을 만들어서 사용할 때 적용하기 편합니다.

datepicker에 대해 가장 기본적인 설정부터 조금씩 살을 붙여 나가면서 사용 방법에 대해 알아봅니다.

 

1. 기본 기능 설정

 

우선 datepicker를 사용하기 위해서는 아래와 같은 jquery가 필요합니다.

 

 

<link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

 

그리고 HTML 태그를 이용하여 날짜를 입력 받기 위한 text input을 하나 만들어 줍니다.

 

<body>

    <label for="startDate">Date :</label>

    <input type="text" name="start_dt" id="start_dt" size="15" maxlength="15" readonly="readonly" />

    <input type="button" value="send" onclick="send();">

</body>

 

그리고 javascript에서 input 입력과 datepicker을 기본적 값으로 설정하고 서로 연결 시켜주면 바로 달력창을 사용할 수 있습니다.

 

<script type="text/javascript">

 $(document).ready(function () {

    $.datepicker.setDefaults();

    $("#start_dt").datepicker();

});

 </script>

 

 

웹 브라우저에서 실행하고 input 박스를 클릭하면 아래와 같은 가장 기본적인 달력창을 확인할 수 있고 날짜를 선택해서 input 창에 값을 입력 받습니다.

 

 

가장 기본적인 설정으로는 [//]의 형식으로 날짜가 입력됩니다.

03/21/2024

우리는 이렇게 사용하지 않으니 수정하려면 날짜 형식을 설정하는 값을 하나 추가합니다.

 

    $.datepicker.setDefaults({

        dateFormat: 'yy-mm-dd',

    });

 

다시 실행해서 확인해 봅니다.

 

 

 

 

날짜가 설정한 형식으로 잘 입력이 되었습니다.

 

$.datepicker.setDefaults() 로 정의된 함수에 추가하는 설정 값은 공통으로 적용되는 설정입니다.

하나의 페이지에 여러 개의 달력 창을 만들어 사용하는 경우 모든 달력창에 동일한 설정 값이 적용됩니다.

만약 하나의 페이지에 여러 개의 달력창을 사용하는데 각각 또는 일부 달력창에는 다른 형태의 설정 값을 적용해서 사용하고 싶은 경우에는 배열 변수를 필요한 만큼 생성해서 서로 다른 설정을 정의한 후 필요한 달력 창에 적용해주면 됩니다.

 

예를 들어 var datepicker_set1 변수를 하나 생성하고 새로운 달력창(end_dt)을 추가한 후 설정을 반영해보도록 하겠습니다.  날짜 구분을 사선으로 구분하는 설정입니다.

 

    var datepicker_set1 = {

        dateFormat: 'yy/mm/dd',

    }

    $("#end_dt").datepicker(datepicker_set1);

 

input 박스를 클릭해서 날짜를 입력 받으면 바로 확인 가능합니다.

 

 

 

이런 식으로 처음 작업해본 start_dt와는 다른 결과 값을 얻기 위해 별도의 설정 값 적용하는 것이 가능 합니다.

물론 변수를 생성해서 사용하는 것이 혼란스럽다면 아래처럼 값을 직접 입력해도 됩니다.

 

    $("#end_dt").datepicker({dateFormat : ‘yy/mm/dd’});

 

 

 

2. 한글 사용

 

 

이번에는 datepicker 달력창에 한글을 사용하는 방법입니다.

한글 추가라고 해서 특별한 건 없고 지금까지 작업한 소스에 아래 설정을 추가해서 월과 요일을 한글로 변경할 수 있습니다.

 

 

        monthNames: ['1(JAN)','2(FEB)','3(MAR)','4(APR)','5(MAY)','6(JUN)',

        '7(JUL)','8(AUG)','9(SEP)','10(OCT)','11(NOV)','12(DEC)'],

        dayNamesMin: ['','','','','','',''],

 

 

브라우저에서 어떻게 나오나 확인해 보겠습니다.

 

 

 

 

 

입력한 값이 그대로 노출되기 때문에 수정이 필요하면 바로 고치면 됩니다.

 

 

이번에는 년과 월을 선택하는 방법을 변경하는 설정을 추가해 보겠습니다.

지금까지는 좌우측 끝부분에 있는 버튼을 이용해서 월을 이동하는 방식이었는데 셀렉트 박스로 년과 월을 변경하는 방법입니다.

아래에 있는 설정을 추가합니다.  물론 전체 또는 필요한 달력창만 설정이 반영하도록 할 수 있습니다.

changeXX라는 설정은 년월을 변경하겠다는 것이고 추가로 월의 값을 한글로 수정할 수 있도록 한글 월을 적어주도록 합니다.

 

        changeMonth: true,

        changeYear: true,

        monthNamesShort: ['1','2','3','4','5','6',

        '7','8','9','10','11','12'],

 

monthNamesShort은 셀렉트 박스에서 보여주는 월 명칭입니다.  생략하면 기본값으로 영문이 나오게 됩니다.  값은 입력한 한글이 그대로 노출되니 필요에 따라 수정하면 됩니다.

 

 

년 또는 월을 선택하기위해 방형버튼을 여러 번 누르지 않고도 바로 선택을 할 수 있습니다.

 

 

 

3. 버튼 추가

 

달력창을 보다 유용하게 사용하고 커스터마이징을 하는 방법으로 하단에 버튼을 추가해서 작업을 할 수 있습니다.

 

        showButtonPanel: true,

        currentText: "이번달",

        closeText: '닫기',

 

이 설정은 달력창 아래에 버튼을 추가하도록 하며 버튼의 기본 값은 영문으로 current close로 나오는데 이를 한글로 변경해서 볼 수 있습니다.

 

 

 

[이번달] 버튼은 다른 년 월을 선택했다가 다시 현재의 날짜로 돌아오려는 경우 사용하는 버튼입니다.

 

[닫기] 버튼은 그냥 달력창을 닫기만 하는 용도인데 내부적으로 함수를 가지고 있습니다.  만약 다른 기능을 추가하려면 아래와 같이 함수에 기능을 추가 해서 사용이 가능 합니다.

여기서는 선택한 값을 alert으로 나오도록 하는 단순 작업인데 필요에 따라 복잡하게 하면 되겠죠.

 

        onClose: function(dateText, inst ) {

            alert(dateText);

        }

 

[닫기] 버튼을 클릭해 볼까요?

 

 

 

 

 

 

좀더 많은 내장된 함수와 기능들은 홈페이지를 방문하면 찾아볼 수 있습니다.

 

https://jqueryui.com/datepicker/

 

소스도 공개되어 있고 API documentation에 가면 다양한 기능 목록을 확인할 수 있습니다.

 

 

지금까지 작업한 전체 소스

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>

   

<link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

 

<script type="text/javascript">

 

var startDate = "";

var endDate ="";

 

$(document).ready(function () {

 

    $.datepicker.setDefaults({

        dateFormat: 'yy-mm-dd',

        monthNames: ['1(JAN)','2(FEB)','3(MAR)','4(APR)','5(MAY)','6(JUN)',

        '7(JUL)','8(AUG)','9(SEP)','10(OCT)','11(NOV)','12(DEC)'],

        dayNamesMin: ['','','','','','',''],

    });

 

    $("#start_dt").datepicker();

 

    var datepicker_set1 = {

        changeMonth: true,

        changeYear: true,

        monthNamesShort: ['1','2','3','4','5','6',

        '7','8','9','10','11','12'],

        showButtonPanel: true,

        currentText: "이번달",

        closeText: '닫기',

 

    }

    $("#end_dt").datepicker(datepicker_set1);

});

</script>

</head>

<body>

    <label for="startDate">Date :</label>

    <input type="text" name="start_dt" id="start_dt" size="15" maxlength="15" readonly="readonly" />

    <input type="text" name="end_dt" id="end_dt" size="15" maxlength="15" readonly="readonly" />

    <input type="button" value="send" onclick="send();">

</body>

</html>

 

- copy coding -

 

 

Visual Studio Code로 파일을 불러왔는데 한글이 깨지면서 아래처럼 모두 물음표로 나오는 경우가 있습니다.

 

    //id �� �� ����

    $("#input_id").val("set input Value by id");

    //class �� �� ����

    $(".input_class").val("set input Value by class");

    //name���� �� ����

    $('input[name="input_name"]').val("set input Value by name");

 

Visual Studio Code 프로그램의 언어 설정은 프로그램 하단 우측을 보면 확인하면 알 수 있습니다.

 

 

그림에서 보이는 것처럼 현재 VS Code의 언어 설정은 UTF-8로 되어있지만 한글이 깨지는 경우입니다.

이런 경우 불러온 파일의 생성을 UTF-8가 아닌 다른 언어로 설정하여 작업했기 때문에 한글이 깨지는 상황입니다.

 

원래의 한글 인코딩을 찾기 위해서는 하단에 있는 인코딩 상태 값의 [UTF-8]을 클릭하면 상단 가운데에 다음처럼 [Reopen with Encoding] 메뉴를 볼 수 있습니다.

 

 

 

[Reopen width Encoding]을 클릭하면 문서의 인코딩을 변경할 수 있는 character set 값들이 나오는데

 

 

 

가능하면 한글 인코딩 설정을 먼저 선택해 보고 안되면 가능성 있는 인코딩 값을 선택합니다.

목록에서 [Korean (EUC-KR)을 찾아서 선택해 보았습니다.

 

    //id 설정

    $("#input_id").val("set input Value by id");

    //class 설정

    $(".input_class").val("set input Value by class");

    //name으로 설정

    $('input[name="input_name"]').val("set input Value by name");

 

이제 한글이 제대로 보이는군요.

 

- copy coding -


123456···119

+ Recent posts