반응형

시스템에서 타임존이 맞지 않을 때 강제로 설정하는 방법


+시간 타임존 timezone 문제

CentOS

1. 시스템 및 DB 시간
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# date()
=>KST

DB>select @@system_time_zone;
=>System time zone : KST

2. Tomcat 시간 설정
/etc/init.d/tomcat7 스크립트에 아래 내용 추가
export JAVA_OPTS="-Duser.timezone=GMT+09:00"

catalina.sh에 아래 추가
JAVA_OPTS="$JAVA_OPTS -Duser.timezone=GMT+09:00"



반응형


+tomcat의 구동 스크립트에 환경변수를 추가하여 java 메모리튜닝 및 외부 라이브러리 경로 설정을 한다.


구동 스크립트 경로: /usr/tomcat7/bin/catalina.sh

위 스크립트 가장 앞 부분에 추가한다.
보통 외부 라이브러리 경로는 /usr/local/lib에 추가한다. 그곳에 *.so 동적 라이브러리들을 추가하고 아래와 같이 LD_LIBRFARY_PATH에 추가해 준다.

#!/bin/sh

export LD_LIBRARY_PATH=.:/usr/lib/oracle/12.1/client64/lib:/usr/lib:/usr/local/lib
export CLASSPATH=/usr/java/latest/jre/lib/ext:/usr/java/latest/lib/tools.jar
JAVA_OPTS="-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -Djava.library.path=/usr/local/lib -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"

export TOMCAT_HOME=/usr/tomcat7
export CATALINA_HOME=/usr/tomcat7
export CATALINA_BASE=/usr/tomcat7
export CATALINA_PID=/usr/tomcat7/bin/tomcat.pid




+ 톰캣 튜닝
# vi /usr/tomcat/conf/server.xml


connectionTimeout="5000" 
     타임아웃으로 기본 60초 (60000) 이다. 10초이내 권장
maxThreads="100"
     tomcat의 최대 쓰레드 수. 최대 접속 가능한 active user수
acceptCount="100"
     tomcat thread full일 경우 대기 queue의 길이
disableUploadTimeout="true"
     데이터 업로드 할 때 사이즈가 크면 timeout이 걸릴수 있음. 이를 방지.
maxConnection="8192"
     tomcat이 유지하는 최대 접속 수.
     


-listner 설정
루트 계정으로 실행 못하게 막기
 <Listener className="org.apache.catalina.security.SecurityListener" checkedOsUsers="root" /> 

-Connector 설정
protocol="org.apache.coyote.http11.Http11Protocol"
acceptCount="10"
enableLookups="false"
compression="off"
maxConnection="8192"
maxKeepAliveRequest="1"
maxThread="100"
tcpNoDelay="true"

예)
<Connector port="8080" address="localhost" maxThreads="250" maxHttpHeaderSize="8192" emptySessionPath="true" protocol="HTTP/1.1" enableLookups="false" redirectPort="8181" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />


       <Connector port="8443" protocol="HTTP/1.1"
                SSLEnabled="true" scheme="https" secure="true"
                clientAuth="false" sslProtocol="TLS"
                keystoreFile="/var/www/tomcat.keystore" keystorePass="패스워드"
                URIEncoding="UTF-8"
                maxThreads="250" maxHttpHeaderSize="8192"
                enableLookups="false" acceptCount="100" connectionTimeout="20000"
                disableUploadTimeout="true" 
     compression="off"
     tcpNoDelay="true"
/>


+JVM 튜닝
vi $CATALINA_HOME/bin/catalina.sh
첫 줄에 JAVA_OPTS 추가.
-Xmx1024m –Xms1024m -XX:MaxNewSize=384m -XX:MaxPermSize=128m

메모리 부족시 덤프를 뜨게하여 추적할 수 있다.
-XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof
-XX:ParallelGCThreads=2 -XX:-UseConcMarkSweepGC

예)
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"



+++ OS 튜닝 필요

+ 사용자 최대 파일(소켓 포함) 오픈 개수
ulimit -a로 확인 가능
소켓도 파일 이므로 최대 사용 개수가 제한된다....

