'분류 전체보기'에 해당되는 글 418건

  1. 2009.10.12 Java FX for Eclipse 2
  2. 2009.09.28 보금자리주택 공급계획
  3. 2009.09.21 Base64 Encoding/Decoding 예제 1
  4. 2009.09.15 자바 암호화
  5. 2009.09.14 자바 정리 참고 1 1
  6. 2009.09.11 설득의 비밀 2
  7. 2009.09.08 [Oracle] 부정형(NOT IN, <>, NOT EXISTS ...)의 비교
  8. 2009.09.08 이수근 쇼핑몰
  9. 2009.09.08 재범 결국 활동중단 1
  10. 2009.09.08 재범 활동중단 1
2009. 10. 12. 16:25

Java FX for Eclipse





JavaFX가 넷빈즈에서만 돌아가는 줄 알았는데 역시나 이클립스 용 플러그인이 나와 있습니다.


위 링크를 통해 다운로드 받은 파일을 eclipse 설치 폴더에 압축해제하면 설치는 완료 됩니다.

사용방법은 다음과 같습니다.

아래 이미지와 내용은 해당 사이트의 Getting Start 문서를 옮겨왔습니다.

JavaFX SDK 설치

JavaFX SDK for Windows or Mac Os X 다운로드 받아 설치합니다.

Eclipse 설치

Eclipse 3.4 이상이 필요하며. Eclipse IDE for Java EE Developers for Windows or Mac OS X 설치가 필요합니다.

Plugin 설치

  1. plugin을 다운로드 받습니다.:
  2. com.sun.javafx.eclipse.feature-win32-win32-x86-1.0.1.zip for Windows
  3. com.sun.javafx.eclipse.feature-macosx-carbon-x86-1.0.1.zip for Mac OS X
  4. eclipse 설치 디렉토리에 압축을 해제합니다.
  5. Eclipse 을 실행합니다.

JavaFX 프로젝트 만들기 와 JavaFX SDK 설정하기
  1. 이클립스를 시작하면 이클립스 workbench의 기본 레이 아웃이 보입니다.
    New empty workbench
  2. Package Explorer에서 오른쪽 클릭하여 New > Java Project 를 선택합니다.
    New Java Project menu
  3. Create a new JavaTM project 로 자바 프로젝트를 생성합니다. 
    New empty workbench
  4. MyJavaFXProject 라는 프로젝트 명과 Finish 버튼을 누릅니다. 새로운 프로젝트가 Package Explorer에 나타납니다. 
    New project created
  5. 프로젝트 이름을 선택하고 오른쪽 클릭하여 JavaFX > Add JavaFX Nature 를 선택합니다.
    Add JavaFX nature to Java Project
  6. 그럼 JavaFX perspective가 활성화 됩니다. JavaFX nature 를 Java Project 에 처음 추가 하는것이라면 JAVAFX_HOME 속성값을 물어볼수도 있습니다.
    Error, JavaFX SDK home not set up.
    JAVAFX_HOME 속성 설정은 아래 단계를 따릅니다.:
    1. 다이얼로그 메시지의 OK 버튼을 누르고 No thanks, I prefer Cancel 버튼을 누릅니다.
    2. 아래와 같은 다이얼로그 창이 그면 JAVAFX_HOME 값을 (empty)로 추가시킵니다.
      Preferences: Classpath Variables
    3. 그리고 Edit... 버튼을 누르면 아래와 같은 창이 뜹니다.
      Edit classpath variable
    4. Folder... 버튼을 눌러 the JavaFX SDK 설치 폴더를 지정해줍니다. 
      Select instalation folder of JavaFX SDK
    5. 폴더선택창의 OK 버튼을 누르고, 변수 Edit 창의 OK 버튼을 누릅니다. 
      Result of setting JAVAFX_HOME property
    6. Preferences 다이얼로그의 OK버튼을 누릅니다. 그럼 JAVAFX_HOME 변수의 세팅이 끝납니다. 만약 Cancel 버튼을 누르면 에러 다이얼로그 창이 뜨며 다시 반복하여 묻게 됩니다.
  7. 이로서 첫번째 JavaFX Project 생성이 완료되었습니다. 
    Opened JavaFX Perspective with Java Project with JavaFX nature

Adding Files

  1. MyJavaFXProject 를 확장해보자. src 폴더를 선택하고. 오른쪽 클릭을 하여 New > Package를 선택한다. 그리고 package 이름에 com.sun.eclipse.example를 입력해보자.
    Adds new Empty Script file into folder.
  2. src/com.sun.eclipse.example 폴더를 오른쪽 클릭후. New > Empty Script 를 선택하자.
    Adds new Empty Script file into folder.
  3. New File 마법사가 보일것이다. Name 필드에 Main 이라고 입력하자.
    New file wizzard
  4. Finish 버튼을 누르면 새로운 JavaFX 스크립트 창이 열린다. 
    New empty FX script
  5. Snippets view를 보자. 여기엔 애플리케이션 개발을 도와줄 여러 가지 code snippets 이 있다. Applications 항목을 열어 Stage를 선택해보자.
    Snippets View
  6. Stage 노드를 editor window로 Drag and drop 하면. Insert Template: Stage 다이얼로그가 보인다. title 변수값을 Hello World 로 바꾸자.
    Result after drop
  7. Insert 버튼을 누르면 template 의 결과가 소스 코드로 변환되어 insert 된다. 
    Result in editor
  8. Mission accomplished, Sir!

Running

Eclipse 로 실행하는 것은 매우 쉽다.

  1. 툴바의 Run 버튼을 누른다. 
    Run icon
  2. 첫번째 실행이라면 Edit Configuration 다이얼로그가 보인다. 
    Configuration
    모든 옵션은 default 값이다. 가장 흥미로운 부분은 Profile - Target 옵션이다. 여기서 실행환경을 조정할 수 있다. 가능한 옵션은 아래와 같다.:
    • Desktop profile - Run as Application
    • Desktop profile - Run as Applet
    • Desktop profile - Run with WebStart
    • Mobile Profile[?] - Run in Emulator
  3.  Run 버튼을 눌러 애플리케이션을 작동시킨다. console 창에 실행 프로그레스가 뜰것이다. 
    Running application

Building

Eclipse 에서의 Build 작업은 default로 자동으로 제공된다. Project 메뉴에서 Build와 관련된 좀 더 많은 옵션을 볼 수 있다.

Configuration Options

  1. Package Explorer 에서 프로젝트 선택 후 오른쪽 클릭하여 Properties를 선택한다. 
    Menu: Project Properties
  2. Properties 창이 보이면 JavaFX Defaults 를 선택한다.
    Properties: JavaFX Defaults
    여기서 JavaFX Project의 실행과 디플로이 프로세스 동안 사용되는 몇가지 기본 파라미터 값을 수정할 수 있다. 좀 더 많은 정보는 JavaFX Packager Documentation 을 통해 볼 수 있다.

JavaFX Help

이 플러그인은 JavaFX SDK documentation로의 접근을 매우 쉽게 해준다. Help > Java FX > JavaFX Script Documentation or press Ctrl + F1 를 누르므로서 Document에 접근 할 수 있다.
JavaFX SDK Help

Footnotes:

  • 언제든 JAVAFX_HOME 변수를 아래와 같은 방법으로 수정 할 수 있다.:
    1. Open Window > Preferences
    2. Expand Java > Build Path and select Classpath Variables
    3. Edit JAVAFX_HOME
  • SDK의 profile을 아래 단계를 통해 수정 할 수 있다.:
    1. Right click on project name. Select Properties > Java Build Path > Libraries
    2. Double click on JavaFX System Library. The Edit Library dialog appears. Here you can set the profile to use.
      Dialog: Edit JavaFX System Library
2009. 9. 28. 09:32

보금자리주택 공급계획





 

 

 

강남 세곡지구

6821가구가 공급되며 이 중 보금자리 주택은 5623가구(공공분양 3042가구, 공공임대 2581가구)가 들어선다.

다음달 사전예약 물량은 공공분양 물량 중 1405가구로, 분양가는 전용 85㎡ 기준 3.3㎡당 1150만원 선이다.

향후 분양될 민간분양은 전용 85㎡ 중대형으로 단독주택을 포함, 1198가구가 지어진다.

임대주택으로는 영구임대(200가구), 국민(882가구), 10년분납(996가구), 장기전세(503가구) 등이다.

단지형다세대 100가구와 토지임대부 414가구도 도입될 계획이다.

정부는 이곳을 대모산과 주변의 구릉지 등 녹지로 둘러싸인 지역 여건을 감안해 ‘숲속의 파크시티’로 조성할 계획이다.

녹지율이 23.8%, 용적률은 고도제한의 영향으로 169%이다.

서초 우면지구

3390가구가 들어선다. 보금자리 주택은 2740가구(공공분양 1490가구, 공공임대 1250가구),

민간분양 중대형 물량은 650가구다.

이 중 다음달 사전예약 물량은 공공분양 물량 중 864가구가 대상이며,

분양가는 전용 85㎡기준 3.3㎡당 1150만원선이다.

우면산과 양재천을 녹지축으로 연계해 ‘녹지·물·바람이 어우러지는 생태도시’로 조성될 예정이다.

하남 미사지구

신도시 규모의 3만6229가구가 공급된다.

공공분양(1만2562가구), 공공임대(1만3187가구) 등 보금자리주택이 2만5749가구에 달한다.

다음달 사전예약을 통해 이 중 9481가구가 공급된다.

정부는 또 미사지구의 교통편의를 위해 3000억원을 들여 지하철 5호선을 연장하고,

간선급행버스(BRT) 환승시설도 추가 건설키로 했다.

이외에도 황산교차로~상일교차로 1.9㎞구간에는 지하차로를 신설키로 하고

조정경기장 입구와 미사교차로는 입체화를 통해 여건을 개선할 계획이다.

분양가는 지하철 건설비 등이 포함돼 당초 예상분양가보다 3.3㎡당 20만원이 높아진 970만원선이다.

고양 원흥지구

계획 건설호수는 8601가구, 보금자리 주택은 6393가구다.

다음달 사전예약 물량은 2545가구로, 분양가는 전용 85㎡ 기준 3.3㎡당 850만원선이다.

녹지율이 22.3%이며, 도시지원용지율은 16.9%이다.

인접한 고양삼송지구와 연계한 콘텐츠 미디어 산업을 유치할 계획이며 ‘활력이 넘치는 생산도시’로 조성된다.

BRT환승시설, 경의선 강매역을 각각 100억원과 150억원을 들여 2013년까지 신설키로 했다.

 

 

다음 달 7일부터 신청을 받는 보금자리주택 사전예약 물량의 윤곽이 나왔다.

강남(세곡) 등 4개 지구에서 선보일 사전예약 총량은 전용면적 85㎡ 이하 공공분양 1만4295채(17개 블록)다.

지구별로는 강남(세곡) 1405채,서초(우면) 864채,고양원흥 2545채,하남미사 9481채다.

수요자들의 관심이 컸던 강남 세곡지구는 공공분양 3042채 가운데 절반 수준인 1405채만

사전예약을 받기로 해 예상보다 물량이 줄었다.

정부는 이들 주택의 지구별,단지별,층 · 향별 분양가,청약일정,전매제한 등 세부사항을

오는 30일 입주예약 모집공고에 담아 확정 · 발표할 예정이다.

청약저축 가입자 가운데 '특별 · 우선공급대상'이 아닌 일반인들에게 분양될 보금자리주택은 4289채 안팎이 될 전망이다.

전체 4곳의 시범단지 가운데 하남 미사지구가 2845채로 가장 많다.

이어 고양 원흥 764채,강남 421채,서초 259채 등이 나온다.

무주택기간,납입금액,납입횟수 등이 길거나 많은 사람이 우선 당첨되는 '순차제'가 적용된다.

다음 달 26일 무주택 5년 이상 · 납입금 1200만원 이상 가입자를 시작으로 4일간 1순위 신청을 받는다.

단지별 · 주택형별로 신청자가 공급물량을 넘어서면 다음 날 이후 청약일정은 자동 취소된다.

2 · 3순위자는 다음 달 30일 신청을 받을 예정이지만 사실상 1순위에서 마감될 것으로 보여 신청기회가 없을 전망이다.

신혼부부 특별공급분은 모두 2145채가 공급될 전망이다.

가입기간 2년 미만의 청약저축 가입자가 신청할 수 있어 생애 첫 주택 신청자격이 없는 2030세대가 노려볼 만한 주택이다.

청약통장에 가입한 지 6개월이 지나고 결혼 3년 안에 자녀를 출산(입양 포함)한 부부가 1순위다.

소득요건도 별도로 따진다.

3자녀 이상은 특별공급과 우선공급이 714채씩 모두 1428채가 공급될 예정이다.

특별공급은 청약저축 가입 여부를 따지지 않고 나이,무주택기간,거주기간 등에 따른 점수 순으로 당첨자를 정한다.

반면 우선공급은 청약저축 2년 이상 가입자가 1순위다.

'노부모 부양' 우선공급은 1429채가 공급된다.

만 65세 이상 노부모(배우자 부모 포함)를 모시면서 청약저축에 가입한 지 2년 이상 지나야 신청할 수 있다. 

 

2009. 9. 21. 10:18

Base64 Encoding/Decoding 예제





Base64 Encoding/Decoding 예제



package monky.libs.security;



import sun.misc.*;
import java.io.*;



public class Base64Utils {

/**
  * Base64Encoding 방식으로 바이트 배열을 아스키 문자열로 인코딩한다.
  * In-Binany, Out-Ascii
  *
  * @param encodeBytes  인코딩할 바이트 배열(byte[])
  * @return  인코딩된 아스키 문자열(String)
  */
public static String encode(byte[] encodeBytes) {
  byte[] buf = null;
  String strResult = null;
 
  BASE64Encoder base64Encoder = new BASE64Encoder();
  ByteArrayInputStream bin = new ByteArrayInputStream(encodeBytes);
  ByteArrayOutputStream bout = new ByteArrayOutputStream();
 
  try {
   base64Encoder.encodeBuffer(bin, bout);
  } catch (Exception e) {
   System.out.println("Exception");
   e.printStackTrace();
  }
  buf = bout.toByteArray();
  strResult = new String(buf).trim();
  return strResult;
}



/**
  * Base64Decoding 방식으로 아스키 문자열을 바이트 배열로 디코딩한다.
  * In-Ascii, Out-Binany
  *
  * @param  strDecode 디코딩할 아스키 문자열(String)
  * @return  디코딩된 바이트 배열(byte[])
  */
public static byte[] decode(String strDecode) {
  byte[] buf = null;
 
  BASE64Decoder base64Decoder = new BASE64Decoder();
  ByteArrayInputStream bin = new ByteArrayInputStream(strDecode.getBytes());
  ByteArrayOutputStream bout = new ByteArrayOutputStream();

  try {
   base64Decoder.decodeBuffer(bin, bout);
  } catch (Exception e) {
   System.out.println("Exception");
   e.printStackTrace();
  }
  buf = bout.toByteArray();
  return buf;
}



public static void main(String args[]) {
  String strOrgin = "Monky";
  String strDecode = null;
  byte[] bytOrgin = strOrgin.getBytes();
 
  System.out.println("OriginString=" + strOrgin);
 
  String strEncoded = Base64Utils.encode(bytOrgin);
  System.out.println("EncodedString=" + strEncoded);
 
  byte[] bytDecoded = Base64Utils.decode(strEncoded);
  strDecode = new String(bytDecoded);
  System.out.println("DecodedString=" + strDecode);
}


}



수행결과

OriginString=Monky
EncodedString=TW9ua3k=
DecodedString=Monky


        /**
         * BASE64 Encoder
         * @param str
         * @return
         * @throws java.io.IOException
         */
        public static String base64Encode(String str)  throws java.io.IOException {
                sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
                byte[] b1 = str.getBytes();
                String result = encoder.encode(b1);
                return result ;
        }

        /**
         * BASE64 Decoder
         * @param str
         * @return
         * @throws java.io.IOException
         */
        public static String base64Decode(String str)  throws java.io.IOException {
                sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
                byte[] b1 = decoder.decodeBuffer(str);
                String result = new String(b1);
                return result ;
        }       
2009. 9. 15. 13:39

자바 암호화




자바는 친절하게도 암호화 및 메시지 검증 코드를 구현해주는 클래스를 제공해준다.
JCE(Java Cryptography Extension)란 이름의 프레임워크가 바로 그놈이다.
J2SE 1.4 이후부터는 JCE 1.2.2가 기본적으로 포함되어 있어서 별다른 라이브러리를 추가해주지 않아도 사용할 수 있다.
초기 버젼인 JCE 1.2는 미국 보안법(?)인가에 걸려서 국내에서는 사용할 수가 없었다. (무기밀매와 똑같은 처벌을 한다는 소문이..)
JCE 1.2.1이 나오면서 제한이 풀어져서, 세계적으로 많이(?) 사용하게 되었다.
그런데 이 JCE 1.2.1 버전의 자체 디지털 서명이 2005년 7월 27일쯤인가 만료가 되서, 2005년도에 파란을 한번 일으킨적도 있다.
(그럼 만료기간을 어떻게 알수 있을까? 쉽게 알려면, 자신이 사용하는 파일의 정보를 보면 된다.
자신이 사용하는 자바 관련 디렉토리에서 jce.jar를 풀어보면 META-INF에 JCE_RSA.RSA 파일이 있을것이다. 이 파일을 보면 알 수 있는데, 윈도우 환경에서 이 파일의 확장자를 "p7s"로 변경하면 열어볼 수 있다.)


이 JCE를 사용하지 않아도, 자체적으로 구현해서 마음껏 암호학의 세계를 여행할 수 있지만, 시간에 쫓기는 분들을 위해서 간단히 사용법을 알아보도록 하자.

암호화에는 크게 블럭 암호화(block encryption)와 스트림 암호화(stream encryption)가 있는데, 여기서는 가장(?) 많이 쓰이는 블럭 암호화에 대해서 알아보도록 하겠다.
블럭 암호화는 말 그대로 데이터를 정해진 블럭으로 나눈후 해당 블럭을 암호화하는것이다.
대표적으로 DES/3DES/AES/SEED 등이 있다.

DES(Data Encryption Standard)는 Lucifer를 보완하여 IBM에서 개발한 블럭암호 알고리즘이다.
64비트 입력 블럭을 56비트 비밀키를 사용하여 암호화하는 알고리즘이다.
전세계적으로 널리 사용되었다가, 56비트라는 짧은 키(key)로 인해 안전하지 않다고 보는 견해가 많아져서, 요즘은  AES한테 밀리는 추세이다.

3DES(Triple Data Encryption Standard)는 DES의 단점을 보완하기 위해서 기존의 DES 방식을 3번 적용(암호화->복호화->암호화)시킨것으로 그 과정에 따라서 56비트의 배수로 암호화 복잡도가 증가한다고 한다.
이 3번의 암복호화 즉, Encryption->Decryption->Encryption을 첫글자를 따서 DESede라 명칭하기도한다.

AES(Advanced Encryption Standard)는 현재 미국 정부 표준으로 지정된 블럼 암호화 알고리즘으로서, DES를 대체하고 있다.
키(key)의 크기는 128, 160, 190, 224, 256비트를 사용할 수 있으며, 현재 미국 표준으로 인정받은 것은 128비트이다.
(JCE에서 제공하는것도 128비트밖에 안될지도...)

SEED는 한국정보보호진흥원을 중심으로 국내 암호 전문가들이 참여하여 만든, 순수 국내기술 블럭암호화 알고리즘이다.
(SEED는 다음에 한번 구현에해보기도 하고 오늘은 다루지 않겠다.)

블럭 암호화를 하기 위해서는 당연히 원문(plain text)이 있어야하고, 암화하 하기 위한 키(key)가 있어야한다.
그리고 블럭 암호화 운용모드에 따라서 IV(Initialization Vector)가 필요하기도 하다.
이 키(key)에 따라서 대칭키 암호화와 비대칭키 암호화로 나눌 수 있다.
대칭키 암호화는 암호화키와 복호화키가 동일하다. 속도가 빠른 장점이 있으니 키(key)를 분배하기 어렵다.(키가 누출되면 암호화 자체가 의미가 없어진다.)
비대칭키 암호화는 키(key) 분배 문제때문에 개발되었는데, 암호화와 복호화키가 다르다. 즉, 공개키(PublicKey), 개인키(PrivateKey)가 따로 생성된다.
간단히 설명하자면, 멀리 떨어진 시스템에서 사용할때에, 이 2가지를 결합하여 사용하고 있다.
대칭키 암호화에 사용할 키(key)를 생성한다음, 비대칭키 암호화를 이용해서 그 키를 분배한다.
키가 안전하게 분배되면 대칭키 암호화를 이용해서 서로 암호화된 문서를 주고 받고 하는것이다.
(비대칭키 암호화가 대칭키 암호화보다 느리기 때문에 키분배에만 사용한다.)
앞에 설명한 DEs/3DES/AES/SEED는 대칭키 암호화 알고리즘이다. 비대칭키 암호화 알고리즘은 RSA(Rivest Shamir Adleman)가 있다.(사람 이름 첫글자를 딴것임)

이제 한번 구현해보도록 하자.
(바이트들을 화면에 출력하기(?) 위해 ByteUtils 클래스를 사용하겠다. 첨부파일을 참조하도록 하자)

1. 암호화에 사용할 키(key) 만들기
 - 키를 만드는 방법은 랜덤하게 동적으로 만드는 방법과, 정해진 키를 읽어와서 만드는 방법이 있다. 두 기능을 하는 메소드를 만들어보자.
