JAVA & Open Framework2015. 1. 24. 13:17

http://www.acrosoft.pe.kr/board/ae_download

Posted by 아로나
JAVA & Open Framework2014. 8. 8. 10:55

  • 1. V$SESSION 테이블의 PROGRAM 필드에 JDBC 연결일 경우 JDBC 라고 나옵니다. 따라서 STATUS = 'ACTIVE' 인 V$SESSION 테이블을 전체 조회하면 현재 ACTIVE 되어있는 JDBC 연결갯수를 알수 있습니다.

    2. 웹로직의 경우 콘솔에서 지원하고 톰캣의 경우에도 Admin console에서 지원하는걸로 알고 있습니다.
    지원하지 않는다면 connection pool 을 어떤것으로 사용하느냐에 따라 connection pool 내부에 현재 connection pool 사용갯수를 리턴하는 함수가 있을겁니다.

  • 3. toad 를 활용 하는것도 괜찮을듯 싶네요. 비주얼하게 나옵니다. 

Posted by 아로나
JAVA & Open Framework2014. 8. 8. 10:49

DBCP의 POOL 상태를 모니터링 하는 페이지

톰캣에 default 로 설치된 dbcp 라이브러리를 이용하면 org.apache.tomcat.dbcp.dbcp.*

이고 일반적인 dbcp를 다운받아 사용할경우 org.apache.commons.dbcp.* 로 import 하도록 한다.

 

<%@ page language="java" contentType="text/html; charset=EUC-KR" %>
<%@ page import="
    javax.naming.*,
    javax.sql.*,
    org.apache.tomcat.dbcp.dbcp.*"
%>
<% 
 Context initContext = new InitialContext();
 Context envContext  = (Context)initContext.lookup("java:/comp/env");
 DataSource ds   = (DataSource)envContext.lookup("jdbc/mydb");
  
 BasicDataSource bds = (BasicDataSource)ds; 
 String dbname  = "caelum";
 
 try { 
   int bdsNumActive  = bds.getNumActive(); 
   int bdsMaxActive  = bds.getMaxActive(); 
   int bdsNumIdle   = bds.getNumIdle(); 
   long bdsMaxWait  = bds.getMaxWait(); 
   
   String fontcolor  = ""; 
   
   if (bdsNumActive <= 400) { 
    fontcolor = "<font color='green'>"; 
   } else if (bdsNumActive > 400 && bdsNumActive <= 500) { 
    fontcolor = "<font color='orange'>"; 
   } else { 
    fontcolor = "<font color='red'>"; 
   }
%> 
   <table cellpadding='3' cellspacing='0' border='1'>
    <tr>
     <td colspan='4' align='center'><b><%=dbname%></b> DataSource</td>
    </tr>
    <tr>
     <td height='24' align='center' alt='connections that are processing'># Active Connections</td>
     <td height='24' align='center' alt='total size of pool'>Maximum Active Connections</td>
     <td height='24' align='center' alt='connections that are idle in the pool'># of Idle Connections</td>
     <td height='24' align='center'>Maxium Wait period before timeout</td>
    </tr>
    <tr>
     <td align='right'><%=fontcolor%><%=bdsNumActive%></font></td>
     <td align='right'><%=bdsMaxActive%></td>
     <td align='right'><%=bdsNumIdle%></td>
     <td align='right'><%=bdsMaxWait%></td>
    </tr>
   </table>
<%
 } catch(Exception e) { 
  out.println(e.toString());
 } 
%>


출처 : http://blog.naver.com/sam7292/90018994486

Posted by 아로나
JAVA & Open Framework2014. 8. 8. 10:44

본 강좌는 Eclipse J2EE, Tomcat 6.0 과 My-SQL 기준으로 작성된 것임을 미리 알려드립니다.
그리고 Tomcat의 버전이 맞지 않으면 설정 환경이 조금씩 다를 수 있다는 것 또한 알려드립니다.

 

 