:변경 방법
#sysctl -w fs.file-max=372738

아래도 작업
#vi /etc/sysctl.conf
fs.file-max=372738

#sysctl -p

; 변경 확인
sysctl fs.file-max
or
cat /proc/sys/fs/file-max

-최대 파일 오픈 개수 확인 ; ulimit -a
open files ; 1024
>변경방법
#vi /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
; xxxx는 65535 등...
ulimit -a 로 확인

-backlog 최대값 ; sys/socket.h
SOMAXCONN 값을 참조
>변경 방법
sysctl -a | grep somaxconn     ; 확인
sysctl -w net.core.somaxconn=2048



'Develop > Java' 카테고리의 다른 글

tomcat 프로세스 모니터링. 죽으면 다시 시작  (0) 2018.03.06
CentOS, tomcat 타임존 문제  (2) 2018.03.06
jqGrid(2) row(줄) 색상 변경/값 변경  (0) 2016.01.22
jqGrid (1)  (0) 2016.01.19
한글 인코딩 UTF8  (0) 2015.06.02
반응형




DB에서 얻어오는 필요한 데이터필드는 일단 정의해 두고, hidden으로 보이지 않게 한다.
이후에 load 완료시 색깔을 변경하거나 값을 변경할 수 있다.

+ 셀 데이터값에 따라 줄 색깔 변경하기 ; setRowData
   jqGrid(... ) 내부에 아래 콜백을 추가한다.

   , loadComplete : function() {
             var ids = $("#curlist").getDataIDs() ;
             $.each( ids, function(idx, rowId) {
                            rowData = $("#curlist").getRowData(rowId) ;
                          if ( rowData.RESULT == rowData.RESULTHU ) {
                          } else {
                                   // 색깔 변경하기
                               $("#curlist").setRowData(rowId, false, {background:"#ff0000"}) ;
                          }
                       }
                 ) ;             
        }