01.package test.cipher;
02.  
03.import java.security.InvalidKeyException;
04.import java.security.Key;
05.import java.security.NoSuchAlgorithmException;
06.import java.security.spec.InvalidKeySpecException;
07.import java.security.spec.KeySpec;
08.  
09.import javax.crypto.Cipher;
10.import javax.crypto.KeyGenerator;
11.import javax.crypto.SecretKey;
12.import javax.crypto.SecretKeyFactory;
13.import javax.crypto.spec.DESKeySpec;
14.import javax.crypto.spec.DESedeKeySpec;
15.import javax.crypto.spec.IvParameterSpec;
16.import javax.crypto.spec.SecretKeySpec;
17.  
18.import kr.kangwoo.util.ByteUtils;
19.import kr.kangwoo.util.StringUtils;
20.  
21.public class CipherTest {
22.      
23.    /**
24.     * <P>해당 알고리즘에 사용할 비밀키(SecretKey)를 생성한다.</P>
25.     
26.     * @return 비밀키(SecretKey)
27.     */
28.    public static Key generateKey(String algorithm) throws NoSuchAlgorithmException {
29.        KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
30.        SecretKey key = keyGenerator.generateKey();
31.        return key;
32.    }
33.      
34.    /**
35.     * <P>주어진 데이터로, 해당 알고리즘에 사용할 비밀키(SecretKey)를 생성한다.</P>
36.     
37.     * @param algorithm DES/DESede/TripleDES/AES
38.     * @param keyData
39.     * @return
40.     */
41.    public static Key generateKey(String algorithm, byte[] keyData) throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException {
42.        String upper = StringUtils.toUpperCase(algorithm);
43.        if ("DES".equals(upper)) {
44.            KeySpec keySpec = new DESKeySpec(keyData);
45.            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm);
46.            SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
47.            return secretKey;
48.        } else if ("DESede".equals(upper) || "TripleDES".equals(upper)) {
49.            KeySpec keySpec = new DESedeKeySpec(keyData);
50.            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm);
51.            SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
52.            return secretKey;
53.        } else {
54.            SecretKeySpec keySpec = new SecretKeySpec(keyData, algorithm);
55.            return keySpec;
56.        }
57.    }
58.}

 위 코드는 일단 정상(?) 작동하는데, 맞게 구현하지는 아직 잘 모르겠다. (내공이 부족하여 혹시 틀린부분이 있으면 지적바란다.)

2. DES 암호화/복호화 해보기
 - DES 암호화/복화화를 하기위해선 Cipher 클래스를 사용하면 된다.
 - Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); 이런씩으로 "암호화알고리즘/운용모드/패딩"으로 사용하면 된다.
 - DES는 암호화키가 64비트이므로 64비트 키를 생성하자
   (예리한 분은 여기서 의문을 가질것이다. 위~에서 설명할때 DES는 56비트 키라고 했는데, 왜 갑자기 여기서는 64비트라고 우기는가에 대해서...
    설명하자면, 64비트의 키(외부키) 중 56비트는 실제의 키(내부키)가 되고 나머지 8비트는 거사용(?) 비트로 사용된다고 한다.)
01.public static void main(String[] args) throws Exception {
02.    Key key = generateKey("DES", ByteUtils.toBytes("68616e6765656e61", 16));
03.    String transformation = "DES/ECB/NoPadding";
04.    Cipher cipher = Cipher.getInstance(transformation);
05.    cipher.init(Cipher.ENCRYPT_MODE, key);
06.      
07.    String str = "hello123";
08.    byte[] plain = str.getBytes();
09.    byte[] encrypt = cipher.doFinal(plain);
10.    System.out.println("원문 : " + ByteUtils.toHexString(plain));
11.    System.out.println("암호 : " + ByteUtils.toHexString(encrypt));
12.      
13.    cipher.init(Cipher.DECRYPT_MODE, key);
14.    byte[] decrypt = cipher.doFinal(encrypt);
15.    System.out.println("복호 : " + ByteUtils.toHexString(decrypt));
16.}

* 실행 결과
원문 : 68656c6c6f313233
암호 : 51d6aa8bcc176819
복호 : 68656c6c6f313233

 실행해보면 암호화/복호화가 잘되는것을 알 수 있다.
 DES는 암호화 알고리즘이고, ECB는 뭘까? 운용모드라고 했는데,  http://blog.kangwoo.kr/13 여기에 퍼온글이 있으니 참조하기 바란다.
 패딩(padding)은 말 그대로 패딩인데, 번역하면 채워넣기, 모자란만큼 채워넣는 역할을 한다. DES는 블럭 암호화 알고리즘이다.
 그래서 암호화 할라면 블럭이 필요한데, DES 경우 64비트가 한 블럭을 형성한다. 그런데 입력한 데이터가 64비트가 안된다면 어떻게 될까?
 궁금하면 "hello123" 을 "hello"으로 바꾼다음 실행해보자. 아마 다음과 같은 에러가 발생할 것이다.
 
* 실행 결과
 Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length not multiple of 8 bytes

 입력한 데이터가 8 bytes 즉, 64비트가 아니니 배째라는것이다.
 그러면 정상작동을 하기위해서는 블럭크기의 배수만큼 나머지 데이터를 채워줘야하는데 그 역할을 하는게 패딩이다.
 "DES/ECB/NoPadding"을 "DES/ECB/PKCS5Padding"을 바꾼다음 실행해보자.
 이제 데이터가 64비트가 아니어도 정상작동한다. 그래서 귀찮으면 가능한한 패딩을 해주게 하면 좋다.
 (운용 모드가 OFB/CFB일 경우 NoPadding을 사용해도 상관없다. IV를 이용해서 처리할때 필요가 없어지기때문이다. 믿거나 말거나)


3. DESede 암호화/복호화 해보기
 - DES와 별반 차이 없다. 키 크기가 64비트 * 3 = 192비트로 늘어난것밖에 없다.
01.public static void main(String[] args) throws Exception {
02.    Key key = generateKey("DESede", ByteUtils.toBytes("696d697373796f7568616e6765656e61696d697373796f75", 16));
03.    String transformation = "DESede/ECB/PKCS5Padding";
04.    Cipher cipher = Cipher.getInstance(transformation);
05.    cipher.init(Cipher.ENCRYPT_MODE, key);
06.      
07.    String str = "hello123";
08.    byte[] plain = str.getBytes();
09.    byte[] encrypt = cipher.doFinal(plain);
10.    System.out.println("원문 : " + ByteUtils.toHexString(plain));
11.    System.out.println("암호 : " + ByteUtils.toHexString(encrypt));
12.      
13.    cipher.init(Cipher.DECRYPT_MODE, key);
14.    byte[] decrypt = cipher.doFinal(encrypt);
15.    System.out.println("복호 : " + ByteUtils.toHexString(decrypt));
16.}

* 실행 결과
원문 : 68656c6c6f313233
암호 : ad44691609cb1e017378631303581279
복호 : 68656c6c6f313233

4. AES 암호화/복호화 해보기
 - DES와 별반 차이 없다. 키 크기가 128비트인것을 제외하면 말이다.
01.public static void main(String[] args) throws Exception {
02.    Key key = generateKey("AES", ByteUtils.toBytes("696d697373796f7568616e6765656e61", 16));
03.    String transformation = "AES/ECB/PKCS5Padding";
04.    Cipher cipher = Cipher.getInstance(transformation);
05.    cipher.init(Cipher.ENCRYPT_MODE, key);
06.      
07.    String str = "hello123";
08.    byte[] plain = str.getBytes();
09.    byte[] encrypt = cipher.doFinal(plain);
10.    System.out.println("원문 : " + ByteUtils.toHexString(plain));
11.    System.out.println("암호 : " + ByteUtils.toHexString(encrypt));
12.      
13.    cipher.init(Cipher.DECRYPT_MODE, key);
14.    byte[] decrypt = cipher.doFinal(encrypt);
15.    System.out.println("복호 : " + ByteUtils.toHexString(decrypt));
16.}

* 실행 결과
원문 : 68656c6c6f313233
암호 : d5c5e1ffb734b610679f36c0e535fe39
복호 : 68656c6c6f313233
5. IV 사용하기.
- 블록 암호의 운용 모드(Block engine modes of operation)가 CBC/OFB/CFB를 사용할 경우에는 Initialization Vector(IV)를 설정해줘야한다. 왜냐면 사용하기 때문이다. AES 암호화/복호화 코드에서 운용 모드가 CBC로 변경해보자.
01.public static void main(String[] args) throws Exception {
02.    Key key = generateKey("AES", ByteUtils.toBytes("696d697373796f7568616e6765656e61", 16));
03.    String transformation = "AES/CBC/PKCS5Padding";
04.    Cipher cipher = Cipher.getInstance(transformation);
05.    cipher.init(Cipher.ENCRYPT_MODE, key);
06.      
07.    String str = "hello123";
08.    byte[] plain = str.getBytes();
09.    byte[] encrypt = cipher.doFinal(plain);
10.    System.out.println("원문 : " + ByteUtils.toHexString(plain));
11.    System.out.println("암호 : " + ByteUtils.toHexString(encrypt));
12.      
13.    cipher.init(Cipher.DECRYPT_MODE, key);
14.    byte[] decrypt = cipher.doFinal(encrypt);
15.    System.out.println("복호 : " + ByteUtils.toHexString(decrypt));
16.}

* 실행 결과 원문 : 68656c6c6f313233
암호 : 92e4fa9add0d4d5a07954207890e5b5c
Exception in thread "main" java.security.InvalidAlgorithmParameterException: Parameters missing
...생략...

실행해보면 암호화는 되는데, 복호화도중 파라메터가 없다고 에러가 발생한다. 예상한데로라면 암호화할때도 에러가 나야하는데, 불행히도 암호화는 정상적으로 작동한다. 왜냐면 암호화할때는 IV를 지정해주지 않으면, 자동적으로 랜덤 IV를 만들어서 사용해버린다.
정말인지 테스트해보자.
01.public static void main(String[] args) throws Exception {
02.    Key key = generateKey("AES", ByteUtils.toBytes("696d697373796f7568616e6765656e61", 16));
03.    String transformation = "AES/CBC/PKCS5Padding";
04.    Cipher cipher = Cipher.getInstance(transformation);
05.    cipher.init(Cipher.ENCRYPT_MODE, key);
06.      
07.    String str = "hello123";
08.    byte[] plain = str.getBytes();
09.    byte[] encrypt = cipher.doFinal(plain);
10.    System.out.println("원문 : " + ByteUtils.toHexString(plain));
11.    System.out.println("암호 : " + ByteUtils.toHexString(encrypt));
12.      
13.    cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(cipher.getIV()));
14.    byte[] decrypt = cipher.doFinal(encrypt);
15.    System.out.println("복호 : " + ByteUtils.toHexString(decrypt));
16.}

* 실행 결과
원문 : 68656c6c6f313233
암호 : 26c7d1d26c142de0a3b82f7e8f90860a
복호 : 68656c6c6f313233
new IvParameterSpec(cipher.getIV())을 이용해서 자동 생성된 IV를 초기화 파라메터를 넘겨주니 정상 작동한다.
실제 사용할때는 암호화 복호화가 따로(?) 작동하니 이렇게 구현하는건 불가능할것이다. IV의 크기는 블럭크기와 동일하므로 키처럼 생성해서 잘 관리하면 되겠다.
01.public static void main(String[] args) throws Exception {
02.    Key key = generateKey("AES", ByteUtils.toBytes("696d697373796f7568616e6765656e61", 16));
03.    byte[] iv = ByteUtils.toBytes("26c7d1d26c142de0a3b82f7e8f90860a", 16);
04.    String transformation = "AES/CBC/PKCS5Padding";
05.    IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
06.    Cipher cipher = Cipher.getInstance(transformation);
07.    cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);
08.      
09.    String str = "hello123";
10.    byte[] plain = str.getBytes();
11.    byte[] encrypt = cipher.doFinal(plain);
12.    System.out.println("원문 : " + ByteUtils.toHexString(plain));
13.    System.out.println("암호 : " + ByteUtils.toHexString(encrypt));
14.      
15.    cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
16.    byte[] decrypt = cipher.doFinal(encrypt);
17.    System.out.println("복호 : " + ByteUtils.toHexString(decrypt));
18.}

* 실행 결과
원문 : 68656c6c6f313233
암호 : 1876c3ae98760ccf1821ea46fc9ce761
복호 : 68656c6c6f313233
6. 파일을 AES 암호화/복호화 해보기
 - 이번에 파일을 읽어와서 암호화/복호화를 해보자. JavaIO를 다룰 수 있으면 간단히 구현할 수 있을것이다.
01.public static void main(String[] args) throws Exception {
02.      
03.    Key key = generateKey("AES", ByteUtils.toBytes("696d697373796f7568616e6765656e61", 16));
04.    String transformation = "AES/ECB/PKCS5Padding";
05.    Cipher cipher = Cipher.getInstance(transformation);
06.    cipher.init(Cipher.ENCRYPT_MODE, key);
07.    File plainFile = new File("c:/plain.txt");
08.    File encryptFile = new File("c:/encrypt.txt");
09.    File decryptFile = new File("c:/decrypt.txt");
10.      
11.    BufferedInputStream input = null;
12.    BufferedOutputStream output = null;
13.    try {
14.        input = new BufferedInputStream(new FileInputStream(plainFile));
15.        output = new BufferedOutputStream(new FileOutputStream(encryptFile));
16.          
17.        int read = 0;
18.        byte[] inBuf = new byte[1024];
19.        byte[] outBuf = null;
20.        while ((read = input.read(inBuf)) != -1) {
21.            outBuf = cipher.update(inBuf, 0, read);
22.            if (outBuf != null) {
23.                output.write(outBuf);
24.            }
25.        }
26.        outBuf = cipher.doFinal();
27.        if (outBuf != null) {
28.            output.write(outBuf);
29.        }
30.    } finally {
31.        if (output != null) try {output.close();} catch(IOException ie) {}
32.        if (input != null) try {input.close();} catch(IOException ie) {}
33.    }
34.              
35.    cipher.init(Cipher.DECRYPT_MODE, key);
36.    try {
37.        input = new BufferedInputStream(new FileInputStream(encryptFile));
38.        output = new BufferedOutputStream(new FileOutputStream(decryptFile));
39.          
40.        int read = 0;
41.        byte[] inBuf = new byte[1024];
42.        byte[] outBuf = null;
43.        while ((read = input.read(inBuf)) != -1) {
44.            outBuf = cipher.update(inBuf, 0, read);
45.            if (outBuf != null) {
46.                output.write(outBuf);
47.            }
48.        }
49.        outBuf = cipher.doFinal();
50.        if (outBuf != null) {
51.            output.write(outBuf);
52.        }
53.    } finally {
54.        if (output != null) try {output.close();} catch(IOException ie) {}
55.        if (input != null) try {input.close();} catch(IOException ie) {}
56.    }
57.}

"plain.txt"란 파일을 만들어 놓고 실행하면, "encrypt.txt"와 "decrypt.txt" 파일이 생성될것이다. 제대로 암호화 복호화되었는지 비교해보자.
7. 비밀번호 암호화
 - 대부분의 사이트에서 비밀번호를 암호화한다.(불행히도 안하는곳도 많다.) 위에서 배운 블럭암호화 알고리즘으로 암호화를 한다면, 사이트 관리자들은 비밀번호를 다 알 수 있을것이다. (키를 해당 사이트에서 관리하므로, 키를 알면 복호화가 가능하다.) 정말 기분 나쁘다. 타인이 나의 비밀번호를 안다는것은... 그러면 관리자들도 모르게 암호화를 할려면 어떻게 해야할까?
아주 간단하다. 암호화에 사용하는 키 자체를 평문 즉, 비밀번호로 사용하면 된다. 아래 처럼 구현하면 본인만 알 수가 있는것이다. 암호화 할려는 비밀번호 자체가 두 역활을 동시에 하는것이다. 한번 구현해보자.
01.public static void main(String[] args) throws Exception {
02.    String password = "mypassword";
03.      
04.    byte[] passwordBytes = password.getBytes();
05.    int len = passwordBytes.length;
06.    byte[] keyBytes = new byte[16];
07.    if (len >= 16) {
08.        System.arraycopy(passwordBytes, 0, keyBytes, 0, 16);
09.    } else {
10.        System.arraycopy(passwordBytes, 0, keyBytes, 0, len);
11.        for (int i = 0; i < (16 - len); i++) {
12.            keyBytes[len + i] = passwordBytes[i % len];
13.        }
14.    }
15.      
16.    Key key = generateKey("AES", keyBytes);
17.    String transformation = "AES/ECB/PKCS5Padding";
18.    Cipher cipher = Cipher.getInstance(transformation);
19.    cipher.init(Cipher.ENCRYPT_MODE, key);
20.      
21.      
22.    byte[] plain = password.getBytes();
23.    byte[] encrypt = cipher.doFinal(plain);
24.    System.out.println("원문 : " + ByteUtils.toHexString(plain));
25.    System.out.println("암호 : " + ByteUtils.toHexString(encrypt));
26.      
27.    cipher.init(Cipher.DECRYPT_MODE, key);
28.    byte[] decrypt = cipher.doFinal(encrypt);
29.    System.out.println("복호 : " + ByteUtils.toHexString(decrypt));
30.}

  키는 패딩이 안되기 때문에 자체적으로 길이를 맞춰줘야한다. 여기서는 16바이트보다 크면 자르고, 16바이트보다 작으면 입력받는 비밀번호 문자를 반복해서 뒤에 붙여두는식으로 구현하였다.
 이런 방식이 귀찮다면 블럭 암호화 방법 대신, MD5나 SHA1으로 메시지 해쉬값을 저장해서 그 값을 비교해도 된다. (이 방식은 복호화가 안된다.) my-sql password() 함수가 SHA1을 이용하는데, 다음번에 알아보도록 하자.

2009. 9. 14. 16:51

자바 정리 참고 1




<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 

ResourceBundle 클래스, Properties 클래스 

ResourceBundle 클래스
Properties
클래스
 

jsp 파일에서 web.xml 의 값 읽어오기

################################################

ResourceBundle 클래스
리소스번들을 이용하여 프로퍼티 파일을 읽어오기
# Res_test.properties
SINCE_YEAR=2007
SINCE_MONTH=9
SINCE_DATE=2
SINCE_DAY=Sunday

import java.util.ResourceBundle;
import java.util.Enumeration;

public class ResourceBundleTest
{
 public static void main(String[] args)
 {
  ResourceBundle bundle = null;
  try{
   bundle = ResourceBundle.getBundle("Res_test");//test.Res_test

   Enumeration enum1 = bundle.getKeys();
   for(; enum1.hasMoreElements() ; ){
    String name = (String)enum1.nextElement();
    String value = bundle.getString(name);
    System.out.println(name+" : "+value);
   }
  }catch(Exception e){
   e.toString();
  }
 }
}


################################################
Properties
클래스
프로퍼티 파일에 입력하고 불러오는 PropertyTest .java 파일

import java.util.*;
import java.io.*;
/*
 * Can use globels.properties
 * Properties
 **/
class Property_Sub{
  
 private String PROPERTIES_FILE="C://java/exam/globals.properties";//globals.properties
 
 public String getProperty(String keyName){
  String value = null;
  try{
   Properties props =  new Properties();
   FileInputStream fis  = new FileInputStream(PROPERTIES_FILE);
   props.load(new java.io.BufferedInputStream(fis));
   value = props.getProperty(keyName).trim();
   fis.close();   
  }catch(java.lang.Exception e){
   e.printStackTrace();
  } 
  return value;
 }
 
 public void setProperty(String keyName, String value){
  try{
   Properties props = new Properties();
   FileInputStream fis  = new FileInputStream(PROPERTIES_FILE);
   props.load(new java.io.BufferedInputStream(fis));
   props.setProperty(keyName, value);
   props.store(new FileOutputStream(PROPERTIES_FILE), "");
   fis.close();
  }catch(java.lang.Exception e){
   e.printStackTrace();
  }
 }
 
}

public class PropertyTest extends Property_Sub{
 
 public static void main(String[] args){
  
  PropertyTest o = null;
  
  if(args.length == 1){
   o = new PropertyTest();
   System.out.println (args[0] + " : " + o.getProperty(args[0]) );
  }
  else if(args.length == 2){
   o = new PropertyTest();
   o.setProperty(args[0], args[1]);
   System.out.println(args[0] + " : " + o.getProperty (args[0]) );
  }
  else{
   System.out.println("wrong argument");
   
  }
  
 }
}
#
#globals.properties
db=sadong
driver=oracle
name=richard

################################################
jsp
파일에서 web.xml 의 값 읽어오기

web.xml 에는
<context-param>
  <param-name>jdf.config.file</param-name>
  <param-value>D:\eclipse\WEB-INF\jdf.properties</param-value>
</context-param>

jsp 에서는
getServletContext().getInitParameter("jdf.config.file")
 

################################################
import java.util.ResourceBundle;

ResourceBundle userxconfig = ResourceBundle.getBundle("com.aaa.bbb.userxconfig");
String CURR_HOST = (String)userxconfig.getObject("currHost");

===============

userxconfig.properties 파일에
currHost=
www.naver.com

이라는 부분이 있을 경우

CURR_HOSTwww.naver.com이 할당된다.

 

 

 

JSP 기초과정

1. JSP 개요

2. 설치와 Setting

3. JSP에서 사용하는 스크립팅 요소들

4. JSP 유용한 클래스

 

#####################################################################