1. 첨부된 파일은 받는다. (Link)

 

2. 다음 순서대로 받은 파일들을 해당 폴더에 넣는다.

commons-collections-3.1.jar
commons-dbcp-1.2.1.jar
commons-pool-1.2.jar

이 파일들을 자신이 이클립스에서 만들어둔 프로젝트/WebContent/WEB-INF/lib 폴더에 복사한다..

mysql-connector-java-3.0.14-production-bin.jar

그리고 위의 JDBC 라이브러리는 설치된 톰캣의 lib 폴더 안에 복사한다.

 

3. 프로젝트/WebContent/META-INF 폴더에 context.xml 파일을 생성한다. 

 

4. 프로젝트/WebContent/WEB-INF 폴더에 web.xml 파일의 web-app 태그 안에 코드를 추가한다.

 

5. DBCPTest.jsp 실행하기

 

6. 결과 화면

출처 : http://youngman.kr/?p=1025 

Posted by 아로나
JAVA & Open Framework2014. 7. 3. 12:07

이번 프로젝트는 Spring + MyBatis 입니다.... ㄷㄷ(난 하이버네이트가 더 좋은데 ㅠㅠ)

뭐든 ORM이 마찬가지지만 설정을 열라 해줘야 합니다... 매핑 같은거 ㅠㅠ

하버네이트는 DB 긁어와서 파일 만들어줬는데 마이바티스는 없나.. 해서 찾아보니 역시나 있었습니다.!!

Eclipse Helios 사용.



Installation

이클립스에서 Help -> Install New Software..

사이트 주소 : http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/




Create Config File

이클립스에서 File -> New -> Other 클릭.

플러그인을 정상적으로 설치했으면 아래와 같이 "MyBatis Generator Configuration File" 이 나올겁니다.


저장할 폴더 위치와 파일 이름을 설정합니다.



이제 이 파일을 열어서 편집합니다. 아래는 샘플 입니다. (ㄷㄷㄷ)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
	<classPathEntry location="D:\dev\workspace\eclipse\board_v2\WebContent\WEB-INF\lib\mysql-connector-java-5.1.16-bin.jar" />

	<context id="context1">
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://hostname:3306/db" userId="antop"
			password="xxxxxxxx" />

		<javaModelGenerator targetPackage="kr.nerv.antop.entity.model"
			targetProject="board_v2" />

		<sqlMapGenerator targetPackage="kr.nerv.antop.entity.xml"
			targetProject="board_v2" />

		<javaClientGenerator targetPackage="kr.nerv.antop.entity.mapper"
			targetProject="board_v2" type="XMLMAPPER" />

		<table schema="antop" tableName="ab_board" />
		<table schema="antop" tableName="ab_board_comment" />
		<table schema="antop" tableName="ab_board_file" />	
	</context>
</generatorConfiguration>

모델, XML, 맵퍼 3가지를 생성합니다.

기존 아이바티스 사용하는 방법대로면 모델과 XML 만 있으면 사용 할 수 있을 것 같네요..



Generation

이제 이 설정파일(generatorConfig.xml)에서 마우스 오른쪽 버튼 클릭 후 "Generate MyBatis/iBATIS Artifacts" 클릭!!


파일들이 생성되어 있을 겁니다. ㅎㅎ


이제 진짜 쓸만하게 제대로 만들어 졌는지는 까봐야 알겠죠.. 후...

자기가 잘 쓸만하게 만드려면 설정 파일을 제대로 작성해야 할 듯..



http://code.google.com/p/mybatis/wiki/Generator

http://code.google.com/p/mybatis/source/browse/sub-projects/generator/trunk/core/mybatis-generator-systests-mybatis3/src/main/resources/generatorConfig.xml?r=2403


출처 : http://antop.tistory.com/131

Posted by 아로나
JAVA & Open Framework2014. 5. 23. 17:57

아래 내용을 이용하면, 간자체도 표현이 가능하다.