+ 셀 값 변경하기 ; setCell or formatter
(필드명 그대로 사용하지 않고, 다른 필드의 조합으로 해당 값을 만들 경우)
필요한 필드들을 일단 가져오고, hidden으로 해 두고, 실제 사용할 필드명을 정의해서 afterInsertRow나 loadComplete에서
처리해 준다.

    $("#reglist").jqGrid({ 
        //ajax 호출할 페이지
        url:'GetRegSign',
        //로딩중일때 출력시킬 로딩내용
        loadtext : '로딩중..',
        //응답값
        datatype: "json",
        mtype : 'POST',
        postData:{},
        height: 250,
        colNames:['ID','등록일', 'TotalCnt','OkCnt', 'FailCnt','Total'],
        colModel:[
            {name:'SIGNID', width:'270'},
            {name:'REGDATE', formatter:function(cellvalue, options, rowobj){
                 return dateconverthu(cellvalue) ;
            }},
            {name:'AUTHCNT', width:'50', hidden:true},
            {name:'AUTHOKCNT', width:'50', hidden:true},
            {name:'AUTHFAILCNT', width:'50', hidden:true},
            {name:'TOTAL', width:'50'}
            ],
        caption: "등록서명",

loadComplete : function() {
             var ids = $("#reglist").getDataIDs() ;
             $.each(ids, function(idx, rowId) {
                            rowData = $("#reglist").getRowData(rowId) ;
                            if ( !rowData.AUTHCNT ) rowData.AUTHCNT="0" ;
                            if ( !rowData.AUTHOKCNT ) rowData.AUTHOKCNT="0" ;
                            if ( !rowData.AUTHFAILCNT ) rowData.AUTHFAILCNT="0" ;
                              // 셀 값 설정하기
                            $("#reglist").setCell(rowId, 'TOTAL', rowData.AUTHCNT
                   +" ("+rowData.AUTHOKCNT+"/"+rowData.AUTHFAILCNT+")") ;
                       }
                 ) ;
        }






'Develop > Java' 카테고리의 다른 글

CentOS, tomcat 타임존 문제  (2) 2018.03.06
tomcat 외부라이브러리 경로 설정 및 톰캣 튜닝  (0) 2018.03.06
jqGrid (1)  (0) 2016.01.19
한글 인코딩 UTF8  (0) 2015.06.02
tomcat에서 한글 인코딩 UTF8기준  (0) 2015.06.02
반응형

++ jqgrid
jQueryUI  ; jquery를 이용한 UI  프레임워크.
위 사이트에서 gallery탭에 원하는 테마를 선택하고, 다운로드한다. 페이지 이동되면 맨 밑에 다운로드버튼 있음.

jqGrid ; 플러그인. 대량의 데이터를 테이블로 웹에 표현시 사용. jQuery로 된 플러그인임.
          ajax 기반 자바스크립트 컨트롤러, jquery-ui를 이용.
     페이징, 정렬 등의 기능 제공.

+ 사용 방법

1. webcontent 폴더 내부에 jqgrid 폴더 생성, jqueryui 폴더 생성
jqgrid, jqueryui 압축 파일을 풀어서 위 생성한 폴더로 복사.

2. 연결

-jsp 페이지에 다음과 같이 코딩.

< script src ="js/jquery-1.11.0.js"></script >
<!-- jqGrid 연동코드 -->
<link rel="stylesheet" type="text/css" media="screen"
       href="jqueryui/jquery-ui.css" />
<link rel="stylesheet" type="text/css" media="screen"
       href="jqgrid/css/ui.jqgrid.css" />
<!--
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
 -->
<script src="jqueryui/jquery-ui.js" ></script>
<script src="jqgrid/js/jquery.jqGrid.min.js" ></script>
<!--  -->

 헤더부에 위와 같이 필요한 js를 로딩하도록 한다.


<script>
$(function(){
    $("#loglist").jqGrid({ 
        //ajax 호출할 페이지
        url: 'GetLog',
        //로딩중일때 출력시킬 로딩내용
        loadtext : '로딩중..',
        //응답값
        datatype: "json",
        mtype : 'POST',
        postData:{},
        height: 250,
        colNames:[ 'ID','등록일' , '등록자' , '장치' , '데이터' ],
        colModel:[
            {name: 'LOGID'},
            {name: 'REGDATE'},
            {name: 'MOBILE'},
            {name: 'REGDEVTYPE'},
            {name: 'DATA', hidden:true }
        ],
        caption: "로그"
    });
});
</script>

<div id="divloglist">
       <table id= "loglist">
       </table>
</div>

위 ajax로 된 GetLog URL은 servlet으로 DB조회 데이터를 json 형태로 위 colModel에 나온 name의  필드명으로 데이터가 조회되도록 한다.




+ 레코드(라인)row 불러오기
-----------------------------------------------------------------------------------
(1) 단일 Row 일 경우 선택하여 값을 불러오기
 var obj = $("#ListTable");
var rowId = obj.jqGrid("getGridParam", "selrow");
var value = obj.jqGrid('getCell', rowId, 'ColumnName');
alert(value);
 
(2) MultiSelect 다중 Row 일 경우 값 출력 해보기
var obj = $("#ListTable");
var idx = obj .jqGrid('getGridParam', 'selarrrow');
 
for(var i = 0; i < idx.length;i++)
{
var value = obj.jqGrid('getCell', idx[i], ''ColumnName’);
alert(value);
}
-----------------------------------------------------------------------------------


++ 멀티 셀렉트 된 결과 가져오기
-----------------------------------------------------------------------------------

$("#OutputGrid").getGridParam('selarrrow');
를 사용 현재선택되어진 로우의 id값을 가져올수 있다.
리턴값은 Array
var ids = $("#OutputGrid").jqGrid('getDataIDs');
는 전체 로우의 id값을 가져온다      

루프를 돌면서 id값을 비교하여 존재한다면 선택된어진 로우이고 없다면 선택 안 된 로우이다.


function setErp() {
        var message = "";
        var id = $("#OutputGrid").getGridParam('selarrrow');
        var ids = $("#OutputGrid").jqGrid('getDataIDs');
        var dat = "";
        var count = 0;

// 이렇게 하거나
        for (var i = 0; i < ids.length; i++) {
            var check = false;
            $.each(id, function (index, value) {
                if (value == ids[i])
                    check = true;
            });
            if (check) {
                var rowdata = $("#OutputGrid").getRowData(ids[i]);
                dat += rowdata.ORDER_CD + ',' + rowdata.ORDER_SEQ + '/';
                count++;
            }
        }
// 또는 이렇게 간단하게.
$.each(id, function(index,value) {
var rowdata = $("#OutputGrid").getRowData(value) ;
dat += rowData.ORDER_CD+','+rowdata.ORDER_SEQ+'/';
count++ ;
}) ;


     $("#strOrder").val(dat);
     $("form").submit();
 }


* jqgrid multi select option 처리 multiselect: true

jQuery("#OutputGrid").jqGrid({
        url: ''      
datatype: 'json',
        mtype: 'POST',
        height: 500,
        rowNum: 0,
        hidegrid: false,
        rowList: [10, 20, 30],
        altRows: true,
        altclass: 'EvenRowClass',
        colNames: [1, 2, 3, 4, 5, 6],
        colModel: [
        { name: 'CUSTOMER_CD', index: 'CUSTOMER_CD', width: 80, sortable: false, align: 'center' },
        { name: 'NAME', index: 'NAME', width: 70, sortable: false, align: 'center' },
        { name: 'KIND_NM', index: 'KIND_NM', width: 30, sortable: false, align: 'center' },
        { name: 'MODEL_NM', index: 'MODEL_NM', width: 130, sortable: false, align: 'left' },
        { name: 'ORDER_CD', index: 'ORDER_CD', width: 1, sortable: false, align: 'center', hidden : true },
        { name: 'ORDER_SEQ', index: 'ORDER_SEQ', width: 1, sortable: false, align: 'center', hidden: true }
        ],
        viewrecords: true,
        multiselect: true
    });







반응형


인코딩 변경을 하려고 보통 이렇게 하는데 이것은 잘못된 결과를 발생시킨다.

String strutf8 = new String(str.getBytes("utf-8"), "euc-kr") ;

getBytes는 지정된 charset의 byte array로 변환하는 것이고, String() constructor에서는 입력받은 데이터를 지정한 charset으로 인식하여 스트링을 만들겠다는 것이다. 즉, 원하는대로 charset 변경이 안 이루어진다.!!!!


타 시스템에서 다른 인코딩(euc-kr)을 사용하고 있는데 연동을 해야하는 일이 있었다. 부득이하게 charset 변경을 해야해서 바이너리값을 찍어서 직접 비교해봤다.

아래는 테스트 결과 성공.


+ UTF-8 -> euc-kr

//이클립스 환경설정의 인코딩 스타일이 UTF-8로 지정된 경우.
String utfstr = “한글인코딩" ;

Charset utf8charset = Charset.forName(
"UTF-8");
Charset iso88591charset = Charset.forName("euc-kr");
ByteBuffer inputBuffer = ByteBuffer.wrap(utfstr.getBytes());

// decode UTF-8
CharBuffer data = utf8charset.decode(inputBuffer);
// encode ISO-8559-1
ByteBuffer outputBuffer = iso88591charset.encode(data);
byte[] outputData = outputBuffer.array();

System.out.println("euckr?="+bytesToHex(outputData));

<끝>

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
   
 char[] hexChars = new char[bytes.length * 2];
   
 for ( int j = 0; j < bytes.length; j++ ) {
       
 int v = bytes[j] & 0xFF;
        hexChars[j * 2] =
 hexArray[v >>> 4];
        hexChars[j * 2 + 1] =
 hexArray[v & 0x0F];
    }
   
 return new String(hexChars);
}



반응형

JAVA 기반 WAS 개발시에 한글이 종종 깨지는 경우가 많다. 이런 경우 해결하기 위해 상당한 시간이 소요될 수 있다. 한글이 깨지는 원인이 여러 가지 있을 수 있어서 설정하는 부분도 여러군데이다. 

UTF-8 인코딩 방식을 기준으로 나름대로 정리. 


+ 한글이 깨질때...


1. 이클립스에서 소스(html, jsp, java 등) 저장시 인코딩 포맷을 UTF-8로 설정한다.

2. 받은 스트링을 byte []로 변환시 인코딩을 지정하지 않으면, 시스템 디폴트 인코딩으로 되어서 깨질 수 있다.

String str="한글테스트"; 
byte[] buf = str.getBytes() ;
byte[] buf2 = str.getBytes("UTF-8") ; // 이렇게 한다. ; UNICODE 스트링을 해당 타입으로 인코딩해 준다.

String str2 = new String(buf2, "UTF-8") ;     // 이렇게 받는다. UTF-8 형식으로 알고, 디코딩하라는 의미. (인코딩(변환)하는게 아님)

3. tomcat 서버 설정 (GET방식 안쓰면 안 해도 됨)
HTTP body의 입력 스트림은 기본으로 UTF-8을 이용하여 디코딩한다. 그러나, URL은 ISO-8859-1로 디코딩한다.
브라우저에서 폼 데이터는 기본적으로 UTF-8로 인코딩하므로 POST 전송해도 문제가 없는 것이다. 그러나, GET 방식이면 당연히 문제가 생긴다. 이를 한 번에 해결하려면 아래와 같이 URL 인코딩 방식을 변경해주면 가능하다.

server.xml에서 사용하는 포트 8080, 8443 등 Connector 부분에 URIEncoding을 지정한다.
<Connector port="8080" ... URIEncoding="UTF-8" />

아파치와 연결하기 위해 mod_jk를 사용한다면 아래와 같이 한다.
<Connector port="8009" protocol="AJP/1.3" URIEncoding="UTF-8" />

JSP상에서는 아래와 같이 사용하면 된다.
<a href="show.html?param= <%=java.net.URLEncoder("한글테스트", "UTF-8")%>"> link </a>

4. java에서 데이터 받는 부분 인코딩 설정을 한다.
doPost(HttpServletRequest request, ...) {
request.setCharacterEncoding("UTF-8") ;     // 한글 수신을 제대로 하기 위함. 이후 request 데이터 변수 사용.
}

응답시에는 
response.setContentType("application/json; charset=utf-8") ;
주의사항!!!! (강조!!!)
반드시 PrintWriter out = response.getWriter(); 전에 위의 설정을 해 줘야 한다. 순서가 바뀌면  동작하지 않는다... 

-JSP에서는 다음과 같이한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>


5. jdbc & mysql ; DB에 들어갈 때 깨지면 다음을 확인한다.

-java에서 mysql 접속시, 인코딩 방식 지정.
String url="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8";
Connection con = DriverManager.getConnection(url, "id", "password") ;

-mysql에서 테이블 생성시 인코딩 지정.
CREATE TABLE tablename (
col VARCHAR(100)
) DEFAULT CHARSET=utf8 ;

또는
CREATE TABLE ...
()  COLLATE='utf8_general_ci'

ENGINE=InnoDB
AUTO_INCREMENT=40;


6. ajax에서 한글설정
        var jsonData1 = JSON.stringify ({
              CMDID: "LIST",
              logonid : logonid }) ;
       $.ajax( {
              url: "/servicetest/apitest",
              type: "POST",
              data : jsonData1,
              contentType : "application/json; charset=UTF-8" ,
              dataType : 'json',
              success : function(data) ...
           });

7. 시스템 (OS) 환경의 언어세팅 문제일 수 도 있다. (중요!)
톰캣을 실행할 때, 환경 변수의 설정 상태가 중요하다!.
profile에 LANG=ko_KR.eucKR
또는 톰캣 구동 스크립트 (catalina.sh 등)에 추가.



'Develop > Java' 카테고리의 다른 글

CentOS, tomcat 타임존 문제  (2) 2018.03.06
tomcat 외부라이브러리 경로 설정 및 톰캣 튜닝  (0) 2018.03.06
jqGrid(2) row(줄) 색상 변경/값 변경  (0) 2016.01.22
jqGrid (1)  (0) 2016.01.19
한글 인코딩 UTF8  (0) 2015.06.02

+ Recent posts