1. JSP 개요

- 서블릿(Servlet) CGI 프로그래밍에 대한 자바 기술의 대안이다.

- CGI 프로그램이 비교적 빠른 수행능력을 보인다면 프로세스가 시작할 때의 오버헤드를 빠른 수행시간으로 메울 수 있지만

그렇지 못하다. 서블릿을 쓸 때는 자바 가상 머신이 떠 있는 상태에서 각 요청이 들어올 때 마다 프로세스보다 가벼운 자바

스레드가 실행된다.

- Java Server Pages (JSP)는 동적인 HTML과 정적으로 생성된 HTML을 섞어 주는 기술이다. JSP

디자인 부분과 로직 부분이 나뉘어 있어 쉽게 일을 분리할 수 있다.

 

#####################################################################

2. 설치와 Setting

- 사용환경 J2SDK1.4 / Tomcat5.0 / MySQL4.0

- CLASSPATH란 자바가 어디서 클래스를 찾을 수 있는지 명시해 놓은 변수다. 이것이 명시되어 있지 않다면 자바는 현재

디렉토리와 표준 시스템 라이브러리에서 클래스를 찾게 된다. CLASSPATH를 설정할 때 현재 디렉토리를 나타내는 '.'

빼놓지 않도록 유의한다.

 

2.1 Unix (C Shell)

setenv CLASSPATH .:servlet_dir/servlet.jar:servlet_dir/jsp.jar:$CLASSPATH

 

2.2 Windows 95/98/NT

set CLASSPATH=.;servlet_dir/servlet.jar;servlet_dir/jsp.jar;%CLASSPATH%

 

2.3 Path setting

ex1) Windows98 - 시작\실행\sysedit\AUTOEXEC.BAT

 SET PATH=%PATH&;C:\JDK1.4\BIN

 SET JAVA_HOME=C:\j2sdk1.4

 SET TOMCAT_HOME=C:\TOMCAT4

 SET CLASSPATH=.;C:\tomcat5\common\lib\servlet-api.jar

 

ex2) WindowsXP, Windows2000 - 내컴퓨터\등록정보\환경변수\시스템변수

 PATH          C:j2sdk1.4\bin

 JAVA_HOME     C:\j2sdk1.4

 CATALINA_HOME C:\Tomcat5

 

2.4 Classpath setting servlet_api.jar, rt.jar 세팅함

CLASSPATH       .;C:\tomcat5\common\lib\servlet-api.jar

               ;C:\j2sdk1.4\jre\lib\rt.jar

(JDK1.2이후는 classpath를 따로 지정하지 않아도 됨)

참고 SET CLASSPATH=%CLASSPATH%;c:\tomcat4\lib\servlet.jar;c:\jdk1.3\jdbc\mm.mysql-2.02-bin.jar

톰켓에서만 JDBC를 사용하려면 TOMCAT\LIB밑에 mm.mysql-2.0.2-bin.jar파일을 복사

 

http://mmmysql.sourceforge.net mm.mysql-2.0.1-bin.jar를 다운받는다.

http://dev.mysql.com/downloads/connector/j/3.1.html 에서

mysql-connector-java-3.1.10.zip 다운받는다

 

- 확인방법 java -version, javap org.gjt.mm.mysql.Driver로 확인

c:\mysql\bin>mysql-max-nt -install

c:\mysql\bin>net start mysql

c:\mysql\bin>net stop mysql

c:\mysql\bin>mysql -u root -p

mysql>show databases;

mysql>show tables;

mysql>use mydb;

mysql>desc tablename;

mysql>create mydb;

mysql>exit;

 

"로드하고 연결하고 실행한다"

Class.forName("org.gjt.mm.mysql.Driver");

Class.forName("oracle.jdbc.dirver.OracleDriver");

Class.forName("sun.jdbc.odbc.jdbcOdbcDriver");

Class.forName("postgresql.Driver");

 

Connection conn =

DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","id","passwd");

Connection conn =

DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","id","passwd");

Connection conn =

DriverManager.getConnection("jdbc:odbc:odbc원본명","id","passwd");

 

 

2.5 작업용 Context를 하나 만들기로 하자.

- c:\tomcat5\webapps\bit 라는 디렉토리를 만들자.

- c:\tomcat5\conf\server.xml에서 </host> 앞쪽에 다음을 추가하자.

 

----------------------------------------------------------------

<!-- Tomcat bit Context -->

<Context path="/bit" docBase="c:/tomcat5/webapps/bit" debug="0"

reloadable="true" />

-----------------------------------------------------------------

- c:\tomcat5\webapps\bit\WEB-INF\web.xml을 아래와 같이 만들자.

------------------------------------------------------------------

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

 

<web-app>

<servlet>

<servlet-name>HelloWorld</servlet-name>

<servlet-class>HelloWorld</servlet-class>

</servlet>

 

<servlet-mapping>

<servlet-name>HelloWorld</servlet-name>

<url-pattern>/servlet/HelloWorld</url-pattern>

</servlet-mapping>

</web-app>

------------------------------------------------------------------

Tomcat5.0 이하 버젼에서는 서블릿을 실행할때 설정하는 web.xml 내용임

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app

   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

   "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

 <display-name>Welcome to Tomcat</display-name>

 <description>

    Welcome to Tomcat

 </description>

 <servlet-mapping>

       <servlet-name>invoker</servlet-name>

       <url-pattern>/servlet/*</url-pattern>

  </servlet-mapping>

</web-app>

 

 

2.6. c:\tomcat5\webapps\bit\WEB-INF\classes 디렉토리를 만들고

C:\j2sdk1.4\bin\java.exe -jar -Duser.dir="C:\Tomcat4.1"

"C:\Tomcat4.1\bin\bootstrap.jar" start

 

HelloWorld.java 서블릿을 만들자.

 

//HelloWorld.java

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

 

public class HelloWorld extends HttpServlet {

       public void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException{

       res.setContentType("text/html; charset=euc-kr");

       PrintWriter out = res.getWriter();

 

       out.println("<html>");

       out.println("<head><title>Hello World!</title></head>");

       out.println("<body>");

       out.println("<BIG>Hello World!</BIG>");

       out.println("</body></html>");

       }

}

 

#####################################################################

3. JSP에서 사용하는 스크립팅 요소들

 

- 스크립트들과 그 역할

- 스크립트렛(Scriptlet) <% %>  _jspService에 프로그램 추가

- 표현식(Expressions) <%= %>   _jspService에 프로그램 추가(out.print의 간략화)

- 선언문(Declarations) <%! %>  .java파일에 멤버필드와 멤버메서드 추가

- 지시문(Directives) <%@ %>    .java파일에 여러 가지 속성 정하기(지시문의 형태에 따라 .java파일의

적당한 장소에 추가)

 

java.io (PrintWriter 등을 위해서)

javax.servlet (HttpServlet 등을 위해서)

javax.servlet.http (HttpServletRequest HttpServletResponse를 위해서)

 

"javac directory\ServletClass.java" (윈도 사용자; 백 슬래시)

"javac directory /ServletClass.java" (유닉스 사용자; 슬래시)

 

3.1 Page 지시문과 import 사용하기

ex)

- Date.jsp, contentType="text/html;charset=ksc5601"  8859_1

 

<%@ page contentType="text/html;charset=euc-kr"%>

 

<%@ page import="java.util.*"%>

<%

       Date date = new Date();

       out.println("오늘의 날짜는 "+date);

%>

 

 

ex) <%@ page 속성="" %>

<%@ page session="false"%> 기본값은 true, session 을 사용할 것인지 여부

<%@ page isThreadSafe="true"%> 기본값은 false, 여러클라이언트의 요청이 동시에 이루어질때 문제가

일어나는 것을 막고자할때 사용

<%@ page errorPage="error.jsp"%> 에러가 발생되었을때 이동하는 페이지

<%@ page isErrorPage="true"%> 이페이지가 에러페이지로 사용되는 페이지인지 아닌지정함

 

3.2 JSP 내장 객체 - 9

- out, request, response, session

- pageContext(javax.servlet.jsp.PageContent) - 내장객체와 page 지령문의 몇가지 속성을 초기화할때

- application(javax.servlet.ServletContent) - 애플리케이션에 대한 정보를 가져올때

- config(javax.servlet.ServletCongfig) - ServletConfig의 내장객체

- page(javax.servlet.jsp.HttpJspPage) - 페이지 자신을 참조하는 객체

- exception(java.lang.Throwable) - 에러페이지에만 사용

 

package org.apache.jsp;  import org.apache.jasper.runtime.*;

<%@ page import="javax.servlet.*, javax.servlet.http.*, javax.servlet.jsp.*"%>

 

1. out 객체

- javax.servlet.jsp.JspWriter 클래스에 대한 내장객체

 

2. request 객체 - get, post, cookie 불러오기(getCookie()), 헤더정보가저오기

- javax.servlet.http.HttpServletRequest 클래스의 내장객체

 

ex1)

- formget.html

<form method="get" action="getform.jsp">

ID: <input type="text" name="id"><br>

PASS: <input type="password" name="pass"><br>

<input type="submit" value="submit"><input type="reset" value="reset">

</form>

- getform.jsp

 

<%@ page contentType="text/html;charset=euc=kr"%>

<%

 

       String id = request.getParameter("id");

       String pass = request.getParameter("pass");

       out.println("Id : "+id+"<br>");

       out.println("Password : "+pass+"<hr>");

       out.println("<a href='javascript:history.back(-1)'>Rear</a>";)

%>

ex2)

- formpost.html

<form method="post" action="postform.jsp">

ID: <input type="text" name="id"><br>

PASS: <input type="password" name="pass"><br>

<input type="submit" value="submit"><input type="reset" value="reset">

</form>

- postform.jsp

 

<%@ page contentType="text/html;charset=euc=kr"%>

<%

 

       String id = new String(request.getParameter("id").getBytes("8859_1"),

"euc-kr");

       String pass = request.getParameter("pass");

       out.println("Id : "+id+"<br>");

       out.println("Password : "+pass+"<hr>");

       out.println("<a href='javascript:history.back(-1)'>Rear</a>";)

%>

 

ex3)

- headerInfo.jsp

<%

       out.println("현재문서의경로 "+request.getRequestURI());

       out.println("호스트명           "+request.getHeader("HOST"));

       out.println("브라우저       "+request.getHeader("User-Agent"));

       out.println("파일명         "+request.getServletPath());

       out.println("서버명         "+request.getServerName());

       out.println("포트명         "+request.getServerPort());

       out.println("URL

http://"+request.getServerName()+":"+request.getServerPort()+getServletPath());

%>

 

3. response 객체 - mine타입지정, 헤더정보세팅, sendRedirect(), cookie값 저장(addCookie())

 

ex1)

- minesetting.jsp

<%

       response.setContentType("application/zip");

       out.println("hi ~~~");

%>

ex2)

- setheader.jsp

<%

       response.setHeader("Cache-Control","no-store");

       response.setHeader("Pragma","no-cache");

       //response.setHeader("Refresh","5;URL=http://www.yahoo.co.kr") 지정한시간에 url로 이동

%>

 

ex3)

- sendRedirect.jsp

<%

       response.sendRedirect("http://www.google.co.kr");

%>

- javascript.html

<script language="javascript">

       document.location.href='http://www.hotmail.com';

</script>

 

4. session 객체

- javax.servlet.http.HttpSession 에 대한 내장객체

 

#####################################################################

5. JSP 유용한 클래스

 

ex1)

- date-format.jsp

 

<%@ page contentType="text/html;charset=euc-kr"%>

 

<%@ page import="java.util.*, java.text.*"%>

<%

       try{

               Date date = new Date();

               SimpleDateFormat simpledateformat1 = new

SimpleDateFormat("yyyy-MM-dd h:mm: a");

               String style = "MM-dd-yyyy"

               SimpleDateFormat simpledateformat2 = new SimpleDateFormat(style);

               String today1 = simpledateformat1.format(date);

               String today2 = simpledateformat2.format(date);

 

               out.println("Today "+date+"<br>");

               out.println("Today Expression 1 "+today1+"<br>");

               out.println("Today Experssion 2 "+today2+"<br>");

 

       }catch(Exception e){

               out.println(e);

       }

%>

 

 

5.1 파일관련

ex1)

- fileorg.jsp

 

<%@ page contentType="text/html;charset=euc-kr"%>

<%@ page import="java.io.*"%>

<%

       try{

 

               String filename = "c:\\tomcat4.1\webapps\\root\\test.txt";

 

               //String filename = "/usr/local/tomcat5.0/webapps/root/test.txt";

               File file = new File(filename);

               file.createNewFile();

               out.println("파일생성<br>");

               if (file != null){

                       FileWriter fw = new FileWriter(filename);

 

                       String text="나는 파일로 쓰여질 문구\n두번째 라인\n세번째 라인";

 

                       fw.write(text);

                       fw.close();

                       out.println("파일쓰기완료<br>");

               }

               FileReader fr = new FileReader(filename);

           BufferedReader br = new BufferedReader(fr);

           //out.println(br.readLine());

           String line;

           while( (line=br.readLine())!=null ){

                          out.println(line+"<br>");

           }

 

               out.println("파일절대경로 "+f.getAbsolutePath());

               out.println("파일이름 "+f.getName());

               out.println("파일디렉토리 "+f.getParent()):

               out.println("파일크기 "+f.length());

               Thread.sleep(5000);

               if (f.exists()){

                       f.delete();

                       out.println("파일삭제");

               }else{

                       out.println("파일없슴");

 

               }

 

       }catch(Exception e){

               out.println(e);

       }

%>

 

<%-- jsp 주석 --%>

<!-- html주석 -->

<%@ include file="copyrigth.jsp"%>

 

#################################################

import java.sql.*;

public class ConnectionTest{

  public static void main(String[] args){

      try{

         Class.forName("org.gjt.mm.mysql.Driver");

         Connection conn =

DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","");

         System.out.println("Connection클래스의 객체 con 생성");

         con.close();

         System.out.println("데이터베이스와 연결을 끊음");

      }catch(Exception e){}

  }

}

#################################################

 

 

유틸소스

import javax.crypto.*;

import javax.crypto.spec.SecretKeySpec;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.spec.IvParameterSpec;

import java.security.*;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

 

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.StringTokenizer;

import java.util.Vector;

 

import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import java.io.File;

import java.util.ArrayList;

import java.util.List;

import java.util.ResourceBundle;

 

public class Util {

        static byte[] seedKeyData = new byte[24];

        public Util(){   

        seedKeyData[0] = 0x01;

        seedKeyData[1] = 0x02;

        seedKeyData[2] = 0x03;

        seedKeyData[3] = 0x04;

        seedKeyData[4] = 0x05;

        seedKeyData[5] = 0x06;

        seedKeyData[6] = 0x07;

        seedKeyData[7] = 0x08;

        seedKeyData[8] = 0x09;

        seedKeyData[9] = 0x10;

        seedKeyData[10] = 0x11;

        seedKeyData[11] = 0x12;

        seedKeyData[12] = 0x13;

        seedKeyData[13] = 0x14;

        seedKeyData[14] = 0x15;

        seedKeyData[15] = 0x16;

        seedKeyData[16] = 0x01;

        seedKeyData[17] = 0x02;

        seedKeyData[18] = 0x03;

        seedKeyData[19] = 0x04;

        seedKeyData[20] = 0x05;

        seedKeyData[21] = 0x06;

        seedKeyData[22] = 0x07;

        seedKeyData[23] = 0x08;

        }

        public static String encTripleDES(String beforeStr) {

        String afterStr = "";

        try {

            SecretKeySpec desKey = new SecretKeySpec(seedKeyData, "DESede"); //seedKeyData로 암호화

            Cipher desCipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");

            byte[] cleartext = beforeStr.getBytes();

            desCipher.init(Cipher.ENCRYPT_MODE, desKey);

            byte[] ciphertext = desCipher.doFinal(cleartext);

            afterStr = (new BASE64Encoder()).encode(ciphertext);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return afterStr;

    }

    public static String decTripleDES(String beforeStr) {        

        String afterStr = "";

        try {

            SecretKeySpec desKeyD = new SecretKeySpec(seedKeyData, "DESede");

            Cipher desCipherD = Cipher.getInstance("DESede/ECB/PKCS5Padding");

            desCipherD.init(Cipher.DECRYPT_MODE, desKeyD);

            byte[] decodedBytes = (new BASE64Decoder()).decodeBuffer(beforeStr);

            byte[] cleartext1 = desCipherD.doFinal(decodedBytes);

            afterStr = new String(cleartext1);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return afterStr;

    }

    public static String getDate() {

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date currentTime = new Date();

 

        return formatter.format(currentTime);

    }

    public static String cutRealNumber(String _real, int _cutPlace) {

        String result = _real;

        boolean isNumber = true;

        try {

            Double.parseDouble(_real);

        } catch (NumberFormatException e) {

            isNumber = false;

        }

        if (isNumber) {

            int pointIndex = _real.indexOf('.'); // 소수점 위치.

            if (pointIndex == -1) {

                // 소수점이 없을 때. 12 -> 12.000

                result += ".";

                for (int i = 0; i < _cutPlace; i++)

                    result += "0";

            } else {

                // 소수점이 있을 때.

                int decimalCount = (_real.length() - 1) - pointIndex; // 소수점 이하 개수 .

                if (_cutPlace > decimalCount) {

                    // 12.1 -> 12.100, 0.0 -> 0.000

                    for (int i = 0; i < _cutPlace - decimalCount; i++)

                        result += "0";

                } else if (_cutPlace < decimalCount) {

                    // 12.12345 -> 12.123

                    result = _real.substring(0, pointIndex + _cutPlace + 1);

                }

            }

        }

        return result;

    }

    public static String encode(String _origin) {

        String result = null;

        try {

            MessageDigest md5 = MessageDigest.getInstance("MD5");

            md5.update(_origin.getBytes());

            byte[] md5Password = md5.digest();

            BASE64Encoder enc = new BASE64Encoder();

            result = enc.encode(md5Password);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

    public static String utfTo8859(String _str) {

        String result = "";

        try {

            if (_str != null)

                result = new String(_str.getBytes("UTF-8"), "8859_1");

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }

        return result;

    }

    public static String kscTo8859(String _str) {

        String result = "";

        try {

            if (_str != null)

                result = new String(_str.getBytes("KSC5601"), "8859_1");

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }

        return result;

    }

    public static String toKSC(String _str) {

        String result = "";

        try {

            if (_str != null)

                result = new String(_str.getBytes("8859_1"), "KSC5601");

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }

        return result;

    }

    public static String toUTF(String _str) {

        String result = "";

        try {

            if (_str != null)

                result = new String(_str.getBytes("8859_1"), "UTF-8");

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }

        return result;

    }

    // Unicode 2.0 -> Unicode 1.2

    public static String toUni12(String uni20) {

        int len = uni20.length();

        char[] out = new char[len];

        for (int i = 0; i < len; i++) {

            char c = uni20.charAt(i);

            if (c < 0xac00 || 0xd7a3 < c) {

                out[i] = c;

            } else  // 유니코드 2.0 한글 영역

            {

                try {

                    byte[] ksc = String.valueOf(c).getBytes("KSC5601");

                    if (ksc.length != 2) {

                        out[i] = '\ufffd';

                        System.err.println("Warning: Some of Unicode 2.0 hangul character was ignored.");

                    } else {

                        out[i] = (char) (0x3400 +

                                ((ksc[0] & 0xff) - 0xb0) * 94 +

                                (ksc[1] & 0xff) - 0xa1);

                    }

                } catch (UnsupportedEncodingException ex) {

                    throw new InternalError("Fatal Error: KSC5601 encoding is not supported.");

                }

            }

        }

        return new String(out);

    }

    // Unicode 1.2 -> Unicode 2.0

    public static String fromUni12(String uni12) {

        if (uni12 == null)

            uni12 = "";

        int len = uni12.length();

        char[] out = new char[len];

        byte[] ksc = new byte[2];

        for (int i = 0; i < len; i++) {

            char c = uni12.charAt(i);

            if (c < 0x3400 || 0x4dff < c) {

                out[i] = c;

            } else if (0x3d2e <= c) // 유니코드 1.2 한글 보충 영역 A, B

            {

                System.err.println("Warning: Some of Unicode 1.2 hangul character was ignored.");

                out[i] = '\ufffd';

            } else // 유니코드 1.2 KSC5601 대응 한글 영역

            {

                try {

                    ksc[0] = (byte) ((c - 0x3400) / 94 + 0xb0);

                    ksc[1] = (byte) ((c - 0x3400) % 94 + 0xa1);

                    out[i] = new String(ksc, "KSC5601").charAt(0);

                } catch (UnsupportedEncodingException ex) {

                    throw new InternalError("Fatal Error: KSC5601 encoding is not supported.");

                }

            }

        }

        return new String(out);

    }

    public String removeSpecialChar(String str) throws Exception {

        if (str == null || str.trim().length() == 0) return "";

        StringBuffer data = new StringBuffer(str);

        StringBuffer buf = new StringBuffer();

        for (int i = 0; i < data.length(); i++) {

            char c = data.charAt(i);

            if (((int) c > 47 && (int) c < 58)

                    || ((int) c > 64 && (int) c < 91)

                    || ((int) c > 96 && (int) c < 123))

                buf.append(c);

        }

 

        return buf.toString();

    }

    public static int cpMapping(int cpNum) {

        if (cpNum == 99)

            cpNum = 0;

        else if (cpNum == 20)

            cpNum = 15;

        else if (cpNum < 1 || cpNum > 15) cpNum = 0;

        return cpNum;

    }

    public static long diffDate(Calendar cal1, Calendar cal2) {

        long cal1sec = cal1.getTime().getTime();

        long cal2sec = cal2.getTime().getTime();

 

        long gap = cal1sec - cal2sec;

 

        long gapday = (gap / 86400) / 1000;

 

        return gapday;

    }

    public static String sqlInsectionProctect(String str) {

        if (str == null) return "";

        str = str.replace('\'', '\\');

        return str;

    }

    public static String removeSlush(String str) throws Exception {

        if (str == null || str.trim().length() == 0) return "";

        int i;

        while ((i = str.indexOf("/")) > -1) {

            str = str.substring(0, i) + str.substring(i + 1);

        }

 

        return str;

    }

    public static String removeDot(String str) throws Exception {

        if (str == null)

            return "";

        else {

            int i = -1;

            if ((i = str.indexOf(".")) > -1) {

                str = str.substring(0, i);

            }

            return str;

        }

    }

    public static String change_Code(String line, String oldString, String newString) {

        for (int index = 0; (index = line.indexOf(oldString, index)) >= 0; index += newString.length())

            line = line.substring(0, index) + newString + line.substring(index + oldString.length());

        return line;

    }

    public static String convertDate(String dateValue, String dateFormat, String gubun) {

        if (dateFormat == null || dateValue == null || dateValue.length() != 10) {

            return dateValue;

        } else if (dateFormat.equals("yyyy-MM-dd")) {

            return dateValue;

        } else {

            StringBuffer transDate = new StringBuffer(15);

            if (dateFormat.equals("dd-MM-yyyy"))

                return transDate.append(dateValue.substring(8, 10)).append(gubun).append(dateValue.substring(5, 7)).append(gubun).append(dateValue.substring(0, 4)).toString();

            else if (dateFormat.equals("MM-dd-yyyy"))

                return transDate.append(dateValue.substring(5, 7)).append(gubun).append(dateValue.substring(8, 10)).append(gubun).append(dateValue.substring(0, 4)).toString();

        }

        return "";

    }

    public static String[] splitString(String inputValue, String deli) {

        StringTokenizer st = null;

        String[] returnValue = null;

        try {

            st = new StringTokenizer(inputValue, deli);

            returnValue = new String[st.countTokens()];

            int i = 0;

            while (st.hasMoreTokens())

                returnValue[i++] = (st.nextToken());

        } catch (Exception ex) {

            returnValue = null;

        }

        return returnValue;

    }

    public static String[] splitStringIncludeNull(String inputValue, String deli) {

        StringTokenizer st = null;

        String[] returnValue = null;

        try {

            Vector returnVec = new Vector();

            st = new StringTokenizer(inputValue, deli, true);

            int count = st.countTokens();

            String previousValue = new String(deli);

            for (int i = 0; i < count; i++) {

                String currentValue = st.nextToken();

                if (previousValue.equals(currentValue)) {

                    returnVec.add("");

                } else {

                    if (!currentValue.equals(deli)) {

                        returnVec.add(currentValue);

                    }

                }

                previousValue = currentValue;

            }

            if (inputValue.substring((inputValue.length() - 1), (inputValue.length())).equals(deli))

                returnVec.add("");

            returnValue = new String[returnVec.size()];

            for (int i = 0; i < returnVec.size(); i++)

                returnValue[i] = (String) returnVec.get(i);

        } catch (Exception ex) {

            ex.printStackTrace();

            returnValue = null;

        }

        return returnValue;

    }

        public static String toEng (String ko)  {

               if (ko == null) {

                       return null;

               }             

               try {

                       return new String(ko.getBytes("KSC5601"),"8859_1");

               } catch(Exception e) {

                       return ko;

               }

        }

        public static String toKor (String en) {

               if (en == null) {

                       return null;

               }

               try {

                       return new String (en.getBytes("8859_1"), "KSC5601");

               } catch(Exception e) {

                       return en;

               }

        }

        /**

     * @param sDATE   : 입력 날짜 ==> 2000/03/09

     * @param sFORMAT : 날짜 형식(대소문자 구분없음) ==> YYYY/MM/DD

     *                ex) validDate("20040429", "yyyymmdd");

     *                validDate("2004-04-29", "yyyy-mm-dd");

     *                validDate("2004/04/29", "yyyy/mm/dd");

     */

    public static boolean validDate(String sDATE, String sFORMAT) {

        boolean bRET = false;

        sFORMAT = sFORMAT.toUpperCase();

        int iYYYY = Integer.parseInt(sDATE.substring(sFORMAT.indexOf("YYYY"), sFORMAT.indexOf("YYYY") + 4));

        int iMM = Integer.parseInt(sDATE.substring(sFORMAT.indexOf("MM"), sFORMAT.indexOf("MM") + 2));

        int iDD = Integer.parseInt(sDATE.substring(sFORMAT.indexOf("DD"), sFORMAT.indexOf("DD") + 2));

        bRET = iYYYY >= 0 && iYYYY < 10000 && iMM > 0 && iMM < 13 && iDD > 0 && iDD < 32;

        return bRET;

    }

  

        public static String checkDate(String input){

               String reVal = null;

               try

               {

                       if (input==null||input.length()!=8)

                       {

                              return input;

                       }else if (input.equals("00000000"))

                       {                     

                              return "99991231";

                       }      

                       Calendar ca = Calendar.getInstance();

                       int year = Integer.parseInt(input.substring(0,4));

                       int month = Integer.parseInt(input.substring(4,6));

                       int date = Integer.parseInt(input.substring(6));

                       ca.set(year, month-1, date);

                       String simple = "yyyyMMdd";

                       SimpleDateFormat simpledateformat = new SimpleDateFormat(simple);

                       reVal = simpledateformat.format(ca.getTime());

               }

               catch (Exception e)

               {

                       e.printStackTrace();

                       return input;

               }

               return reVal;

        }

        /**

        * 파라메터(data)의 스트링을 파라메터(before)인 문자열을 파라메터(after)로 대치한다.

        */

        public static String replaceAll(String data, String before, String after) throws Exception {

               // 쓰기전에 이스케이프 문자 처리

               if (data.length() < before.length())

                       return data;

               StringBuffer buf_data = new StringBuffer(data);

               StringBuffer buf_before = new StringBuffer(before);

               StringBuffer buffer = new StringBuffer();

               for (int i = 0; i < buf_data.length(); i++) {

                       if (buf_data.charAt(i) == buf_before.charAt(0)) {

                              if (i + before.length() <= buf_data.length() && buf_data.substring(i, i + before.length()).equals(before)) {

                                      buffer.append(after);

                                      i += buf_before.length() - 1;

                                      continue;

                              }

                       }

                       buffer.append(buf_data.charAt(i));

               }

               return buffer.toString();

        }

 

        public static String nvl(String str, String str2) {

               String retVal = null;

               if (str == null) {

                       retVal = str2;

               } else {

                       retVal = str;

               }

               return retVal;

        }

 

        public static void main(String[] args){

               try{

                       if (args.length > 0) {

                              for (int i = 0; i < args.length; i++) {

                                      String s = Util.encTripleDES(args[i]);

                                      String s1 = Util.decTripleDES(s);

                                      System.out.println("Original     ["+args[i]+"]");

                                      System.out.println("encTripleDES ["+s+"]");

                                      System.out.println("decTripleDES ["+s1+"]");

                              }      

                       }      

               } catch (Exception e) {

                       e.printStackTrace();

               }             

        }

}

 

 

 