charCodeAt() 메소드(함수)로, 문자를 번호로 변환할 수 있고

fromCharCode() 로는, 정반대로, 문자 번호를 진짜 문자로 바꿀 수 있습니다.


문자의 Unicode, ASCII 코드 번호 알아내기
Unicode, ASCII 번호로 문자 출력하기 예제


파일명: 0.html

<script type="text/javascript">

// 문자를, 유니코드 또는 아스키 코드 번호로 변환
var e = 'A';
var h = '가';

document.write(e.charCodeAt(0) + '<br />');
// 출력 결과: 65
// A 같은 영문자는 그냥 10진수 아스키 코드로 나옵니다.

document.write(h.charCodeAt(0) + '<br />');
// 출력 결과: 44032
// 한글은 유니코드 번호로 나옴
// 십진수인 44032 를 16진수로는 AC00





// 유니코드 또는 아스키 코드 번호를, 문자로 변환
var e2 = String.fromCharCode(65);
var h2 = String.fromCharCode(44032);

document.write(e2 + '<br />');
// 출력 결과: A
document.write(h2 + '<br />');
// 출력 결과: 가

</script>




유니코드의 첫부분은 아스키 코드와 똑같기 때문에, 영문자나 숫자의 "유니코드 번호"는 사실상 "아스키 코드 번호"와 동일합니다.

그러나 한글/한자 등의 유니코드 번호는, 아스키 코드와 서로 무관하고 독자적입니다.

Posted by 아로나
JAVA & Open Framework2014. 5. 23. 15:55

오랜만에 뻘글

이번에 오라클 데이타베이스에 다국어메시지 입력에 대한 테스트를 진행할 일이 있었다.
테스트 대상인 오라클 데이타베이스의 캐릭터셋은 KO16KSC5601 
http://blog.naver.com/kkhigh5/30023536431
위 링크의 블로그에서 너무 잘 정리해주셨는데, 이 캐릭터셋은 한글 완성형 코드와 일치하는 캐릭터셋이라 생각하면 된다.
즉 한글 완성형 코드의 범주에서 벗어난 아랍어나 중국어(간체) 등은 물론이거니와 햏 뷁 등과 같은 몇몇 한글문자의 입력도 불가능 하다는 이야기.
실제로 sqlplus나 Toad, Orange 등의 툴을 통해서 위와 같은 데이터를 밀어넣어 보았더니 "?" 로 입력이 되더라.

자 여기까지는 오라클 데이타베이스의 캐릭터셋에 따른 다국어메시지 입력에 대한 문제점에 대해서 이야기했고, 이제 해결방법을 알아보도록 하자



해결방법 1
너무 단순한 이야긴데, 캐릭터셋을 변경하면 된다.
UTF8이나 AL32UTF8 정도면 충분하다. ㅎㅎ
물론 말은 단순하지, 이미 데이타가 충분히 쌓여있다면 결코 쉬운일은 아니다.
거기에다가 다국어메시지를 그렇게 많이 쓰지 않는다면, 일부러 1.5배 이상의 공간을 더 소비하면서 이렇게 변경할 이유도 없고... (문자당 UTF8은 3바이트, AL32UTF8은 6바이트를 쓴다)
결국 이건 마땅한 해결책은 아니다.
장점 : 단순하다. 코드단에서 수정이 적어질 수 있다.
단점 : 데이타가 많다면? 변경도중 데이타가 깨질수도 있을듯
DB 용량이 커진다. (최소 1.5배)