자바소스 정리

01. ServerSocket Socket 간의 채팅 소스

02. Swing에서 이미지 아이콘 삽입 및 종료

03. RMI 정상적인 예제

04. RMI registry 등록하지 않고 사용

05. RMI 통신법

06. Directory 찾아서 리스트 만들기

07. IO 관련 소스

08. 파일을 읽는 소스

09. 입력받은 파일을 읽는 소스

10. 스트링을 파일로 저장하는 소스

11. 파일을 저장하는 소스

12. 에디터에는 볼 수 없으나 도스에서는 보임

13. Properties 파일에 관련된 소스

14. 파일과 관련해서 Properties 에서 읽어 오는 소스

15. 읽은 파일입력 후 내용확인하는 소스

16. 입력파일과 저장할 파일을 쓰는 소스

17. 파일을 읽어서 보여주는 소스

18. 2초마다 출력하는 쓰레드 소스

19. 배열과 관련하여

20. 배열로 합계 평균을 내는 소스

21. 프로그램 인수를 받아 평균과 총계를 보여주는 소스

22. 실행되지 않으나 참고해야 할 소스

23. 데이터베이스 커넷션하고 로그파일을 만듬

24. 엔터키를 두르면 검색하는 소스

25. 날짜 포맷 바꾸는 방법

26. Random 클래스로 가져온 값을 중복체크하기

27. TripleDES 을 이용한 암호화 알고리즘

28. MD5로 암호화 하는 알고리즘 (Base64 필요)

29. 버블 소트로 데이타 정렬

30. Random 함수로 받은 값을 중복 체크하는 소소

31. 날짜 관련 함수 이용

32. 특수문자 제거 메소드

33. 암호와 알고리즘을 사용후 복호화 하는 소스와 적용예

34. 특정 폴더에 쌓이는 파일을 없애는 소스

35. 원도우 배치 프로그램 실행하기

36. 메일을 발송하는 프로그램 소스

37. 세션관련 정리 소스

38. 로긴 및 서블릿 관련 소스(한글처리)

39. 쿠키 셋팅에 관한 예제

40. 클래스를 이용하는 샘플예제 소스

41. 버블 소트와 중복체크 예제

42. 날짜 체크하는 메소드 만들기

43. 조건에 맞게 메일을 보내는 소스

44. 로그를 만드는 소스

 

 

#####################################################################

44. 로그를 만드는 소스

#####################################################################

 

import java.io.*;

import java.text.SimpleDateFormat;

import java.util.Date;

 

public class LogMaker{

        static SimpleDateFormat simpledateformat = new SimpleDateFormat("HH:mm:ss");

       

        public static void println(String filename, String log){

               try{

                       Date date = new Date();

                       String pid = simpledateformat.format(date);

                       //System.out.println("LogMaker String pid->/"+pid+"/");

                       FileWriter fw = new FileWriter(filename+".log",true);

                       fw.write(pid + " : "+log+"\n");

                       fw.flush();

                       fw.close();

               } catch(Exception ex){

               }

        }

}

#####################################################################

 

#####################################################################

43. 조건에 맞게 메일을 보내는 소스

#####################################################################

 

import java.sql.*;

import java.util.*;

import java.io.*;

import javax.mail.*;

import javax.mail.internet.*;

import java.util.StringTokenizer;

import java.text.SimpleDateFormat;

import java.util.Date;

 

public class AirforwarderMailNCC extends Thread

{

        public static void main(String[] args) throws MessagingException

        {

                       Connection  conn_0 = null;

                       PreparedStatement pstmt_0 = null;

                       ResultSet rs_0 = null;

                      

                       String sDB_URL = "jdbc:oracle:thin:@165.213.251.202:1521:itts";

                       String sDB_USER = "itts";

                       String sDB_PASSWORD = "skan00";

              

                             

                       String name ="PTS_AirforwarderNCC";

                       String from = "pts.sec@samsung.com";

                       String to = null;

                       String title = "Notice from PTS";

                       String contents = null;

                       String host = "203.254.221.26"; 

                      

                       String logDir = "log";

                       SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd");

                       Calendar c = Calendar.getInstance();

                       Date d = c.getTime();

                       String fid = simpledateformat.format(d);

                       File resultFile = new File(logDir, fid);

                       if(resultFile.exists()== false)

                              resultFile.mkdir();

                       logDir = logDir + File.separator + fid;

                      

                       boolean ok1 = false, ok2 = false, ok3 = false;

 

                       try{

                              Class.forName("oracle.jdbc.driver.OracleDriver");                       

                             

                              StringBuffer sbSql_0 = new StringBuffer();                            

                             

                              sbSql_0.append(" SELECT EMAIL, USER_NAME, USER_ID FROM USER_INFO U, BASIC_CODE B WHERE  U.COMPANY_CODE=B.CODE AND DESC2 like 'AIR%' AND U.EMAIL IS NOT NULL AND U.STATUS='approved' AND U.PTS_MAIL='T' AND USER_TYPE='CARRIERLOAD' ");

                              conn_0 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                              pstmt_0 = conn_0.prepareStatement(sbSql_0.toString());

                              rs_0 = pstmt_0.executeQuery();                        

                              int cnt_total = 0;

                             

                              while(rs_0.next()){     

                             

                                      int cnt_new = 0, cnt_change = 0, cnt_cancel = 0;

                                     

                                      to = rs_0.getString("EMAIL");

                                     

                                      //Count 보낼 메일 가져오기                                           

                                      StringBuffer sbSql_newmail = new StringBuffer(); //New Mail Count

                                      sbSql_newmail.append(" SELECT INV_NO, BILLNO_, UPDDATE, GETCONSIGNAME(CONSIG) CONSIG_NAME, GETCONSIGNAME(SHIPPE) SHIPPE_NAME, TRSTYP, MLDTUE, GI_DAT , A.CREDATE FROM INV_DOC A, USER_INFO U WHERE  USER_ID=? AND SHIPPE <> 'C100' AND A.SHIPPE = U.DEALING_SUBSIDIARY_CODE AND A.MLCARI = U.COMPANY_CODE AND MLCARI <> 'SITA' AND SHIPPE <> 'C100' AND TRSTYP = 'AIR' AND A.RCDFLG = 'A' AND A.UPDDATE = '99991231235959' AND MAIL_STS='F' ");

 

                                      Connection conn_1 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                      PreparedStatement pstmt_1 = conn_1.prepareStatement(sbSql_newmail.toString());

                                      pstmt_1.setString(1, rs_0.getString("USER_ID")); //순차적으로 조건을 셋팅

                                     

                                      ResultSet rs_1 = pstmt_1.executeQuery();

                                     

                                      while(rs_1.next()){                                           

                                             cnt_new = rs_1.getRow();                                            

                                      }

                                     

                                      pstmt_1.close();

                                      rs_1.close();

                                      conn_1.close();                               

                                     

                                      StringBuffer sbSql_changemail = new StringBuffer(); //Changed Mail Count

                                      sbSql_changemail.append(" SELECT INV_NO, BILLNO_, UPDDATE, GETCONSIGNAME(CONSIG) CONSIG_NAME, GETCONSIGNAME(SHIPPE) SHIPPE_NAME, TRSTYP, MLDTUE, GI_DAT , A.CREDATE FROM INV_DOC A, USER_INFO U WHERE  USER_ID=? AND SHIPPE <> 'C100' AND A.SHIPPE = U.DEALING_SUBSIDIARY_CODE AND A.MLCARI = U.COMPANY_CODE AND MLCARI <> 'SITA' AND SHIPPE <> 'C100' AND TRSTYP = 'AIR' AND A.RCDFLG = 'A' AND A.UPDDATE <> '99991231235959' AND MAIL_STS='F'  ");

 

                                      Connection conn_3 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                      PreparedStatement pstmt_3 = conn_3.prepareStatement(sbSql_changemail.toString());

                                      pstmt_3.setString(1, rs_0.getString("USER_ID")); //순차적으로 조건을 셋팅

                                      ResultSet rs_3 = pstmt_3.executeQuery();

                                     

                                      while(rs_3.next()){                                           

                                             cnt_change = rs_3.getRow();                                         

                                      }

                                      System.out.println("보낼 Change Content 갯수 "+cnt_change);    

                                      pstmt_3.close();

                                      rs_3.close();

                                      conn_3.close();

                             

                                      StringBuffer sbSql_cancelmail = new StringBuffer(); //Canceled Mail Count

                                      sbSql_cancelmail.append(" SELECT INV_NO, BILLNO_, UPDDATE, GETCONSIGNAME(CONSIG) CONSIG_NAME, GETCONSIGNAME(SHIPPE) SHIPPE_NAME, TRSTYP, MLDTUE, GI_DAT , A.CREDATE FROM INV_DOC A, USER_INFO U WHERE  USER_ID=? AND SHIPPE <> 'C100' AND A.SHIPPE = U.DEALING_SUBSIDIARY_CODE AND A.MLCARI = U.COMPANY_CODE AND MLCARI <> 'SITA' AND SHIPPE <> 'C100' AND TRSTYP = 'AIR' AND A.RCDFLG = 'D' AND MAIL_STS='F'        ");

 

                                      Connection conn_5 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                      PreparedStatement pstmt_5 = conn_5.prepareStatement(sbSql_cancelmail.toString());

                                      pstmt_5.setString(1, rs_0.getString("USER_ID")); //순차적으로 조건을 셋팅

                                      ResultSet rs_5 = pstmt_5.executeQuery();

                                     

                                      while(rs_5.next()){                                           

                                             cnt_cancel = rs_5.getRow();                                          

                                      }

                                      System.out.println("보낼 Cancel Content 갯수 "+cnt_cancel);     

                                      System.out.println();

                                      pstmt_5.close();

                                      rs_5.close();

                                      conn_5.close();

                                            

                                      // End 메일 카운터 RS_0 ~ RS_7

                                     

                                      //이쪽에서 한개의 메일을 받아서 아래의 컨텐츠를 보내야 함

                                      StringBuffer sbMessage = new StringBuffer();

                                     

                                      sbMessage.append("<html><head>");                                 

                                      sbMessage.append("<style type=\"text/css\" >");

                                      sbMessage.append("BODY,TD,font {");

                                      sbMessage.append("color: #666666; font-family: Arial;   font-size:9pt;line-height: 130%;}");

                                      sbMessage.append("A:link {color:#00639C;text-decoration: underline;}");

                                      sbMessage.append("A:visited {color:#006699;text-decoration:underline;}");

                                      sbMessage.append("A:active {color:#006699;text-decoration:none;}");

                                      sbMessage.append("A:hover {color:#FFFFFF;text-decoration:none;background-color:#E4628B;}");

                                      sbMessage.append("</style></head><body>");

                                     

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0>");  

                                      sbMessage.append("<tr><td height=4 bgcolor=#CDCDCD><img src=http://www.samsungitts.com/img/ptmail/blank.gif width=1 height=1></td></tr>");

                                      sbMessage.append("<tr><td height=43 bgcolor=#0A79A8><img src=http://www.samsungitts.com/img/ptmail/logo.gif width=127 height=43></td></tr></table>");

                                     

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0>");

                                      sbMessage.append("<tr><td width=551 class=text><Br><br><p>Dear,  "+rs_0.getString("USER_ID")+"</p><br><br>");

                                                                             

                                      sbMessage.append("Please, check the documents below.<br>");

                                      sbMessage.append("<b>*Total number of new invoices - <b>"+cnt_new+"</b> cases<br> </b>");

                                      sbMessage.append("<b>*Total number of changed invoices - <b>"+cnt_change+"</b> cases<br> </b>");

                                      sbMessage.append("<b>*Total number of canceled invoices - <b>"+cnt_cancel+"</b> cases<br> </b>");

                                                                           

                                      sbMessage.append("Please check it at <a href=http://www.samsungitts.com target=_blank>http://www.samsungitts.com</a></p> <br></p></td>");

                                      sbMessage.append("<td width=149 valign=top><img src=http://www.samsungitts.com/img/ptmail/img.jpg width=160 height=172></td></tr></table>");

 

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0><tr><td><p><b>New Invoice</b> (You have not opened or printed.)</p></td></tr></table>");

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0><tr><td bgcolor=#669900>");

                                      sbMessage.append("<table width=700 border=0 cellspacing=1 cellpadding=0>");

                                      sbMessage.append("<tr align=center bgcolor=#BBDD75>");

                                      sbMessage.append("<td height=20><strong>I/V No.</strong></td>");

                                      sbMessage.append("<td height=20><strong>B/L No.</strong></td>");

                                      sbMessage.append("<td height=20><strong>Consignee</strong></td>");

                                      sbMessage.append("<td height=20><strong>Trans Type</strong></td>");

                                      sbMessage.append("<td height=20><strong>ETA</strong></td>");

                                      sbMessage.append("<td height=20><strong>ETD</strong></td></tr>");          

                                     

                                      StringBuffer sbSql_1= new StringBuffer(); // New Mail Send

                                     

                                      sbSql_1.append(" SELECT INV_NO, BILLNO_,  GETCONSIGNAME(CONSIG) CONSIG_NAME,  TRSTYP, MLDTUE, GI_DAT FROM INV_DOC A, USER_INFO U WHERE  USER_ID=? AND SHIPPE <> 'C100' AND A.SHIPPE = U.DEALING_SUBSIDIARY_CODE AND A.MLCARI = U.COMPANY_CODE AND MLCARI <> 'SITA' AND SHIPPE <> 'C100' AND TRSTYP = 'AIR' AND A.RCDFLG = 'A' AND A.UPDDATE = '99991231235959' AND MAIL_STS='F'  ");

                      

                                      Connection conn_9 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                      PreparedStatement pstmt_9 = conn_9.prepareStatement(sbSql_1.toString());

                                      pstmt_9.setString(1, rs_0.getString("USER_ID")); //순차적으로 조건을 셋팅

                                     

                                      ResultSet rs_9 = pstmt_9.executeQuery();

                                     

                                      ok1 = false;

                                      while(rs_9.next()){

                                                 ok1 = true;        

                                                     sbMessage.append("<tr align=center bgcolor=#BBDD75>");

                                                     sbMessage.append("<td height=20>"+rs_9.getString("INV_NO")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_9.getString("BILLNO_")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_9.getString("CONSIG_NAME")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_9.getString("TRSTYP")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_9.getString("MLDTUE")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_9.getString("GI_DAT")+"</td>");

                                                     sbMessage.append("</tr>");    

                                                    

                                                     //Update

                                                     StringBuffer sb_update0 = new StringBuffer();

                                                     sb_update0.append (" UPDATE INV_DOC SET MAIL_STS='T' WHERE INV_NO=?  ");

                                                     Connection con_update0 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                                     PreparedStatement pstmt_update0 = con_update0.prepareStatement(sb_update0.toString());

                                                     pstmt_update0.setString(1, rs_9.getString("INV_NO"));

                                                     ResultSet rs_update0 = pstmt_update0.executeQuery();

                                                     con_update0.commit();

                                                     rs_update0.close();

                                                     pstmt_update0.close();

                                                     con_update0.close();                                         

                                                    

                                      }// 9 For

                                      pstmt_9.close();

                                      rs_9.close();

                                      conn_9.close();

                                      //데이타 없을때 처리

                                      if(!ok1){

                                                     sbMessage.append("<tr bgcolor=#ffffff><td colspan=6><center><b>No Data Found</b></center></td></tr>");

                                      }

                                     

                                      sbMessage.append("</table></table><br><br>");

 

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0><tr><td><p><b>Changed Invoice</b></p></td></tr></table>");

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0><tr><td bgcolor=#669900>");

                                      sbMessage.append("<table width=700 border=0 cellspacing=1 cellpadding=0>");

                                      sbMessage.append("<tr align=center bgcolor=#BBDD75>");

                                      sbMessage.append("<td height=20><strong>I/V No.</strong></td>");

                                      sbMessage.append("<td height=20><strong>B/L No.</strong></td>");

                                      sbMessage.append("<td height=20><strong>Consignee</strong></td>");

                                      sbMessage.append("<td height=20><strong>Trans Type</strong></td>");

                                      sbMessage.append("<td height=20><strong>ETA</strong></td>");

                                      sbMessage.append("<td height=20><strong>ETD</strong></td></tr>");

 

                                      StringBuffer sbSql_2= new StringBuffer(); //Changed Mail Send

                                     

                                      sbSql_2.append(" SELECT INV_NO, BILLNO_,  GETCONSIGNAME(CONSIG) CONSIG_NAME,  TRSTYP, MLDTUE, GI_DAT FROM INV_DOC A, USER_INFO U WHERE  USER_ID=? AND SHIPPE <> 'C100' AND A.SHIPPE = U.DEALING_SUBSIDIARY_CODE AND A.MLCARI = U.COMPANY_CODE AND MLCARI <> 'SITA' AND SHIPPE <> 'C100' AND TRSTYP = 'AIR' AND A.RCDFLG = 'A' AND A.UPDDATE <> '99991231235959' AND MAIL_STS='F'  ");

                                     

                                      Connection conn_10 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                      PreparedStatement pstmt_10 = conn_10.prepareStatement(sbSql_2.toString());

                                      pstmt_10.setString(1, rs_0.getString("USER_ID")); //순차적으로 조건을 셋팅

                                     

                                      ResultSet rs_10 = pstmt_10.executeQuery();

                                     

                                      ok2 = false ;

                                      while(rs_10.next()){

                                                     ok2 = true;                                                                                                                              

                                                     sbMessage.append("<tr align=center bgcolor=#BBDD75>");

                                                     sbMessage.append("<td height=20>"+rs_10.getString("INV_NO")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_10.getString("BILLNO_")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_10.getString("CONSIG_NAME")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_10.getString("TRSTYP")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_10.getString("MLDTUE")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_10.getString("GI_DAT")+"</td>");

                                                     sbMessage.append("</tr>");

                                                     //Do Update    

                                                     System.out.println("Change Invoice Number :::: "+rs_10.getString("INV_NO"));

                                                     StringBuffer sb_update1 = new StringBuffer();

                                                     sb_update1.append (" UPDATE INV_DOC SET MAIL_STS='T' WHERE INV_NO=?  ");

                                                     Connection con_update1 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                                     PreparedStatement pstmt_update1 = con_update1.prepareStatement(sb_update1.toString());

                                                     pstmt_update1.setString(1, rs_10.getString("INV_NO"));

                                                     ResultSet rs_update1 = pstmt_update1.executeQuery();

                                                     con_update1.commit();

                                                     rs_update1.close();

                                                     pstmt_update1.close();

                                                     con_update1.close();                                                 

                                                    

                                      } // 10 For

                                      pstmt_10.close();

                                      rs_10.close();

                                      conn_10.close();

                                      if(!ok2){

                                                     sbMessage.append("<tr bgcolor=#ffffff><td colspan=6><center><b>No Data Found</b></center></td></tr>");

                                      }                                            

                                     

                                      sbMessage.append("</table></table><br><br>");

                                     

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0><tr><td><p><b>Canceled Invoice</b> (The shipper has canceled.)</p></td></tr></table>");

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0><tr><td bgcolor=#669900>");

                                      sbMessage.append("<table width=700 border=0 cellspacing=1 cellpadding=0>");

                                      sbMessage.append("<tr align=center bgcolor=#BBDD75>");

                                      sbMessage.append("<td height=20><strong>I/V No.</strong></td>");

                                      sbMessage.append("<td height=20><strong>B/L No.</strong></td>");

                                      sbMessage.append("<td height=20><strong>Consignee</strong></td>");

                                      sbMessage.append("<td height=20><strong>Trans Type</strong></td>");

                                      sbMessage.append("<td height=20><strong>ETA</strong></td>");

                                      sbMessage.append("<td height=20><strong>ETD</strong></td></tr>");

 

                                      StringBuffer sbSql_3= new StringBuffer(); //Canceled Mail Send

                                     

                                      sbSql_3.append(" SELECT INV_NO, BILLNO_,  GETCONSIGNAME(CONSIG) CONSIG_NAME,  TRSTYP, MLDTUE, GI_DAT FROM INV_DOC A, USER_INFO U WHERE   SHIPPE <> 'C100' AND A.SHIPPE = U.DEALING_SUBSIDIARY_CODE AND A.MLCARI = U.COMPANY_CODE AND MLCARI <> 'SITA' AND SHIPPE <> 'C100' AND TRSTYP = 'AIR' AND A.RCDFLG = 'D' AND MAIL_STS='F' AND USER_ID=?   ");

                                     

                                     

                                      Connection conn_11 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                      PreparedStatement pstmt_11 = conn_11.prepareStatement(sbSql_3.toString());

                                      pstmt_11.setString(1, rs_0.getString("USER_ID")); //순차적으로 조건을 셋팅

                                     

                                      ResultSet rs_11 = pstmt_11.executeQuery();

                                     

                                      ok3 = false ;

                                      while(rs_11.next()){

                                                     ok3 = true;    

                                                     sbMessage.append("<tr align=center bgcolor=#BBDD75>");

                                                     sbMessage.append("<td height=20>"+rs_11.getString("INV_NO")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_11.getString("BILLNO_")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_11.getString("CONSIG_NAME")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_11.getString("TRSTYP")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_11.getString("MLDTUE")+"</td>");

                                                     sbMessage.append("<td height=20>"+rs_11.getString("GI_DAT")+"</td>");

                                                     sbMessage.append("</tr>");

                                                     //Do Update                                  

                                                     StringBuffer sb_update2 = new StringBuffer();

                                                     sb_update2.append (" UPDATE INV_DOC SET MAIL_STS='T' WHERE INV_NO=?  ");

                                                     Connection con_update2 = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                                                     PreparedStatement pstmt_update2 = con_update2.prepareStatement(sb_update2.toString());

                                                     pstmt_update2.setString(1, rs_11.getString("INV_NO"));

                                                     ResultSet rs_update2 = pstmt_update2.executeQuery();

                                                     con_update2.commit();

                                                     rs_update2.close();

                                                     pstmt_update2.close();

                                                     con_update2.close();                                                 

                                                    

                                      } // 11 For

                                      pstmt_11.close();

                                      rs_11.close();

                                      conn_11.close();

                                      if(!ok3){

                                                     sbMessage.append("<tr bgcolor=#ffffff><td colspan=6><center><b>No Data Found</b></center></td></tr>");

                                      }                             

                                     

                                      sbMessage.append("</table></table><br><br>");

                                     

                                      sbMessage.append("</table></table><br></td></tr></table><br>");

                                      sbMessage.append("<table width=700 border=0 cellspacing=0 cellpadding=0>");  

                                      sbMessage.append("<tr><td height=1 bgcolor=#CDCDCD><img src=http://www.samsungitts.com/img/ptmail/blank.gif width=1 height=1></td>      </tr>");

                                      sbMessage.append("<tr><td align=center>Copyright(c)2003 Samsung Electronics co.,Ltd. All rights reserved.</td></tr></table> </body></html>");

                                                            

                                      contents = sbMessage.toString();                             

                                     

                                      //System.out.println("내용 확인 222222222222 "+contents);

                                      if(ok1 || ok2 || ok3){

                                             StringTokenizer stTo = new StringTokenizer(to, ";");

                                             while(stTo.hasMoreTokens()){

                                                    

                                                     to = stTo.nextToken();

                                                     //메일 클래스 객체 생성

                                                     Properties prop = System.getProperties();      

                                                     Session session = Session.getInstance(prop, null);    

                                                     MimeMessage message = new MimeMessage(session);

                                                     message.setFrom(new InternetAddress(name+"<"+from+">"));

                                                     message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));    

                                                     message.setSubject(title);

                                                     message.setContent(contents,"text/html;charset=euc-kr");

                                                     //message.setText(contents);

                                                    

                                                     Transport transport = session.getTransport("smtp");

                                                     transport.connect(host,"","");    

                                                     transport.sendMessage(message, message.getAllRecipients());

                                                     transport.close();

                                                     LogMaker lm = new LogMaker();

                                                     lm.println(logDir+File.separator+"AirforwarderMailNCC", to);

                                                                                                 

                                             }

                                             ++cnt_total;

                                             System.out.println("Total Mail 갯수 "+cnt_total); 

                                      }else{

                                                     System.out.println("메일을 보내지 않는다");

                                                     System.out.println();

                                      }                                                                  

                              } //Mail For         