해결방법 2
그냥 무시할 수 있는 방법인데, euc-kr환경의 웹페이지를 쓰면 된다.
어짜피 문제가 되는 다국어메시지의 경우 대부분은 사용자가 웹페이지에서 입력한 값이 될텐데...
euc-kr환경의 웹페이지에서는 post나 get으로 문자데이터를 전달할 때 한글 범주에서 벗어난 문자데이터들은 알아서 HTML escape 된 문자로 변경하여 전달한다.
만약 utf-8 웹페이지를 쓴다면 어떻게 하냐고? 뭐 WAS단에서 escape 하는 방법밖에는...
그런데 한가지 문제점이 있는데, 바로 파이어폭스를 사용할때이다.
뷁이나 햏같은 완성형 한글에 포함되지 않는 문자의 경우 파이어폭스는 HTML escape 문자로 날리는게 아니라 ㅂㅞㄺ 와 같이 분해해서-_- 날려버린다.
이렇게 분해된 문자는 파이어폭스에서는 잘 보이지만, 익스플로러에서는 분해된 상태로 보인다는 큰 문제점이 있다. 
이런 문제를 해결하기 위하여 직접 스크립트 등으로 HTML escape 문자로 변경해서 날리는 방법이 있다.
 
하지만 이 방법은 추천하지 않는다.
일단 저장공간이 훨씬 낭비된다는 점, 그리고 데이터가 escape된 문자로 들어가서 추출하기가 어렵다는점이 있겠다.
장점 : DB설정을 변경한다거나, 코드에 큰 변화없이 웹서비스를 운영할 수 있다.
단점 : DB에서 원하는 데이터를 추출하기 위한 방법에 대한 연구가 필요


해결방법 3
사실 이번 뻘글은 이 방법에 대해 설명하려고 쓴 글
오라클은 현재 캐릭터셋 범주에서 벗어난 문자를 입력받기 위한 방법으로 네셔널 캐릭터셋을 지정하여 사용할 수 있다.
NCHAR, NVARCHAR, NCLOB 등이 네셔널 캐릭터셋으로 데이터가 입력되는 컬럼의 타입이다.
따라서 위 타입의 컬럼에는 다국어 데이터를 입력해도 깨지지 않는다는 것
단 데이터 입력방식이 조금 다른데, unicode escape 형식으로 입력을 해야 한다.
(참고 : http://cmj8333.tistory.com/entry/nvarchar2-nchar-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9E%85%EB%A0%A5)

예)
INSERT INTO... ('일반데이터',unistr('\5361\6F2B'));


위와 같이 사용하면 된다.
데이터를 조회할때는 특별히 바뀌는 건 없다. 다만 euc-kr등 다국어메시지를 지원하지 않는 웹페이지에 바로 표시하게 된다면 글자가 깨져버리니 주의!

오라클 JDBC의 경우 OraclePreparedStatement의 setFomOfUse 를 사용하여 좀 더 편하게 데이터를 입력할 수 있다.
예를들면 요래요래~

예)
pstmt.setString(1, “뷁”);
((OraclePreparedStatement)pstmt).setFormOfUse(1, OraclePreparedStatement.FORM_NCHAR);