                       Thread.currentThread().sleep(50);

                       }catch(ClassNotFoundException e){

                              e.printStackTrace();

                       }catch(SQLException e){

                              e.printStackTrace();

                       }catch(Exception e){

                              e.printStackTrace();

                       }finally{

                              try{

                                      if(pstmt_0 != null){pstmt_0.close();}

                                      if(rs_0 != null){rs_0.close();}

                                      if(conn_0 != null){conn_0.close();}

                                     

                              }catch(Exception e){

                                      e.printStackTrace();

                              }

                       }

        }

}

 

#####################################################################

 

#####################################################################

42. 날짜 체크하는 메소드 만들기

#####################################################################

import java.util.*;

import java.text.*;

public class DateTest

{             

        public String checkDate(String input){                        

               String reVal = null;           

               //리턴 타입을 설정한다

               try

               {             

                       if ( input == null || input.length() != 8 )

                       {

                              return input;

                              //OR의 우선순위는 앞에 있슴. 에러사항을 체크하여 Return을 한다

                       }             

                       Calendar cl = Calendar.getInstance();

                       int yyyy = Integer.parseInt(input.substring(0, 4));

                       int month = Integer.parseInt(input.substring(4, 6));

                       int day = Integer.parseInt(input.substring(6));

                       //입력값에 대해서 substring으로 나누어 가져온다

                       cl.set(yyyy, month-1, day);

                       //Calendar에 년월일을 셋팅한다

                       /*

                       int yy = cl.get(Calendar.YEAR);

                       int mm = cl.get(Calendar.MONTH)+1;

                       int dd = cl.get(Calendar.DATE);                

                       System.out.println(yy +", "+mm+", "+dd);

                       */                    

                       String date_format = "yyyyMMdd";

                       SimpleDateFormat simpledateformat = new SimpleDateFormat(date_format);     

                       reVal = simpledateformat.format(cl.getTime());                                        

               }catch (Exception e)

               {      

                       e.printStackTrace();

                       return input;

               }

               return reVal;

               //try catch 구분 밖에서 Return 타입을 받는다

        }

        public static void main(String[] args)

        {

               DateTest dt = new DateTest();

               System.out.println( dt.checkDate("20050200") );

               //객체를 생성하여 메소드를 호출한다

        }      

}

 

#####################################################################

41. 버블 소트와 중복체크 예제

#####################################################################

import java.util.*;

public class RandomTest

{

        public static void main(String[] args)

        {

               Random random = new Random();

               boolean[] boo = new boolean[45];

               int[] choo = new int[6];

               for (int i=0; i<boo.length ;  )

               {

                       boo[i] = true;

               }

               for (int i=0; i<choo.length ; i++)

               {

                       int num = random.nextInt(45);

                       if (boo[num])

                       {

                              boo[num] = false;

                choo[i] = num+1;

                       }                             

                       System.out.println(choo[i]);

               }

        }

}

class SortTest

{

        public static void main(String[] args)

        {

               String[] str = {"Orange","Apple","Grape","Peach","Lemon"};

               System.out.println("@@@@@ 정렬 전 @@@@@");

               for (int i=0; i<str.length; i++)

               {

                       System.out.println(str[i]);

               }

               System.out.println("@@@@@ 정렬 후 @@@@@");

               for (int j=0; j<str.length ; j++ )

               {

                       for (int i= j+1 ; i<str.length ; i++)

                       {

                              if ( str[i].compareTo(str[j]) < 0 )

                              {

                                      String temp = str[j];

                                      str[j] = str[i];

                                      str[i] = temp;  

                              }

                       }

                       System.out.println(str[j]);                                     

               }

        }

}

#####################################################################

 

#####################################################################

40. 클래스를 이용하는 샘플예제 소스

#####################################################################

class TopScret

{

        private int scret;

        public void setScret(int x){

               scret = x;

        }

        public int getScret(){

               return scret;

        }

}

public class TopScretMain

{

        public static void main(String[] args){

       

               TopScret top = new TopScret();

               top.setScret(4000);

               int i = top.getScret();

               System.out.println("i ->"+i);

               System.out.println("top.getScret() ->"+top.getScret());

        }

};

 

class MeanCalc

{

        private int sum;

        private int num;

        public void setValue(int x, int y, int z, int n){

               sum = x * y * z;

               num = n;

        }

        public int getValue(){

               return sum - num;

        }

}

public class MeanCalcMain

{

        public static void main(String[] args){

               MeanCalc cal = new MeanCalc();

               cal.setValue(100, 40, 500, 6);

               int z = cal.getValue();

               System.out.println("z ->"+z);

               System.out.println("cal ->"+cal);

        }

};

 

class MotorCycle

{

        private int id;

        private int speed;

        public void setData(int x, int y){

               id = x;

               speed = y;

        }

        public void drive(){

               System.out.println("id ->"+id);

               System.out.println("speed ->"+speed);

        }

}

public class MotorCycleMain

{

        public static void main(String[] args){

               MotorCycle m = new MotorCycle();

               m.setData(5384, 120);

               m.drive();

               System.out.println("m ->"+m);

 

               MotorCycle c = m;

               c.setData(7777, 100);

               c.drive();

               System.out.println("c ->"+c);

        }

};

#####################################################################

 

 

#####################################################################

39. 쿠키 셋팅에 관한 예제

#####################################################################

<form method="post" action="setCookie.jsp">

<input type="text" name="id"><br>

<input type="password" name="passwd"><br>

<input type="submit"><input type="reset">

 

<%@ page contentType="text/html;charset=euc-kr"%>

<%

        String id = request.getParameter("id");

        String passwd = request.getParameter("passwd");

        String value = request.getHeader("Cookie");

        if (value == null){

               Cookie cookie = new Cookie(id, passwd);

               cookie.setMaxAge(60);

               response.addCookie(cookie);

               out.println("Setting Cookie<br><hr>");

               out.println("id :"+id+ "<br>passwd :"+passwd);

 

        }else{

               out.println("Have done Cookie<br><hr>");      

               out.println("id :"+id+ "<br>passwd :"+passwd+"<br>");

               Cookie[] cookies = request.getCookies();

               for (int i=0; i<cookies.length; i++){

                       out.println("name :"+cookies[i].getName()+"<br>");

                       out.println("value :"+cookies[i].getValue()+"<br>");

                       out.println("domain :"+cookies[i].getDomain()+"<br>");

                       out.println("maxage :"+cookies[i].getMaxAge()+"<br>");

                       out.println("path :"+cookies[i].getPath()+"<br>");

                       out.println("secure :"+cookies[i].getSecure()+"<br>");

                       out.println("comment :"+cookies[i].getComment()+"<br>");

                       out.println("version :"+cookies[i].getVersion()+"<br>");

               }

 

        }

%>

#####################################################################

 

#####################################################################

38. 로긴 및 서블릿 관련 소스(한글처리)

#####################################################################

<BODY onContextmenu="return false">

<form name="login" action="/ServletJsp/servlet/loginServlet" method="post">

        <table border=1 cellspacing="0" cellpadding="0">

               <tr>

                       <td>User ID  </td>

                       <td><input type="text" name="id" ></td>

               </tr>

               <tr>

                       <td>Password  </td>

                       <td><input type="password" name="passwd"></td>

               </tr>

               <tr>

                       <td colspan=2 align=center>

                       <input type="submit" value="CONFIRM">

                       <input type="reset" value="CANCEL">

                       </td>

               </tr>

        </table>

</form>

</BODY>

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import util.HangulConversion;

public class loginServlet extends HttpServlet

{

        public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException

        {             

               //res.setContentType("text/html;charset=euc-kr");// 필히 설정함

               //PrintWriter out = res.getWriter();

               res.setContentType("text/html");        

               PrintWriter out = new PrintWriter( new OutputStreamWriter(res.getOutputStream(), "KSC5601"), true );

               String userid = HangulConversion.toKor(req.getParameter("id")); //util 팩키지에서 메소드 이용

               String passwd = req.getParameter("passwd");

               out.println("<html><body>");          

               if ( userid.equals("") && passwd.equals(""))

               {

                       out.println("NOWHERE");

               }else{         

                       out.println("INPUT ID IS :"+ userid +"<br>");

                       out.println("INPUT PASSWORD IS :"+passwd);

               }

               out.println("<p><font size=2><a href=javascript:history.back()>BACK TO THE FUTURE</a></font>");

               out.println("<body></html>");

               out.close();

        }

}

package util;

import java.io.*;

public class HangulConversion

{

        public static String toEng(String ko){

               if (ko ==null)

               {

                       return null;

               }

               try

               {

                       return new String(ko.getBytes("KSC5601"), "8859_1");

               }

               catch (Exception e)

               {

                       return ko;

               }

        }

        public static String toKor(String en){

               if (en == null)

               {

                       return null;

               }

               try

               {

                       return new String(en.getBytes("8859_1"), "KSC5601");

               }

               catch (Exception e)

               {

                       return en;

               }

        }

}

#####################################################################

37. 세션관련 정리 소스

#####################################################################

<form action="sessionCreate.jsp" method="post">

<table border="1" cellspacing=0 cellpadding=0 >

        <tr>

               <td> IDENTIFICATION </td>

               <td><input type=textfield name=id></td>

        </tr>

        <tr align=center>

               <td colspan=2><input type="submit" value="Confirm"><input type="reset" value="Cancel"></td>

        </tr>

<table>

</form>

<%@ page contentType="text/html;charset=euc-kr" session="false"%>

<%@ page import="util.HangulConversion"%>

<html>

<body>

Session Creation<br>

<%

        String id = HangulConversion.toKor(request.getParameter("id"));

        if (id.equals("")){              

               out.println("<hr>No Data<br>");

               out.println("<a href=javascript:history.back()>Back To The Future</a>");

               //response.sendRedirect("sessionLogin.html");

                return;

        }

        HttpSession session = request.getSession(true);

        if(session.isNew()){

               session.setAttribute("id", id); //세션을 설정한다

               out.println("<hr>New session is created :"+ id+"<br>");

               out.println("Session ID :"+session.getId()+"<br>");

               out.println("<a href=sessionRead.jsp>[Get Session]</a><br>");

        }else{

               out.println("<hr>Already exist session<br>");

               out.println("Input Id :"+id +"<br>");

               out.println("Session ID :"+session.getId()+"<br>"); //기존에 만든 세선 Id를 가져온다

               out.println("<a href=sessionRead.jsp>[Get Session]</a>");

        }

%>

</body>

</html>

<%@ page contentType="text/html;charset=euc-kr" session="false"%>

<html>

<body>

<%

        HttpSession session = request.getSession(false);

        String s = (String)session.getAttribute("id");

        if (s == null){

               out.println("Not Session");     

        }else{

               out.println("Attribute id is :"+s+"<br>");

        }

%>

<hr>

isNew() :<%= session.isNew()%><br>

Session ID :<%= session.getId()%><br>

Session Create Time :<%= new java.util.Date(session.getCreationTime()).toString()%><br>

Session Last Time&nbsp;&nbsp;:<%= new java.util.Date(session.getLastAccessedTime()).toString()%><br>

Session Active Time :<%= session.getMaxInactiveInterval()%> sec<br>

<a href="sessionDelete.jsp">[Session Delete]</a> <a href="sessionLogin.html">[Login Page]</a>

</body>

</html>

<%@ page contentType="text/html;charset=euc-kr" session="false" %>

<%

        HttpSession session = request.getSession(false);

        String s = (String)session.getAttribute("id");

        out.println("Id :"+s+"<br><hr>");

        if (session != null){

               session.invalidate();

        }

%>

Delete Session<br>

<a href="sessionLogin.html">Login Page</a>

 

#####################################################################

36. 메일을 발송하는 프로그램 소스

#####################################################################

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Hashtable;

import java.util.Properties;

import javax.mail.Message;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

public class SendMail {

        /**

         * @param pMAIL

         * @param conn

         */

        public Properties sendCronMail(Properties pARGS, Connection conn) {

               Properties pRETURN = new Properties();

               pRETURN.setProperty("RESULT", "true");

               String sMAIL_SMTP_HOST = pARGS.getProperty("MAIL_SMTP_HOST", "203.254.221.26");

               String sEMAIL_ADDRESS_FROM = pARGS.getProperty("EMAIL_ADDRESS_FROM", "swbupload@samsung.com"); // 보내는 사람 주소

               String sEMAIL_ADDRESS_TO = pARGS.getProperty("EMAIL_ADDRESS_TO", "swbupload@samsung.com"); // 받는 사람 주소

               String sSUBJECT = pARGS.getProperty("SUBJECT", "CronMail Error..."); // 타이틀

               String sTEXT = pARGS.getProperty("TEXT", "CronMail Error!!!"); // 내용

               try {

                       Properties pMAIL = System.getProperties();

                       pMAIL.put("mail.smtp.host", sMAIL_SMTP_HOST);

                       Session sMAIL_SESSION = Session.getDefaultInstance(pMAIL, null);

                       if (sMAIL_SESSION == null) {

                              pRETURN.setProperty("RESULT", "false");

                              pRETURN.setProperty("MSG", "Mail Session can't be created...");

                              return pRETURN;

                       }

                       MimeMessage reply = new MimeMessage(sMAIL_SESSION);

                       reply.setFrom(new InternetAddress(sEMAIL_ADDRESS_FROM));

                       reply.setSubject(sSUBJECT);

                       reply.setText(sTEXT);

                       reply.addRecipient(Message.RecipientType.TO, new InternetAddress(sEMAIL_ADDRESS_TO));

                       Transport.send(reply);

                       StringBuffer sbSQL = new StringBuffer();

                       sbSQL.append(" UPDATE SENDMAIL SET SENDDATE = TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') WHERE MAIL_ID = ?");

                       conn.setAutoCommit(false);

                       PreparedStatement pstmt = conn.prepareStatement(sbSQL.toString());

                       pstmt.setString(1, pARGS.getProperty("MAIL_ID", "1"));

                       pstmt.executeUpdate();

                       conn.commit();

               } catch (Exception e) {

                       pRETURN.setProperty("RESULT", "false");

                       pRETURN.setProperty("MSG", "sendCronMail(Properties pARGS) Error : " + e.toString());

               }

               return pRETURN;

        }

        public static void main(String[] args) {

               String sDB_URL = "jdbc:oracle:thin:@165.213.251.202:1521:itts";

               String sDB_USER = "itts";

               String sDB_PASSWORD = "skan00";

               Connection conn = null;

               PreparedStatement pstmt = null;

               ResultSet rs = null;

               try {

                       Class.forName("oracle.jdbc.driver.OracleDriver");

                       conn = DriverManager.getConnection(sDB_URL, sDB_USER, sDB_PASSWORD);

                       if (conn != null) {

                              StringBuffer sbSQL = new StringBuffer();

                              sbSQL.append(" SELECT MAIL_ID, MAIL_FROM, MAIL_TO, MAIL_SUBJECT, MAIL_BODY FROM SENDMAIL WHERE SENDDATE = '99991231235959'");

                              pstmt = conn.prepareStatement(sbSQL.toString());

                              rs = pstmt.executeQuery();

                              Hashtable htSENDMAIL = new Hashtable();

                              for (int i = 0; rs.next(); i++) {

                                      Properties pSendCronMail_ARGS = new Properties();

                                      pSendCronMail_ARGS.setProperty("MAIL_ID", rs.getString("MAIL_ID"));

                                      pSendCronMail_ARGS.setProperty("EMAIL_ADDRESS_FROM", rs.getString("MAIL_FROM"));

                                      pSendCronMail_ARGS.setProperty("EMAIL_ADDRESS_TO", rs.getString("MAIL_TO"));

                                      pSendCronMail_ARGS.setProperty("SUBJECT", rs.getString("MAIL_SUBJECT"));

                                      pSendCronMail_ARGS.setProperty("TEXT", rs.getString("MAIL_BODY"));

                                      htSENDMAIL.put(new Integer(i), pSendCronMail_ARGS);

                              }

                              rs.close();

                              pstmt.close();

                              SendMail cm = new SendMail();

                              for (int i = 0; i < htSENDMAIL.size(); i++) {

                                      cm.sendCronMail((Properties) htSENDMAIL.get(new Integer(i)), conn);

                              }

                       }

               } catch (ClassNotFoundException e) {

                       System.err.println(e.toString());

               } catch (SQLException e) {

                       System.err.println(e.toString());

               } finally {

                       try {

                              conn.close();

                       } catch (SQLException e1) {

                              System.err.println(e1.toString());

                       }

               }

        }

}

#####################################################################

35. 원도우 배치 프로그램 실행하기

#####################################################################

xcopy /s /e /y C:\Tomcat4\webapps\itts\paperless\fileupload e:\paperless\fileupload

 

move /Y C:\Tomcat4\webapps\itts\paperless\swbTempDir\*.* D:\PT-LOG\swbTempDir\

move /Y C:\Tomcat4\webapps\itts\paperless\mProSystem\log\*.* D:\PT-LOG\mProSystem\

move /Y C:\Tomcat4\webapps\itts\paperless\logs\*.* D:\PT-LOG\logs\

 

#####################################################################

34. 특정 폴더에 쌓이는 파일을 없애는 소스

#####################################################################

 

배치 프로그램을 돌리면서 로그파일을 남김.

java paperless.cron.TempPdfDelete e:\\pdf_temp 1 >> PtPDF_TEMP_DIR_DEL.log

 

import java.io.File;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Properties;

public class TempPdfDelete {

        public static void main(String[] args) {

               TempPdfDelete td = new TempPdfDelete();             

               String sTRASH_LOCATION = "e:\\pdf_temp";

               String sTRASH_DELETE_DAY = "1";           

               if( args.length == 2 ) {

                       sTRASH_LOCATION = args[0];

                       sTRASH_DELETE_DAY = args[1];

               }

               Properties pARGS = new Properties();

               pARGS.setProperty("TRASH_LOCATION", sTRASH_LOCATION);

               pARGS.setProperty("TRASH_DELETE_DAY", sTRASH_DELETE_DAY);

               Properties pRETURN = td.trashDelete(pARGS);

               SimpleDateFormat sdfTODAY = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

               Date dTODAY = new Date();           

               System.out.println("[" + sdfTODAY.format(dTODAY) + "] '"+sTRASH_LOCATION+"' Directory Deletion Started...");

               for(int i=0; i<Integer.parseInt(pRETURN.getProperty("DELETED_TRASH_FILE_COUNT")); i++) {

                       dTODAY = new Date();

                       System.out.println("[" + sdfTODAY.format(dTODAY) + "] " + pRETURN.getProperty("#" + i, "Deleted File Name not found") + " was deleted");

               }

               dTODAY = new Date();

               System.out.println("[" + sdfTODAY.format(dTODAY) + "] '"+sTRASH_LOCATION+"' Directory Deletion Ended...");

        }

        /**

         * @param pARGS

         * @return

         */

        private Properties trashDelete(Properties pARGS) {

               Properties pRETURN = new Properties();

               pRETURN.setProperty("RESULT", "true");

               String sTRASH_LOCATION = pARGS.getProperty("TRASH_LOCATION", "e:\\pdf_temp");

               if (sTRASH_LOCATION.trim().equals("")) {

                       pRETURN.setProperty("RESULT", "true");

                       pRETURN.setProperty("MSG", "TRASH_LOCATION is null...");

                       return pRETURN;

               }

               long lTRASH_DELETE_DAY = Long.parseLong(pARGS.getProperty("TRASH_DELETE_DAY", "0")) * 24 * 60 * 60 * 1000;

               File fTRASH_LOCATION = new File(sTRASH_LOCATION);

               int iDELETED_TRASH_FILE_COUNT = 0;

               if (fTRASH_LOCATION.isDirectory()) {

                       File[] fofTRASH_LOCATION_FILES = fTRASH_LOCATION.listFiles();

                       Date dTODAY = new Date();

                       for (int i = 0; i < fofTRASH_LOCATION_FILES.length; i++) {

                              long lTRASH_FILE_AGE = dTODAY.getTime() - fofTRASH_LOCATION_FILES[i].lastModified();

                              if (fofTRASH_LOCATION_FILES[i].isFile() && lTRASH_FILE_AGE >= lTRASH_DELETE_DAY) {

                                      if (fofTRASH_LOCATION_FILES[i].delete()) {

                                             pRETURN.setProperty("#" + String.valueOf(iDELETED_TRASH_FILE_COUNT), fofTRASH_LOCATION_FILES[i].getName());

                                             iDELETED_TRASH_FILE_COUNT++;

                                      }

                              }

                       }

               }

               pRETURN.setProperty("DELETED_TRASH_FILE_COUNT", String.valueOf(iDELETED_TRASH_FILE_COUNT));

               return pRETURN;

        }

}

#####################################################################

33. 암호와 알고리즘을 사용후 복호화 하는 소스와 적용예

#####################################################################

import javax.crypto.*;

import javax.crypto.spec.SecretKeySpec;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.spec.IvParameterSpec;

import java.security.*;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

public class AlgoDES {

    static byte[] seedKeyData = new byte[24];

    public AlgoDES() {

        seedKeyData[0] = 0x01;

        seedKeyData[1] = 0x02;

        seedKeyData[2] = 0x03;

        seedKeyData[3] = 0x04;

        seedKeyData[4] = 0x05;

        seedKeyData[5] = 0x06;

        seedKeyData[6] = 0x07;

        seedKeyData[7] = 0x08;

        seedKeyData[8] = 0x09;

        seedKeyData[9] = 0x10;

        seedKeyData[10] = 0x11;

        seedKeyData[11] = 0x12;

        seedKeyData[12] = 0x13;

        seedKeyData[13] = 0x14;

        seedKeyData[14] = 0x15;

        seedKeyData[15] = 0x16;

        seedKeyData[16] = 0x01;

        seedKeyData[17] = 0x02;

        seedKeyData[18] = 0x03;

        seedKeyData[19] = 0x04;

        seedKeyData[20] = 0x05;

        seedKeyData[21] = 0x06;

        seedKeyData[22] = 0x07;

        seedKeyData[23] = 0x08;

    }

    public static String encTripleDES(String beforeStr) {

        String afterStr = "";

        try {

            SecretKeySpec desKey = new SecretKeySpec(seedKeyData, "DESede"); //seedKeyData로 암호화

            Cipher desCipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");

            byte[] cleartext = beforeStr.getBytes();

            desCipher.init(Cipher.ENCRYPT_MODE, desKey);

            byte[] ciphertext = desCipher.doFinal(cleartext);

            afterStr = (new BASE64Encoder()).encode(ciphertext);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return afterStr;

    }

    public static String decTripleDES(String beforeStr) {        

        String afterStr = "";

        try {

            SecretKeySpec desKeyD = new SecretKeySpec(seedKeyData, "DESede");

            Cipher desCipherD = Cipher.getInstance("DESede/ECB/PKCS5Padding");

            desCipherD.init(Cipher.DECRYPT_MODE, desKeyD);

            byte[] decodedBytes = (new BASE64Decoder()).decodeBuffer(beforeStr);

            byte[] cleartext1 = desCipherD.doFinal(decodedBytes);

            afterStr = new String(cleartext1);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return afterStr;

    }

        public static void main(String args[]) {         

               try{

                       if (args.length > 0) {

                              for (int i = 0; i < args.length; i++) {

                                      String s = AlgoDES.encTripleDES(args[i]);

                                      String s1 = AlgoDES.decTripleDES(s);

                                      System.out.println("Original ["+args[i]+"]");

                                      System.out.println("encTripleDES ["+s+"]");

                                      System.out.println("decTripleDES ["+s1+"]");

                              }

       

                       }      

               } catch (Exception e) {

                       e.printStackTrace();

               }

        }

}

/** 적용예제

        if(secu) {

               _sdbServer = AlgoDES.decTripleDES(ReadConfig.get ("DATABASE", "dbServer")) ;

        }else{

               _sdbServer = ReadConfig.get ("DATABASE", "dbServer") ;

        }

    if(secu){

               _sdbPassword = AlgoDES.decTripleDES(ReadConfig.get ("DATABASE", "dbPassword")) ;

        }else{

               _sdbPassword = ReadConfig.get ("DATABASE", "dbPassword") ;

        }

*/

#####################################################################

32. 특수문자 제거 메소드

#####################################################################

public static String removeSpecialChar(String str) {

               if (str == null || str.trim().length() == 0)

                       return "";

               StringBuffer data = new StringBuffer(str);

               StringBuffer buf = new StringBuffer();

               for (int i = 0; i < data.length(); i++) {

                       char c = data.charAt(i);

                       if (((int) c > 47 && (int) c < 58) || ((int) c > 64 && (int) c < 91) || ((int) c > 96 && (int) c < 123))

                              buf.append(c);

               }

 

               return buf.toString();

}

 

#####################################################################

31. 날짜 관련 함수 이용

#####################################################################

import java.util.*;

import java.io.*;

import java.text.*;

public class DateCheck

{

        public static void main(String[] args)

        {

               SimpleDateFormat date = new SimpleDateFormat();

               date = (SimpleDateFormat)DateFormat.getDateTimeInstance();

               long now = System.currentTimeMillis();

               System.out.println("Now  ->/"+now+"/");

               Date dd = new Date();         

               System.out.println("Date ->/"+dd+"/");

               String str = date.format(new Date(now));

               System.out.println("Time ->/"+str+"/");         

        }

}

 

 

#####################################################################

30. Random 함수로 받은 값을 중복 체크하는 소소

#####################################################################

import java.util.*;

public class RandomTest

{

        public static void main(String[] args)

        {

               Random random = new Random();

               boolean[] total = new boolean[45];

               int[] choose = new int[6];             

               for (int i=0; i<total.length ; i++ )

               {

                       total[i] = true;

               }             

               for (int i=0; i<choose.length ; i++)

               {

                       int num = random.nextInt(45);                 

                       if (total[num])

                       {

                              total[num] = false;

                              choose[i] = num+1;                                  

                       }             

                       System.out.print( choose[i] + " \n");                 

               }

        }

}

 

#####################################################################

29. 버블 소트로 데이타 정렬

#####################################################################

public class SortTest

{

        public static void main(String[] args)

        {

               String[] str = {"Orange","Apple","Grape","Peach","Lemon"};

               System.out.println("@@@@@ 정렬 전 @@@@@");

               for (int i=0; i<str.length; i++)

               {

                       System.out.println(str[i]);

               }

               System.out.println("@@@@@ 정렬 후 @@@@@");

               for (int j=0; j<str.length ; j++ )

               {

                       for (int i= j+1 ; i<str.length ; i++)

                       {

                              if ( str[i].compareTo(str[j]) < 0 ) //음수이면 들어감

                              {

                                      String temp = str[j];

                                      str[j] = str[i];

                                      str[i] = temp;  

                              }

                       }

                       System.out.println(str[j]);                                     

               }

        }

}

#####################################################################

28. MD5로 암호화 하는 알고리즘 (Base64 필요)

#####################################################################

import sun.misc.*;

import java.io.*;

public class Base64Util {      

    public Base64Util() {}

    /**

     *   Base64Encoding을 수행한다. binany in ascii out

     *

     *   @param encodeBytes encoding byte array

     *   @return encoding String

     */

    public static String encode(byte[] encodeBytes) {

        BASE64Encoder base64Encoder = new BASE64Encoder();

        ByteArrayInputStream bin = new ByteArrayInputStream(encodeBytes);

        ByteArrayOutputStream bout = new ByteArrayOutputStream();

        byte[] buf = null;

        try{

            base64Encoder.encodeBuffer(bin, bout);

        } catch(Exception e) {

            System.out.println("Exception");

            e.printStackTrace();

        }

        buf = bout.toByteArray();

        return new String(buf).trim();

    }

    /**

     *   Base64Decoding 수행한다. binany out ascii in

     *

     *   @param strDecode decoding String

     *   @return decoding byte array

     */

    public static byte[] decode(String strDecode) {       

        BASE64Decoder base64Decoder = new BASE64Decoder();

        ByteArrayInputStream bin = new ByteArrayInputStream(strDecode.getBytes());

        ByteArrayOutputStream bout = new ByteArrayOutputStream();

        byte[] buf = null;

        try {           

            base64Decoder.decodeBuffer(bin, bout);

        } catch(Exception e) {

            System.out.println("Exception");

            e.printStackTrace();

        }

        buf = bout.toByteArray();

        return buf;

    }

}

import java.security.*;

public class  SecurityUtil {

    /**

     *   byte[] ret = HashUtil.digest("MD5", "abcd".getBytes());

     *  처럼 호출

     */

    public static byte[] digest(String alg, byte[] input) throws NoSuchAlgorithmException {

        MessageDigest md = MessageDigest.getInstance(alg);

        return md.digest(input);

    }

    public static String getCryptoMD5String(String inputValue) throws Exception {

        if( inputValue == null ) throw new Exception("Can't conver to Message Digest 5 String value!!");

        byte[] ret = digest("MD5", inputValue.getBytes());

        String result = Base64Util.encode(ret);   

        return result;

    }

        public static void main(String[] args) throws Exception

        {

               String passwd = SecurityUtil.getCryptoMD5String("gkskfh2005");

               System.out.println("passwd :"+passwd);

        }

}

#####################################################################

 

#####################################################################

27. TripleDES 을 이용한 암호화 알고리즘

#####################################################################

import javax.crypto.*;

import javax.crypto.spec.SecretKeySpec;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.spec.IvParameterSpec;

import java.security.*;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

public class AlgoDES {

    static byte[] seedKeyData = new byte[24];

    public AlgoDES() {

        seedKeyData[0] = 0x01;

        seedKeyData[1] = 0x02;

        seedKeyData[2] = 0x03;

        seedKeyData[3] = 0x04;

        seedKeyData[4] = 0x05;

        seedKeyData[5] = 0x06;

        seedKeyData[6] = 0x07;

        seedKeyData[7] = 0x08;

        seedKeyData[8] = 0x09;

        seedKeyData[9] = 0x10;

        seedKeyData[10] = 0x11;

        seedKeyData[11] = 0x12;

        seedKeyData[12] = 0x13;

        seedKeyData[13] = 0x14;

        seedKeyData[14] = 0x15;

        seedKeyData[15] = 0x16;

        seedKeyData[16] = 0x01;

        seedKeyData[17] = 0x02;

        seedKeyData[18] = 0x03;

        seedKeyData[19] = 0x04;

        seedKeyData[20] = 0x05;

        seedKeyData[21] = 0x06;

        seedKeyData[22] = 0x07;

        seedKeyData[23] = 0x08;

    }

    public static String encTripleDES(String beforeStr) {

        String afterStr = "";

        try {

            SecretKeySpec desKey = new SecretKeySpec(seedKeyData, "DESede"); //seedKeyData로 암호화

            Cipher desCipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");

            byte[] cleartext = beforeStr.getBytes();

            desCipher.init(Cipher.ENCRYPT_MODE, desKey);

            byte[] ciphertext = desCipher.doFinal(cleartext);

            afterStr = (new BASE64Encoder()).encode(ciphertext);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return afterStr;

    }

    public static String decTripleDES(String beforeStr) {        

        String afterStr = "";

        try {

            SecretKeySpec desKeyD = new SecretKeySpec(seedKeyData, "DESede");

            Cipher desCipherD = Cipher.getInstance("DESede/ECB/PKCS5Padding");

            desCipherD.init(Cipher.DECRYPT_MODE, desKeyD);

            byte[] decodedBytes = (new BASE64Decoder()).decodeBuffer(beforeStr);

            byte[] cleartext1 = desCipherD.doFinal(decodedBytes);

            afterStr = new String(cleartext1);

        } catch (Exception e) {

            e.printStackTrace();

        }

        return afterStr;

    }

        public static void main(String args[]) {         

               try{

                       if (args.length > 0) {

                              for (int i = 0; i < args.length; i++) {

                                      String s = AlgoDES.encTripleDES(args[i]);

                                      String s1 = AlgoDES.decTripleDES(s);

                                      System.out.println("Original ["+args[i]+"]");

                                      System.out.println("encTripleDES ["+s+"]");

                                      System.out.println("decTripleDES ["+s1+"]");

                              }      

                       }      

               } catch (Exception e) {

                       e.printStackTrace();

               }

        }

}

 

import java.security.*;

import javax.crypto.*;

public class TripleDes {

    public static void main(String [] args) throws Exception {

        if( args.length != 1) {

            System.out.println("Usage : java SimpleExample text ");

            System.exit(1);

        }

        String text = args[0];

        System.out.println("Generating a DESded (TripleDES) key...");

        // Triple DES 생성

        KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");

        keyGenerator.init(168);   // 키의 크기를 168비트로 초기화

        Key key = keyGenerator.generateKey();

        System.out.println("키생성이 완료되었음");

        // Cipher를 생성, 사용할 키로 초기화

        Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");

        cipher.init(Cipher.ENCRYPT_MODE, key);

        byte [] plainText = text.getBytes("UTF8");

        System.out.println("Plain Text : ");

        for (int i = 0; i < plainText.length ; i++) {

            System.out.print(plainText[i] + " ");

        }

        // 암호화 시작

        byte [] cipherText = cipher.doFinal(plainText);

        // 암호문서 출력

        System.out.println("\nCipher Text : ");

        for (int i = 0; i < cipherText.length ; i++)       {

            System.out.print(cipherText[i] + " ");

        }

        //복호화 모드로서 다시 초기화

        cipher.init(Cipher.DECRYPT_MODE, key);

        //복호화 수행

        byte [] decryptedText = cipher.doFinal(cipherText);

        String output =  new String(decryptedText, "UTF8");

        System.out.println("\nDecrypted Text : " + output);

    }

};

#####################################################################

 

#####################################################################

26. Random 클래스로 가져온 값을 중복체크하기

#####################################################################

import java.util.*;

public class RandomTest

{

        public static void main(String[] args)

        {

               Random random = new Random();

               boolean[] boo = new boolean[45];

                int[] choo = new int[6];

               for (int i=0; i<boo.length ;  )

               {

                       boo[i] = true;

               }

               for (int i=0; i<choo.length ; i++)

               {

                       int num = random.nextInt(45);

                       if (boo[num])

                       {

                              boo[num] = false;

                              choo[i] = num+1;      

                              System.out.println(choo[i]);

                       }                     

               }

        }

}

#####################################################################

 

#####################################################################

26. MS-SQL JDBC 드라이버 연결하는 방법

#####################################################################

 

다음의 사이트를 방문하여 MS-SQL2000 JDBC 드라이버를 다운로드

http://www.microsoft.com/sql/downloads/2000/jdbc.asp

적절한 위치에 설치하고 다음의 세 파일을 클래스패스에 추가 (%JAVA_HOME%\lib\ext\classes12.zip;)

설치 디렉터리/lib/msbase.jar 

설치 디렉터리/lib/msutil.jar 

설치 디렉터리/lib/mssqlserver.jar

 

MS-SQL2000, Oracle 그리고 MySQL 데이터베이스의 드라이버를 로딩하는 것을 각각 보여주고 있습니다.

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Class.forName("oracle.jdbc.driver.OracleDriver");

Class.forName("org.gjt.mm.mysql.Driver");

 

 

#####################################################################

 

#####################################################################

25. 날짜 포맷 바꾸는 방법

#####################################################################

 

String ETA_END_DATE = null;

String ETA_START_DATE = null;

String date_format = "yyyy-MM-dd";

SimpleDateFormat simpledateformat = new SimpleDateFormat(date_format);             

ETA_END_DATE = simpledateformat.format(Format.getSwbEndDate());

ETA_START_DATE = simpledateformat.format(Format.getSwbStartDate());

 

#####################################################################

24. 엔터키를 두르면 검색하는 소스

#####################################################################

 

<script language="JavaScript">

function goUrl(command, _url) {

        theForm = document.searchForm;      

        if (command == 'search'  && theForm.BLNO.value != null)

               theForm.BLNO.value = theForm.BLNO.value.toUpperCase();             

        theForm.command.value=command;

        theForm.PAGE.value="1";

        theForm.action = _url;

        theForm.submit();

}

function EnterCheck()

{      

        if(event.keyCode == 13)

               goUrl('search', '/servlet/paperless.SwbListServlet');

}

</script>

<form name="searchForm" method="post" action="">

<table width="98%" border="0" cellspacing="1" cellpadding="3">

    <input type="text" name="BLNO" class="main_input" value = "<%=blno%>"size="20" __onBlur="checkBLNo(this)" onKeyDown="EnterCheck()">

        <img src="../img/btn_multifile_upload.gif" width="92" height="18" border="0"

         onmouseover="this.style.cursor='hand'"

          onClick="goUrl('','/servlet/paperless.SwbUploadServlet')"/>

        <input type="hidden" name="PROCESS_TYPE" value="CARRIER"/>

</table>

</form>

 

#####################################################################

23. 데이터베이스 커넷션하고 로그파일을 만듬

#####################################################################

package common;

import BrokerBean;

import javax.servlet.jsp.PageContext;

import java.sql.SQLException;

import java.sql.Connection;

import java.sql.PreparedStatement;

public class SystemUsageHandler {

            synchronized public static void insertLog(PageContext jspContext, String id, String menu, String func, String comment) throws SQLException, Exception

            {

                       BrokerBean brokerBean = null;

                       Connection conn = null;

                       PreparedStatement pstmt = null;

                       try {

                              brokerBean = (BrokerBean) jspContext.getServletContext().getAttribute("DBPOOL");

                              conn = brokerBean.getDbConnection();

                              conn.setAutoCommit(false);

                              pstmt = conn.prepareStatement("insert into SYSTEM_USAGE_DETAIL (USER_ID, MENU, FUNC, COMMON ) "

                                             + " values (?,?,?,?)");

                              pstmt.setString(1, id);

                              pstmt.setString(2, menu);

                              pstmt.setString(3, func);

                              pstmt.setString(4, comment);

                              pstmt.executeUpdate();

                              conn.commit();

                       } catch (SQLException e) {

                              e.printStackTrace();

                              conn.rollback();

                       } catch (Exception e) {

                              e.printStackTrace();

                              conn.rollback();

                       } finally {

                              try {

                                      if (pstmt != null) pstmt.close();

                                      if (conn != null) brokerBean.freeConnection(conn);

                              } catch (Exception ae) {

                                      ae.printStackTrace();

                              }

                       }

               }

}

#####################################################################

 

 

#####################################################################

01. ServerSocket Socket 간의 채팅 소스

#####################################################################

import java.io.*;

import java.net.*;

import java.util.*;

public class Server_15

{

        public static void main(String[] args)

        {

               try

               {

                       ServerSocket server = new ServerSocket(9999);

                       while (true)

                       {

                              System.out.println("Server Ready");

                              Socket socket = server.accept();

                              ServerHandle_15 sh = new ServerHandle_15(socket);

                              Thread th = new Thread(sh);

                              th.start();

                       }

               }catch (IOException e){}       

        }

}

class ServerHandle_15 implements Runnable

{

        private DataInputStream dis = null;

        private DataOutputStream dos = null;

        private Socket socket = null;

        public static Vector v = new Vector();

        public ServerHandle_15(Socket socket){

               try

               {

                       dis = new DataInputStream(socket.getInputStream());

                       dos = new DataOutputStream(socket.getOutputStream());

                       v.addElement(this);

               }catch (IOException e){}       

        }

        public void run(){

               try

               {

                       while (true)

                       {

                              String str = dis.readUTF();

                              broad(str);

                       }                             

               }catch (IOException e){}

        }

        public void broad(String str){

               for (int i=0; i<v.size() ; i++)

               {

                       try

                       {

                              ServerHandle_15 sh = (ServerHandle_15)v.elementAt(i);

                              sh.dos.writeUTF(str);

                       }catch (IOException e){ }                     

               }                             

        }

};

 

import java.io.*;

import java.net.*;

public class Client_15 implements Runnable

{

        private DataInputStream dis = null;

        private DataOutputStream dos = null;

        private Socket socket = null;

        public Client_15()

        {

               try

               {

                       socket = new Socket("localhost", 9999);

                       dis = new DataInputStream(socket.getInputStream());

                       dos = new DataOutputStream(socket.getOutputStream());

                       Thread th = new Thread(this);

                       th.start();

                       display();

               }catch (IOException e){}

        }

        public void run(){

               try

               {

                       while (true)

                       {

                              String str = dis.readUTF();

                              System.out.println(str);

                       }                                                                  

               }catch (IOException e){}

        }

        public void display(){

               try

               {

                       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));                          

                       while (true)

                       {

                              String str = br.readLine();     

                              dos.writeUTF(str);

                       }                     

               }catch (IOException e){}

        }

        public static void main(String[] args){

               Client_15 sc = new Client_15();

        }

}

#####################################################################

 

 

#####################################################################

02. Swing에서 이미지 아이콘 삽입 및 종료

#####################################################################

import java.awt.*;

import javax.swing.*;

JFrame: Construct

private Container con;

con = this.getContentPane();

con.add(jbutton);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //플레임 종료

ImageIcon:

ImageIcon im = new ImageIcon("aa.gif");

this.setIconImage(im.getImage());

#####################################################################

 

 

#####################################################################

03. RMI 정상적인 예제

#####################################################################

package ksh.first;

import java.rmi.*;

public interface FirstRMI extends Remote{