DB Pool 을 이용할땐 위와같은 방법은 이용이 불가능하니, 알아서 코드단에서 문자를 escape 시킨후에 입력하도록 하자.
이 부분에 있어서 아직 마땅한 라이브러리는 찾지 못했는데, 여기저기 뒤져보다 아래와 같은 코드를 찾기는 했다. (참고 : http://www.java2s.com/Tutorial/Java/0400__Servlet/ServletUnicodeEscapeString.htm)

    private static char toHex(int nibble) {
        return hexDigit[(nibble & 0xF)];
    }

    private static char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6', '7',
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    private static String escape(String str) {
        // Modeled after the code in java.util.Properties.save()
        StringBuffer buf = new StringBuffer();
        int len = str.length();
        char ch;
        for (int i = 0; i < len; i++) {
            ch = str.charAt(i);
            switch (ch) {
            case '\\':
                buf.append("\\\\");
                break;
            case '\t':
                buf.append("\\t");
                break;
            case '\n':
                buf.append("\\n");
                break;
            case '\r':
                buf.append("\\r");
                break;
            default:
                if (ch >= ' ' && ch <= 127) {
                    buf.append(ch);
                } else {
                    buf.append('\\');
                    buf.append(toHex((ch >> 12) & 0xF));
                    buf.append(toHex((ch >> 8) & 0xF));
                    buf.append(toHex((ch >> 4) & 0xF));
                    buf.append(toHex((ch >> 0) & 0xF));
                }
            }
        }
        return buf.toString();
    }






사실 이자료 저자료 뿔뿔히 흩어져있는 것들 모아서 정리하자고 쓴 글이었는데, 그래도 이정도면 다국어 처리문제로 고민하고 있는 개발자들에게 조금은 도움이 되지 않았을까 싶다.

부디 그랬기를.... ㅎㅎㅎ


발전하는 개발자가 되자! 아자 아자!


출처 : http://glass.tistory.com/45

Posted by 아로나
JAVA & Open Framework2014. 5. 15. 16:53
JAVA & Open Framework2014. 4. 1. 16:20

 

import java.util.regex.*;

String input = "2014mar03!";
//문자, 숫자, 특수문자의 조합인지 확인
Pattern p = Pattern.compile("([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])");
Matcher m = p.matcher(input);
if (m.find()){
    System.err.println(input + " 은 패턴에 해당함!!!");
}else{
  System.err.println(input + " 은 패턴에 어긋남!!!");
}

Posted by 아로나
JAVA & Open Framework2014. 2. 20. 13:28

// JavaScript Document
// CehckPassWord(사용자필드아이디, 패드워드필드)
function CehckPassWord(ObjUserID, ObjUserPassWord) {

 if(ObjUserPassWord.value.length < 6) {
  alert("비밀번호는 문자, 숫자, 특수문자의 조합으로 6~16자리로 입력해주세요.");
  return false;
 } // if
 
 if(!ObjUserPassWord.value.match(/([a-zA-Z0-9].*[!,@,#,$,%,^,&,*,?,_,~])|([!,@,#,$,%,^,&,*,?,_,~].*[a-zA-Z0-9])/))  {
  alert("비밀번호는 문자, 숫자, 특수문자의 조합으로 6~16자리로 입력해주세요.");
  return false;
 } // if
 
 if(ObjUserID.value.indexOf(ObjUserPassWord) > -1) {
  alert("비밀번호에 아이디를 사용할 수 없습니다.");
  return false;
 } // if
 
 var SamePass_0 = 0; //동일문자 카운트
 var SamePass_1 = 0; //연속성(+) 카운드
 var SamePass_2 = 0; //연속성(-) 카운드
 
 var chr_pass_0;
 var chr_pass_1;
 
 for(var i=0; i < ObjUserPassWord.value.length; i++) {
  chr_pass_0 = ObjUserPassWord.value.charAt(i);
  chr_pass_1 = ObjUserPassWord.value.charAt(i+1);
 
  //동일문자 카운트
  if(chr_pass_0 == chr_pass_1) {
   SamePass_0 = SamePass_0 + 1
  } // if
 
 
  //연속성(+) 카운드
  if(chr_pass_0.charCodeAt(0) - chr_pass_1.charCodeAt(0) == 1) {
   SamePass_1 = SamePass_1 + 1
  } // if
 
  //연속성(-) 카운드
  if(chr_pass_0.charCodeAt(0) - chr_pass_1.charCodeAt(0) == -1) {
  SamePass_2 = SamePass_2 + 1
  } // if
 } // for
 
 if(SamePass_0 > 1) {
  alert("동일문자를 3번 이상 사용할 수 없습니다.");
  return false;
 } // if
 
 if(SamePass_1 > 1 || SamePass_2 > 1 )  {
  alert("연속된 문자열(123 또는 321, abc, cba 등)을\n 3자 이상 사용 할 수 없습니다.");
  return false;
 } // if
 return true;
} // function


출처 : http://koong.net/index.php?MenuID=4&cat=javascript&list_count=100&mode=view&idx=644

Posted by 아로나