        String getString() throws RemoteException;

        //void setString(String str) throws RemoteException;

}

#####################################################################

package ksh.first;

import java.rmi.*;

import java.rmi.server.*;

public class SecondRMI extends UnicastRemoteObject implements FirstRMI{

        public SecondRMI() throws RemoteException{

               super();

        }

        public String getString() throws RemoteException{

               return "Hello RMI!!!";

        }

}

#####################################################################

import ksh.first.*;

import java.rmi.*;

import java.net.*;

public class ThirdRMI{

        public static void main(String[] ar){

               SecondRMI sr = null;

               try{

                       sr = new SecondRMI();

                       Naming.rebind("first", sr);

                       System.out.println("Server Ready...");

               }catch(RemoteException ee){

               }catch(MalformedURLException ee){}

        }

}

#####################################################################

import ksh.first.*;

import java.rmi.*;

import java.net.*;

public class FourthRMI{

        public static void main(String[] ar){

               FirstRMI fr = null;

               try{

                       fr = (FirstRMI)Naming.lookup("rmi://192.168.0.155/first");

                       String str = fr.getString();

                       System.out.println("실행된 메시지 = " + str);

               }catch(NotBoundException ee){

               }catch(MalformedURLException ee){

               }catch(RemoteException ee){}

        }

}

#####################################################################

 

 

#####################################################################

04. RMI registry 등록하지 않고 사용

#####################################################################

package ksh.second;

import java.rmi.*;

public interface FirstRMI extends Remote{

        String getString() throws RemoteException;

}

#####################################################################

package ksh.second;

import java.rmi.*;

import java.rmi.server.*;

public class SecondRMI extends UnicastRemoteObject   implements FirstRMI{

        public SecondRMI() throws RemoteException{

               super();

        }

        public String getString() throws RemoteException{

               return "Hello RMI2!!";

        }

}

#####################################################################

import ksh.second.*;

import java.rmi.*;

import java.rmi.registry.*;

import java.net.*;

public class ThirdRMI{

        public static void main(String[] ar){

               Registry rg = null;

               SecondRMI sr = null;

               try{

                       rg = LocateRegistry.createRegistry(2000);

                       sr = new SecondRMI();

                       Naming.rebind("rmi://192.168.0.155:2000/second", sr);

                       System.out.println("Server Ready...");

               }catch(RemoteException ee){

               }catch(MalformedURLException ee){}

        }

}

#####################################################################

import ksh.second.*;

import java.rmi.*;

import java.net.*;

public class FourthRMI{

        public static void main(String[] ar){

               FirstRMI fr = null;

               try{

                       fr = (FirstRMI)Naming.lookup(

                                                                    "rmi://192.168.0.155:2000/second");

                       String str = fr.getString();

                       System.out.println("메시지 = " + str);

               }catch(NotBoundException ee){

               }catch(MalformedURLException ee){

               }catch(RemoteException ee){}

        }

}

#####################################################################

 

 

#####################################################################

05. RMI 통신법

#####################################################################

기본 Port 1099

Remote Method Invocation

rmi package & 중요 클래스

---------------------------------------------------------------------

1.서버: 공통 인터페이스, 구현 클래스, 스켈레톤 클래스, 서버실행 클래스

서버기동 bind(String str, Remote obj)

- 공통 인터페이스

        public 인터페이스, Remote 인터페이스를 상속

        abstract Method RemoteException 를 처리

        매개변수들은 객체이거나 직렬화가 가능

- 구현클래스

        public class Second extends UnicastRemoteObject implements FirstRMI 를 상속

- 스텝과 스켈레톤 계증 만들기

        rmic -d . ksh.first.SecondRMI 구현클래스로 생성한다.

- rmiregistry 기동해야 한다. 1099 Port 이용

        대체클래스로 기동할 수도 있다

        start rmiregistry 새창으로 돌려라 (unix에 백앤드 프로그램 생성하는 것과 같다)

- Binding 시키기 (등록시킨다)

        ThirdRMI {

               SecondRMI sr = new SecondRMI();

               sr.rebind("first", sr);

        }

        C\>start java ThirdRMI 로 실행

#####################################################################

2.클라이언트: 공통인터페이스, 스넵 클래스, GUI 클래스

- 서버 파일 가져오기, 스텝 클래스를 가져온다

        공통인터페이스 FirstRMI.class, SecondRMI_Stub.class

- 서버의 기동중인 객체를 얻어오기

        import ksh.first.*;

        import java.rmi.*;

        public class FourthRMI{

               try

               {

                       FirstRMI fr = new First();

                       fr = (FirstRMI)Naming.lookup("rmi://165.213.42.29:1099/first");

               }

               catch (NotBoundException e){}

               catch (MalformedURLException e){}

               catch (RemoteException e){}

        }

- 해당 객체를 통해서 Method 를 사용하기

        String str = fr.getString();

        System.out.println("얻어온 실행된 메시지 "+str);

#####################################################################

3. rmiregistry 대체 클래스

Registry interface (Naming class 와 유사)

LocateRegistry class

 

import ksh.second.*;

import java.rmi.*;

import java.rmi.registry.*;

import java.net.*;

public class ThirdRMI

{

        public static void main(String[] args){

               SecondRMI sc = null;

               Registry rg = null;

               try

               {

                       rg = LocateRegistry.createRegistry(2000);

                       sc = new SecondRMI();

                       Naming.rebind("rmi:192.168.0.155:2000/second", sc);

               }

               catch (RemoteException e){}

               catch (MalformedURLException e){}

        }

};

#####################################################################

 

 

#####################################################################

06. Directory 찾아서 리스트 만들기

#####################################################################

 

import java.io.*;

public class MakeFileList

{

        PrintWriter pw = null;

        public MakeFileList(){

               try

               {

                       FileOutputStream fos = new FileOutputStream(new File("./Text.txt"));

                       OutputStreamWriter osw = new OutputStreamWriter(fos, "EUC-KR");

                       pw = new PrintWriter(osw, true);

               }catch (IOException e){

                       System.out.println("File write error "+e);

               }

               searchDirectory(new File("."));

               pw.flush();

               pw.close();

        }

        public void searchDirectory(File here){

               File[] rootFileList = here.listFiles();

               for (int i=0; i<rootFileList.length ; i++ )

               {

                       if (rootFileList[i].isDirectory())

                       {

                              searchDirectory(rootFileList[i]);

                       }else{

                              try

                              {

                                      String filename = rootFileList[i].getName();

                                      String ext = filename.substring(filename.lastIndexOf("."), filename.length());

                                      if (!ext.equalsIgnoreCase(".gif") && !ext.equalsIgnoreCase(".jpg") )

                                      {

                                             pw.print(rootFileList[i].toURL());

                                             pw.print("\n");

                                             System.out.println(rootFileList[i].toURL());

                                      }else{

                                             System.out.println(ext);

                                      }

                              }catch (Exception e){}

                       }

               }

        }

        public static void main(String[] args){

               MakeFileList mf = new MakeFileList();

        }

};

#####################################################################

 

 

#####################################################################

07. IO 관련 소스

#####################################################################

Abstract OutStream을 이용한 입력하기

 

ch01 - AAA - Exam02_01.java, jar02.jar (jar -cvf jar02.jar *.*)

       BBB - Exam02_Main.java

jar 위치: C:\jdk1.3.1\jre\lib\ext\jar02.jar

 

private PrintStream ps;

public Exam02_03(){

        super();

        ps = System.out;

}

public void write(int i){

        ps.write(i);

        ps.flush();

}

public void close(){

        ps.close();

}

 

Exam02_03 es = new Exam02_03();

es.write(65);

es.write('\r');

es.write('\n');

byte[] bb = {'h','e','l','l','o'};

es.write(bb);

//es.close();

byte[] cc = "HELLO JAVA".getBytes();

es.write('\r');

es.write('\n');

es.write(cc, 0, 5);

es.write("송하연".getBytes("ISO8859_1"));

#####################################################################

private InputStream is;

public Exam02_04(){

        super();

        is  = System.in;

}

public int read() throws IOException{

        int xx = is.read();

        if (xx == '\n')

        {

               return -1;

        }

        return xx;

}

 

/*

byte[] bb = new byte[20];

System.out.print("입력 ");

System.in.read(bb);

int i = System.in.read();

System.out.println("입력된 문자 "+ new String(bb));

*/

Exam02_04 es = new Exam02_04();

byte[] bb = new byte[20];

System.out.print("입력 : ");

es.read(bb);

System.out.println("입력된 문자 : "+ new String(bb));

#####################################################################

 

 

#####################################################################

08. 파일을 읽는 소스

#####################################################################

 

int cnt;

FileReader rf = new FileReader("Test.java");            

cnt = rf.read();

while (cnt != -1)

{

        System.out.print(cnt);

        cnt = rf.read();

}

#####################################################################

 

 

#####################################################################

09. 입력받은 파일을 읽는 소스

#####################################################################

 

int cnt = 0;

System.out.print("Input your filename ");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = br.readLine();

RandomAccessFile raf = new RandomAccessFile(str, "r");

cnt = raf.read();

while (cnt != -1)

{

        System.out.print((char)cnt);

        cnt = raf.read();

}

#####################################################################

 

 

#####################################################################

10. 스트링을 파일로 저장하는 소스

#####################################################################

 

String str = "어디로 가야 할지";

char[] ch =  new char[str.length()];

str.getChars(0, ch.length, ch, 0);

FileWriter fw = new FileWriter(args[0]);

fw.write(ch);

fw.close();

#####################################################################

 

 

#####################################################################

11. 파일을 저장하는 소스

#####################################################################

 

FileOutputStream fos = new FileOutputStream(args[0]);

for (int i=0; i<500 ; i++ )

{

        fos.write(i);

}

fos.close();

System.out.println("FileOutputStream 했습니다!");

#####################################################################

 

 

#####################################################################

12. 에디터에는 볼 수 없으나 도스에서는 보임

#####################################################################

 

int cnt;

FileInputStream fis = new FileInputStream(args[0]);             

while ( (cnt = fis.read()) != -1)

{                     

        System.out.println(cnt);

}

System.out.println("FileInputStreamDemo를 확인했습니다.");

#####################################################################

 

 

#####################################################################

13. Properties 파일에 관련된 소스

#####################################################################

파일과 관련해서 Properties 저장하는 소스

 

Properties props = new Properties();

props.put("이름","마법사프로퍼티");

props.put("주소","마법의나라");

props.store(new FileOutputStream("properties.dat"),"프로퍼트테스트");

#####################################################################

 

 

#####################################################################

14. 파일과 관련해서 Properties 에서 읽어 오는 소스

#####################################################################

 

Properties props = new Properties();

props.load(new FileInputStream("properties.dat"));

System.out.println("이름: "+props.getProperty("이름"));

System.out.println("주소: "+props.getProperty("주소"));

#####################################################################

 

 

#####################################################################

15. 읽은 파일입력 후 내용확인하는 소스

#####################################################################

 

String fileInput;

int c = 0;;

System.out.print("Input your file name ");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

fileInput = br.readLine();

RandomAccessFile raf = new RandomAccessFile(fileInput, "r");

c = raf.read();

while ( c != -1 )

{

        System.out.print((char)c);

        c = raf.read();

}

raf.close();

#####################################################################

 

 

#####################################################################

16. 입력파일과 저장할 파일을 쓰는 소스

#####################################################################

 

String fileinput;

String fileoutput;

int c;

System.out.print("Input your filename ");

BufferedReader bf1 = new BufferedReader(new InputStreamReader(System.in));

fileinput = bf1.readLine();

System.out.print("Write save filename ");

BufferedReader bf2 = new BufferedReader(new InputStreamReader(System.in));

fileoutput = bf2.readLine();

RandomAccessFile raf1 = new RandomAccessFile(fileinput, "r");

RandomAccessFile raf2 = new RandomAccessFile(fileoutput, "rw");

c = raf1.read();

while (c!=-1)

{

        raf2.write(c);

        System.out.print((char)c);

        c = raf1.read();

}

raf1.close();

raf2.close();

#####################################################################

 

 

#####################################################################

17. 파일을 읽어서 보여주는 소스

#####################################################################

 

FileInputStream fis = new FileInputStream("Tst.java");

byte[] byteTxt = new byte[fis.available()];

fis.read(byteTxt);

fis.close();

System.out.println(new String(byteTxt));

#####################################################################

 

 

#####################################################################

18. 2초마다 출력하는 쓰레드 소스

#####################################################################

 

public class ThreadFromThread extends Thread

{

        public static void main(String[] args)

        {

               ThreadFromThread tt = new ThreadFromThread();

               tt.start();

        }

        public void run(){     

               try{

                       for(int i=0; i<10; i++)

                       {

                               Thread.sleep(2000);

                              System.out.println(i + " 2초 마다 출력되는 소스 !!!");

                       }                     

               }

               catch(InterruptedException e){}

        }

};

#####################################################################

 

#####################################################################

19. 배열과 관련하여

#####################################################################

2차원 배열 출력하는 소스

 

int[][] aa =

        {

               {1,  6, 11, 16, 21},

               {2,  7, 12, 17, 22},

               {3,  8, 13, 18, 23},

               {4,  9, 14, 19, 24},

               {5, 10, 15, 20, 25}

        };

for (int i=0; i<aa.length ; i++)

{

        if (i<5)

        {

               for (int j=0; j<aa[i].length ; j++ )

               {

                       System.out.print(aa[i][j] +"  ");

               }

               System.out.println();

        }                     

}

#####################################################################

 

 

#####################################################################

20. 배열로 합계 평균을 내는 소스

#####################################################################

 

int sum = 0;

long average = 0;             

int[] aa = {20, 30, 40, 50, 30, 70};

int len = aa.length;

for (int i=0; i<aa.length ; i++)

{             

        sum += aa[i];

}

System.out.println("sum ->/"+sum+"/");

System.out.println("average ->/"+(long)sum/len+"/");

#####################################################################

 

 

#####################################################################

21. 프로그램 인수를 받아 평균과 총계를 보여주는 소스

#####################################################################

 

if ( args.length<1 )

{

        System.out.println("Usage : java ArrayDe_05  ");

        System.exit(-1);

}

int aa = Integer.parseInt(args[0]);

int[] bb = new int[aa];

for (int i=0; i<bb.length ; i++ )

{

        bb[i] = i+1;

}

int sum = 0;

long average = 0;

int len = bb.length;

for (int i=0; i<bb.length ; i++ )

{

        sum += bb[i];

}

System.out.println("sum ->/"+sum+"/");

System.out.println("average ->/"+(long)sum/len+"/");

#####################################################################

 

 

#####################################################################

22. [실행되지 않으나 참고해야 할 소스]

#####################################################################

프로그램 실행시간을 체크하는 소스

 

CronLog cl = new CronLog("Maker.log");

Date dSTART_PROG = new Date();

중간 프로세스 처리

Date dEND_PROG = new Date();

long lELAPSED = dEND_PROG.getTime() - dSTART_PROG.getTime();

cl.log("Making started at " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(dSTART_PROG));

cl.log("Making ended at " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(dEND_PROG));

cl.log("Making " + lELAPSED / 1000 + " seconds elapsed.");

#####################################################################

 

 

#####################################################################

23. 로그 관련 소스

#####################################################################

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.PrintStream;

import java.util.Date;

import java.text.SimpleDateFormat;

import java.util.Calendar;

public class CronLog {

        private String sLOG_FILE = null, sLOG_PATH = null;

        private PrintStream out = null;

        SimpleDateFormat formatter;

        int iBACKUPFILE_KEEPING_DURATION = 30;    // 로그 파일 보관 일수(디폴트 30)

        public CronLog() {

               sLOG_FILE = makeLogFileName(Calendar.getInstance(), "MINU.log");

               formatter = new SimpleDateFormat("HH:mm:ss");

               removeLog( sLOG_FILE );

        }

        public CronLog(String sLOG_FILENAME) {

               sLOG_FILE = makeLogFileName(Calendar.getInstance(), sLOG_FILENAME);

               formatter = new SimpleDateFormat("HH:mm:ss");

               removeLog( sLOG_FILE );

        }

        public CronLog(String sLOG_FILENAME, int iBACKUPFILE_KEEPING_DURATION) {

               sLOG_FILE = makeLogFileName(Calendar.getInstance(), sLOG_FILENAME);

               formatter = new SimpleDateFormat("HH:mm:ss");

               this.iBACKUPFILE_KEEPING_DURATION = iBACKUPFILE_KEEPING_DURATION;

               removeLog( sLOG_FILE );

        }

        /** 해당 주기(iBACKUPFILE_KEEPING_DURATION)에 따라 로그 파일을 삭제함... */

        public void removeLog(String sLOG_FILE) {

               String sLOG_PATH = sLOG_FILE.substring(0, sLOG_FILE.lastIndexOf(File.separator)+1);

               if( sLOG_PATH.trim().equals("") ) {

                       sLOG_PATH = ".";

               }

               File fLOG_PATH = new File(sLOG_PATH);

               if( fLOG_PATH.isDirectory() ) {

                       File[] foLOG_FILES = fLOG_PATH.listFiles();

                       for(int i=0; i<foLOG_FILES.length; i++) {

                              File fLOG_FILE = foLOG_FILES[i];

                              long lLOG_FILE_ELAPSED = (new Date().getTime() - fLOG_FILE.lastModified()) / (24 * 60 * 60 * 1000);

                              if( fLOG_FILE.isFile() && lLOG_FILE_ELAPSED >= iBACKUPFILE_KEEPING_DURATION) {

                                      fLOG_FILE.delete();

                              }

                       }

               }

        }

        public void log(String sLOG) {

               if( sLOG_FILE == null ) {

                       sLOG_FILE = makeLogFileName(Calendar.getInstance(), "MINU.log");

               }             

               if( out == null ) {

                       File fLOG_FILE = new File(sLOG_FILE);       

                       FileOutputStream fos = null;

                       try {

                              fos = new FileOutputStream(sLOG_FILE, true);

                       } catch (FileNotFoundException e) {

                              System.err.println(e.toString());

                       }

                       out = new PrintStream(fos);

               }

               out.println("[" + formatter.format(new Date()) + "] " + sLOG);

        }

        public static String makeLogFileName(Calendar cal, String name) {

               java.util.Date dt = cal.getTime();

               SimpleDateFormat formatter = new SimpleDateFormat("@yyyy-MM-dd");

               String dateString = formatter.format(dt);

               int ind = name.indexOf(".");

               String head = name.substring(0, ind);

               String tail = name.substring(ind);

               name = head + dateString + tail;              

               checkDirectory(new File(name.substring(0, name.lastIndexOf(File.separator))));

               return name;

        }

        public static File checkDirectory(File dir) {

               File retVal = null;

               try {

                       if (!dir.isDirectory()) {

                              if (dir.mkdir()) {

                                      System.out.println("[" + dir.toString() + "] Directory Created, sucessfully.");

                              }

                       }

               } catch (Exception e) {

                       e.printStackTrace();

               }

               return dir;

        }

        public static void main(String[] args) {

               CronLog l = new CronLog("KKK.LOG");

               for(int i=0; i<100; i++ ) {

                       l.log(String.valueOf(i));

               }

               l.log("한글은???????????????????????????");

               l.log("Enddddddddddddddddddddddddddddddd");

        }

        public void log(int i) {

               log(String.valueOf(i));

        }

}

#####################################################################


2009. 9. 11. 13:23

설득의 비밀




EBS에서는 고맙게도 "다큐프라임" 이라는 재미있는 다큐 프로그램을 방영한다. 바로 얼마전에는 "설득" 을 주제로 한 5부작 장편 다큐멘터리를 방영하였다.

한편한편 보면서 몇 가지는 노트에 적기도 하면서 꽤 흥미있게 본 다큐멘터리이다.
다섯개의 에피소드 중에 내 흥미를 끌었던 에피소드가 있는데. 바로 세번째 에피소드이다.

이 에피소드에서는 사람의 유형을 4가지로 나누어서 그에 따른 특성과 대처법에 대한 설명을 적절한 사례와 함께 제시해주고 있다.

다큐프라임에서 말하는 네가지 유형은 다음과 같다.

 성취형 표출형
 분석형 우호형

성취형 :
  • 승부욕이 있고, 자기주장이 강하며 사람보다는 일이 우선이다. 그리고 감정표현을 잘 하지 않고, 포커페이스이다.
분석형 :
  • 어떠한 제안에 대해서 분명한 의사표현을 하고, 자기자신이 중심이다. 디테일한 데이터를 요구하며, 감정표현보다는 확실한 대안을 요구한다.
표출형 :
  • 평소 자기표현이 강하고 활달하다. 말이 많다. 과시욕이 있다. 
    • 이런 유형은 감정을 호소하여 설득하고, 과시욕을 자극하고, 어떠한 상황에 닥치면 적극적으로 대응하라.(스킨쉽이나, 애교등. 약간 과한 리엑션)
우호형 :
  • 감정이입이 쉽다. 관계를 확장하기보다는 기존관계를 유지하고 싶어한다. 
    • 이런 유형은 사람좋다 같은 칭찬은 피하고, 적절하게 맞장구를 쳐주어라.


당신은 대학교 학생회 간부이다. 학교 선배연예인을 무료로 섭외해야 한다. 당신이라면 어떻게 하겠는가?
이 연예인은 표출형 성향이 강한 사람이다.
감정적인 표현은 자제하고, 어떠한 이익을 직접적으로 제시하기 보다는 감성을 자극하여 접근하라. 과시욕을 자극하여 추켜세워주고, 그사람이 잘났다는 표현을 해가며 설득한다.

만나자마자 살갑게 형님형님 하면서 감정적인 부분을 호소하며 악수를 청하고, 형님이 꼭 오셔야 합니다 와 같은 멘트를 날리며 형님을 우리 학교 축제에서 만큼은 최고의 엠씨로 만들어드리겠습니다 와 같은 기분맞춰주는 멘틀를 날려 성공했다.


당신은 마케팅팀이다. 광고를 만들어야 하는데 주어진 예산은 삼천만원 뿐이다. 당신은 예산담당부장을 만나 예산을 일억까지 늘려야 한다. 당신은 어떻게 하겠는가?
이 예산담당부장은 분석형이다.
감정에 호소하지 말고 구체적인 데이터를 제시하라. 다만 구체적인 데이터만을 제시하지말고, 어떠한 구체적인 대안과 함께 데이터를 제시해야 효과가 있다. 이러한 사람에게 감정에 호소하는 설득은 추천하지 않는다.

우선 회사의 CF 를 변경해야 하는 구체적인 이유를 설문조사와 같은 데이터와 함께 제시한 뒤, 이미 내정된 삼천만원을 우선 지원해주고, 나머지 예산에 대해서는 계약을 파기한 모델에게 위약금으로 받을 수 있다고 설득하여 예산승인 설득에 성공하였다.


당신은 사회복지법인에 속해 있다. 와인회사 사장에게 기부금 천만원을 받아내야 한다. 어떤식으로 접근해야 할까.
이 와인회사 사장은 성취형이다.
이런 사람들은 데이터를 제시하여 설득하기 보다는 감정적으로 설득한다.

경쟁업체는 일억 기부했다. 와 같은 경쟁심을 자극시키는 발언이나, 사모님에게 선물을 할 때 만원이만원 보다는 십만원 오십만원 하지 않겠냐, 기부를 할 때도 백만원 보다는 천만원을 기부하는 것이 기업이미지에 도움이 된다. 라는 감정적인 메시지들을 날려 설득에 성공했다.


중고차 딜러에게 차값을 이백만원 깎아서 사라. 이 딜러는 우호형이다.
우호형 사람에게는 설득을 성공한 사람이 아무도 없는데, 그만큼 힘든 유형이라 할 수 있겠다.
사람좋다는 칭찬이나, 주변사람을 소개시켜주겠다는 소리보다는 현재의 관계에 집중하여 설득한다.


당신은 어떤 유형에 가까운가요.
또 당신의 주변사람들은 어떤 유형에 가까운지 생각해보고 한번 유형을 적용해 시험해보세요.

2009. 9. 8. 14:58

[Oracle] 부정형(NOT IN, <>, NOT EXISTS ...)의 비교





PURPOSE
 
부정형의 비교를 긍정형 비교로 바꾸어서 인덱스 사용을 유도하는 방법에 대해서 알아본다.


KEY IDEA
 
부정형의 비교에는 논리적으로 인덱스를 사용할 수 없다. 하지만 약간의 IDEA를 첨부한다면
부정형의 비교를 긍정형의 비교로 바꾸어서 인덱스의 사용을 유도할 수 있다.
(KEY WORD : INDEX 활용, 인덱스, 부정형 비교, NOT IN, NOT EXISTS, <> )


DESCRIPTION
  
다음의 SQL을 보자.
     SELECT ‘Not found’  FROM EMP WHERE EMPNO <> ‘1234’

  • 대개의 Application에서는 사용자가 처리한 데이터의 타당성을 검증하기 위해 이 값의
    존재 유무를 확인하는 경우가 빈번하게 발생한다.  
    이럴 경우 위의 예처럼 부정형의 문장을 사용하는 경우가 자주 있다.

  • 하지만 아래와 같이 ‘NOT EXISTS’를 이용해서 서브쿼리(SUB-QUERY)내의 SQL을 긍정형으로 바꾸면 인덱스를 사용할 수 있다.

     SELECT ‘NOT FOUND’ FROM DUAL
        WHERE NOT EXISTS ( SELECT ‘X’ FROM EMP WHERE EMPNO = ‘1234’ )

  • 그러나 ‘EXISTS’를 사용하는 것이 항상 유리한 것은 아니다. 다음의 3개의 SQL을 보자.

    [SQL1]
      SELECT * FROM TAB1
         WHERE YYYYMM = ‘199910’
             AND NOT EXISTS ( SELECT * FROM TAB2
                                       WHERE COL2 = COL1
                                           AND YYYYMM = ‘199910’ )
    [SQL2]
      SELECT * FROM TAB1
          WHERE YYYYMM =’199910’
              AND COL1 NOT IN (SELECT COL2 FROM TAB2
                                           WHERE YYYYMM = ‘199910’ )
    [SQL3]
       SELECT * FROM TAB1
           WHERE (YYYYMM, COL1) IN ( SELECT ‘199910’, COL1 FROM TAB1
                                                       WHERE YYYYMM = ‘199910’
                                                   MINUS
                                                   SELECT ‘199910’, COL2 FROM TAB2
                                                        WHERE YYYYMM = ‘199910’ )

  • TAB1 테이블의 ‘YYYYMM’, ‘COL1’이 각각 인덱스로 생성되어 있고
    TAB2의 ‘YYYYMM’, ‘COL2’가 각각 인덱스로 생성되어 있다.
     
  • [SQL1] 은 ‘TAB1’의 ‘YYYYMM’ 인덱스만을 사용하여 테이블의 로우를 엑세스하고
    각 로우마다 TAB2 테이블을 엑세스하는 서브쿼리가 수행되어 TAB2 에 존재하지 않는
    로우만 추출하게 된다. 이 SQL은 ‘199910’조건에 해당하는 모든 로우에 대해 서브
    쿼리가 랜덤엑세스를 수행한다. 왜냐하면 서브쿼리내에 메인쿼리의 컬럼인 'COL1'이
    존재하기 때문
    이다.
     
  • [SQL2] 는 서브쿼리 내에 메인쿼리 컬럼을 없애기 위해 작성하였지만 동일한 결과를
    초래한다. 그 이유는 'NOT IN'을 사용한 서브쿼리는 항상 나중에 수행되거나
    필터링(Filtering) 조인방식으로 수행되기 때문
    이다.
     
  • [SQL3]은 각 테이블에 ‘YYYYMM + COL1’, ‘YYYYMM + COL2’의 결합인덱스가 존재한
    다면 먼저 서브쿼리에서 두 개의 테이블을 ‘MINUS’하여 결과를 추출하고 그 결과를
    이용해 메인쿼리를 엑세스하게 할 수 있다. 이 경우에는 서브쿼리가 먼저 수행된다.
    인덱스만으로도 처리가 가능하기 때문에 테이블을 엑세스하지 않고 양쪽 테이블의
    인덱스들만 범위스캔(Range Scan)하여 ‘SORT-MERGE’방식으로 서브쿼리가 처리 된다.
     
  • 위의 경우에서는 결과적으로 [SQL3]가 가장 유리한 처리방법이라 하겠다.

참고 : http://kdonghwa.tistory.com/58?srchid=BR1http%3A%2F%2Fkdonghwa.tistory.com%2F58

2009. 9. 8. 14:55

이수근 쇼핑몰

























`국민 일꾼` 이수근, 남성의류 쇼핑몰 `뉴욕개미` 오픈

KBS2 '해피선데이'의 '1박 2일'을 통해 인기를 얻고 있는 개그맨 이수근이 남성의류 쇼핑몰을 열었다. 쇼핑몰의 이름은 '뉴욕개미'(www.nygami.com). 20~30대 남성들을 주 타깃으로 심플하지만 고급스러운 비즈니스 캐주얼의 옷을 선보인다




대한민국 남성들의 패션코치를 자청한 이수근은 남성의류 쇼핑몰 '뉴욕개미'(www.nygami.com)를 오픈했다

이수근 쇼핑몰 주소
www.nygami.com
2009. 9. 8. 14:53

재범 결국 활동중단





'한국 비하논란' 네티즌 싸늘… '노다지' 하차

'한국 비하 논란'의 파고가 점차 거세지고 있다.

2PM 리더 재범이 MBC 예능프로그램 <일요일 일요일 밤에> '노다지' 코너에서 하차한다. '노다지'코너 제작 관계자는 "재범은 프로그램에 고정 출연자가 아니었기 때문에 프로그램 하차라고는 볼 수 없다. 하지만 이번 사태에 깊이 반성하는 의미로 프로그램 출연을 하지 않겠다는 의사를 전해왔다"고 밝혔다.

2PM 소속사 JYP 엔터테인먼트에 따르면 '한국 비하 논란'에 반성하는 의미로 재범의 모든 활동을 중단하기로 결정했다. 재범은 논란이 불거진 당일과 다음날까지 모든 스케줄을 소화했지만 비난 여론으로 인해 더는 활동을 지속할 수 있는 상황에 처했다. 재범과 소속사 측의 사과에도 불구하고 대중의 반응은 냉담하기만 하다.

일부 네티즌들은 유승준과 비교하며 2PM 퇴출 운동 및 미국으로 돌아가라며 강도 높게 비난하고 있다. 네티즌들은 "재범은 제2의 유승준이다" "한국을 돈벌이 수단으로만 이용하려면 미국으로 떠나라"라며 비난을 쏟아내고 있다. 한 인터넷 포털사이트에서는 재범의 2PM 하차와 2PM의 활동 중단을 청원하는 설문조사가 진행되고 있다. 이 조사에 수천 개의 댓글이 달릴 정도로 대중의 반응이 뜨겁다.

일각에서는 "잘못을 했지만 데뷔하기 아주 오래전 얘기다. 반성하고 있으니 용서해 줘야 한다" "마녀사냥으로 인해 한 사람의 인생이 망가질 수 있다"며 우려했다. 재범이 아직 나이가 어리고, 미국에서 태어나 자랐기 때문에 문화적인 차이점을 인정해 줘야 한다고 주장하고 있다.

한 방송 관계자는 "재범과 2PM 모두 이 일로 인해 이미지의 큰 타격을 입었다. 더욱이 대중들이 이번 사건을 과거 연예인들이 욱일승천기와 가미카제 등의 그려진 옷을 입거나, 말실수를 하는 것과는 다른 차원의 것으로 생각하는 것 같다. 쉽게 가라 앉을 논란으로 보이지 않는다"고 전망했다.

재범은 2005년부터 미국 소셜 네트워킹 사이트 마이 스페이스에 한국과 한국인을 비하하는 듯한 문구를 남겼다. 재범은 이내 공개 사과를 했음에도 불구하고 비난 여론은 계속되고 있다.
2009. 9. 8. 14:51

재범 활동중단




'한국 비하논란' 네티즌 싸늘… '노다지' 하차

'한국 비하 논란'의 파고가 점차 거세지고 있다.

2PM 리더 재범이 MBC 예능프로그램 <일요일 일요일 밤에> '노다지' 코너에서 하차한다. '노다지'코너 제작 관계자는 "재범은 프로그램에 고정 출연자가 아니었기 때문에 프로그램 하차라고는 볼 수 없다. 하지만 이번 사태에 깊이 반성하는 의미로 프로그램 출연을 하지 않겠다는 의사를 전해왔다"고 밝혔다.

2PM 소속사 JYP 엔터테인먼트에 따르면 '한국 비하 논란'에 반성하는 의미로 재범의 모든 활동을 중단하기로 결정했다. 재범은 논란이 불거진 당일과 다음날까지 모든 스케줄을 소화했지만 비난 여론으로 인해 더는 활동을 지속할 수 있는 상황에 처했다. 재범과 소속사 측의 사과에도 불구하고 대중의 반응은 냉담하기만 하다.

일부 네티즌들은 유승준과 비교하며 2PM 퇴출 운동 및 미국으로 돌아가라며 강도 높게 비난하고 있다. 네티즌들은 "재범은 제2의 유승준이다" "한국을 돈벌이 수단으로만 이용하려면 미국으로 떠나라"라며 비난을 쏟아내고 있다. 한 인터넷 포털사이트에서는 재범의 2PM 하차와 2PM의 활동 중단을 청원하는 설문조사가 진행되고 있다. 이 조사에 수천 개의 댓글이 달릴 정도로 대중의 반응이 뜨겁다.

일각에서는 "잘못을 했지만 데뷔하기 아주 오래전 얘기다. 반성하고 있으니 용서해 줘야 한다" "마녀사냥으로 인해 한 사람의 인생이 망가질 수 있다"며 우려했다. 재범이 아직 나이가 어리고, 미국에서 태어나 자랐기 때문에 문화적인 차이점을 인정해 줘야 한다고 주장하고 있다.

한 방송 관계자는 "재범과 2PM 모두 이 일로 인해 이미지의 큰 타격을 입었다. 더욱이 대중들이 이번 사건을 과거 연예인들이 욱일승천기와 가미카제 등의 그려진 옷을 입거나, 말실수를 하는 것과는 다른 차원의 것으로 생각하는 것 같다. 쉽게 가라 앉을 논란으로 보이지 않는다"고 전망했다.

재범은 2005년부터 미국 소셜 네트워킹 사이트 마이 스페이스에 한국과 한국인을 비하하는 듯한 문구를 남겼다. 재범은 이내 공개 사과를 했음에도 불구하고 비난 여론은 계속되고 있다.