출처) http://shonm.tistory.com/category/JAVA/PDF%20%EB%B3%80%ED%99%98


추가글 : http://guni.tistory.com/223  < itext 설명 



itext 라는 library 로 html -> pdf 로 변환이 가능 하다.

 

소스는 아래와 같다.

 

필요한 한글 font 파일과 library 파일들은 첨부 한다.

 

 

1. 한국어는 역시 폰트 문제 때문에 고생이다. font 설정을 위한 class 파일 생성이

필요하다.

 

package com.incross.pdf;

import java.io.IOException;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactoryImp;
import com.itextpdf.text.pdf.BaseFont;

 

public class DefaultFontProvider extends FontFactoryImp {
 private String _default;
 public DefaultFontProvider(String def) {
  _default = def;
 }
 // I believe this is the correct override, but there are quite a few others.
 public Font getFont(String fontname,String encoding, boolean embedded, float size,int style, BaseColor color) {
  try {

   return new Font(BaseFont.createFont(_default, BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 9, style, BaseColor.BLACK);
  } catch (DocumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return null;
 }
}

 

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

 

2. pdf 만드는 로직이 필요하다.

 

package com.incross.pdf;


import java.io.FileOutputStream;
import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import com.incross.pdf.DefaultFontProvider;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.html.simpleparser.HTMLWorker;
import com.itextpdf.text.html.simpleparser.StyleSheet;
import com.itextpdf.text.pdf.PdfWriter;


public class ConvertHTMLToPDF {
 public static void main(String[] args) {     
  String file = "c:\\test.pdf";   
  
  PdfWriter pdfWriter = null;       
  
  
  try{
  
    //create a new document   
    Document document = new Document();       
      
    //get Instance of the PDFWriter    
    pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(file));         
 
    document.setPageSize(PageSize.A4);      
 
    document.open();        


    HTMLWorker htmlWorker = new HTMLWorker(document);
    
    
    HashMap<String,Object> interfaceProps = new HashMap<String,Object>();
     
   
    StyleSheet styles = new StyleSheet();
    
   
    
    DefaultFontProvider dfp=new DefaultFontProvider("c:\\malgun.ttf");
    //폰트 파일 설정 (한글 나오게 하기 위해 설정 필요함
    interfaceProps.put(HTMLWorker.FONT_PROVIDER,dfp);


    
    StringBuffer sb = new StringBuffer();
       sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
       
       sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");    
    
       sb.append("<html>");
    
    sb.append("<head>");
    
    sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
    //sb.append("<link rel=\"stylesheet\" type=\"text/css\" href="+StringUtil.getPropWord("pdf.css.path")+" />");
    sb.append("</head>");
    
    sb.append("<body>");
    
    sb.append("<table border='1'>");
    
    sb.append("  <tr>");
    
    sb.append("    <td> 테스트  </td>");
    
    sb.append("  <tr>");
    
    sb.append("</table>");
    
    sb.append("<img src='http://static.naver.net/www/u/2010/0611/nmms_215646753.gif'/>");

    sb.append("</body>");
    
    
    sb.append("</html>");
    
    System.out.println("html:"+sb.toString());
    

    StringReader strReader = new StringReader(sb.toString());

    List<Element> objects = htmlWorker.parseToList(strReader, styles, interfaceProps);
    
    for (int k = 0; k < objects.size(); ++k){
     
     document.add((Element) objects.get(k));

    }

    document.close();   
    //close the writer    
    pdfWriter.close();     
  }catch(Exception e){
   e.printStackTrace();
  }
 }    
 


 }

 

 

 dom4j.jar

 

 itext-pdfa-5.3.3.jar

 

 itext-xtra-5.3.3.jar

 

 itextpdf-5.3.3.jar

 

 jaxen-full.jar

 

 jdom.jar

 

 xmlworker-1.2.0.jar

 

 malgun.ttf

 

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

 

결과 화면

'HTML5.0' 카테고리의 다른 글

windy 실시간 기상 영상  (0) 2019.10.09
div 불투명 깔기 . 소스  (0) 2012.06.08
html animation  (0) 2012.06.08
div의 overflow 및 postion  (0) 2012.06.07
캔버스 위에 div 를 올리자.  (0) 2012.06.05
Posted by 사라링

jsp BLOb 타입 다운로드

2013. 3. 13. 09:44

<%@page import="oracle.jdbc.driver.OracleResultSet"%>

<%@page import="com.base.SystemException"%>

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

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


    <%


request.setCharacterEncoding("utf-8");

    response.reset();

    

    String conversation_ID  = request.getParameter("CLS_CONVERSATION_ID");

    String file_Seq = request.getParameter("CLS_FILE_SEQ");

Blob             emptyBlob = null;

OutputStream     outstream = null;

FileInputStream finstream = null;

ResultSet rs = null;

PreparedStatement pstmt = null;

Connection conn = null;


try {

javax.naming.Context env = new javax.naming.InitialContext();

javax.sql.DataSource source = (javax.sql.DataSource) env.lookup("baseDS");

conn = source.getConnection();

conn.setAutoCommit(false);

} catch (Exception e) {

throw new SystemException(e);

}

StringBuffer query  = new StringBuffer();


query.append("SELECT FILE_NAME, FILE_BINARY FROM SYN_XXSB_DCT_FILE WHERE CONVERSATION_ID = ? AND FILE_SEQ = ?  ");


try {

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

pstmt.setString(1, conversation_ID.trim());

pstmt.setString(2, file_Seq.trim());

rs = pstmt.executeQuery();

String fileName= "";

while(rs.next()){

fileName = rs.getString(1);

oracle.sql.BLOB blob = ((OracleResultSet)rs).getBLOB(2);

InputStream is = (blob.getBinaryStream());

String fileType = fileName.substring(fileName.indexOf(".")+1,fileName.length());

response.setContentType("application/x-msdownload"); 

response.setHeader("Content-Disposition", "attachment;filename="+fileName+";");

OutputStream os = response.getOutputStream();

int size = blob.getBufferSize();

byte[] buffer = new byte[size];

int length = -1;

while((length=is.read(buffer))!=-1){

os.write(buffer,0,length);

}

os.flush();

os.close();

is.close();

}

} catch (Exception e) {

throw new SystemException(e);

}finally{

try {if (rs != null)  rs.close(); } catch (Exception ex) {}

try {if (pstmt != null) pstmt.close();} catch (Exception ex) {}

try {if (conn != null) conn.close();}  catch (Exception ex) {}

}



    

    

    %>

Posted by 사라링

dialog 예제

2013. 3. 12. 13:11

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <link rel="stylesheet" href="css/base/jquery.ui.all.css">
  <script type="text/xxjavascript" src="js/jquery-1.4.4.js"></script>
  <script type="text/xxjavascript" src="js/jquery-ui-1.8.9.custom.js"></script>
  <script type="text/xxjavascript">
 $(document).ready(function(){
  // default가 true인것은 굳이 설정하지 않아도 적용됨.
  $("#dialog1").dialog({
   disabled: false,  // ????????????????????????
   autoOpen: false,     // 다이얼로그 창이 자동으로 보이게 하는지의 여부 설정.
   //buttons: {"ok" : function() { alert(‍"ok 하셨습니다!!"); }, "cancel" : function() { $(this).dialog("close"); } }   // 버튼 설정1.
   buttons: [         // 버튼 설정2. 배열로 이벤트까지 직접 설정할 수 있다.
     {
      text: "ok",
      click:  function() { alert(‍"ok 하셨습니다!!"); }
     },
     {
      text: "cancel",
      click:  function() { $(this).dialog("close");  }
     }
      ],
   closeOnEscape: false,    // ESC키를 눌렀을때 다이얼로그 박스를 닫을것인지의 설정. 설정하지않으면 기본 true로써 닫히게된다.
   closeText: "창닫기",       // 창을 닫는 텍스트를 추가할 수 있다.
   dialogClass: "alert",   // ??????????????????????????????
   draggable: false,   //  드래그를 가능하게할지 여부. 기본 true로써 드래그가 가능하다.
   height: 400,    // 창의 높이 설정. 기본 auto.
   width: 800,    // 창의 넓이 설정. 기본 auto.
   hide: "slide",     // 다이얼로그가 닫길때의 효과 설정.
   maxHeight: 600,    // 리사이징 될때의 최대 높이를 설정.
   maxWidth: 500,    // 리사이징 될때의 최대 넓이를 설정.
   minHeight: 600,    // 리사이징 될때의 최소 높이를 설정.
   minWidth: 500,     // 리사이징 될때의 최소 넓이를 설정.
   modal: true,     // 모달창으로서 사용할지의 여부 설정. 마스크레이어가 자동 설정된다.
   //position: "left"     // 창의 위치 설정. top, right, bottom, left.
   //position: ["right","top"]   // 창의 위치 설정.
   //position: [350,400]             // 창의 위치 설정. 픽셀로 설정할 수 있다.
   resizable: false,    // 리사이징 가능 여부.
   show: "slide",     // 창을 오픈할때의 효과 지정. 여러가지 효과를 지정할 수 있다.
   //stack: false     // 여러개의 창을 띄울때 마지막에 띄운 창이 다른 창위에 쌓여서 보이게 할지의 여부 설정.
   title: "첫번째 다이얼로그" // 다이얼로그의 타이틀 지정. html 코드도 올 수 있다. 다이얼로그로 지정된 html태그에 타이틀 속성으로도 지정할수있다.
   //zIndex: 3999     // 다이얼로그의 zindex를 지정. 기본값은 1000이다.
  });

 


  $("#dialog2").dialog({
   autoOpen: false,    // 다이얼로그 창이 자동으로 보이게 하는지의 여부 설정.
   height: 600,
   width: 700,
   title: "<h2>두번째 다이얼로그</h2>"
  });


  $("#dialog3").dialog({
   autoOpen: false,    // 다이얼로그 창이 자동으로 보이게 하는지의 여부 설정.
   height: 600,
   width: 700,
   create: function(event,ui){          // 창이 생성될때 호출되는 콜백함수.
    alert(‍"창이 생성될때의 이벤트");
   },
   beforeClose: function(event,ui){   // 창이 닫히기 직전에 호출되는 콜백함수.
    alert(‍"창이 닫히기 직전때의 이벤트");
   },
   open: function(event,ui){  // 창이 열릴때 호출되는 콜백함수.
    alert(‍"창이 열릴때의 이벤트");
   },
   //focus: function(event,ui){  // 창에 포커스가 왔을때 호출되는 콜백함수.
    //alert(‍"창에 포커스가 왔을때의 이벤트");
   //},
   //dragStart: function(event,ui){  // 드래그가 시작될때 호출되는 콜백함수.
    //alert(‍"드래그가 시작될때의 이벤트");
   //},
   //drag: function(event,ui){  // 드래그 될때 호출되는 콜백함수.
    //alert(‍"드래그 될때의 이벤트");
   //},
   dragStop: function(event,ui){  // 드래그가 끝날때 호출되는 콜백함수.
    alert(‍"드래그가 끝날때의 이벤트");
   },
   resizeStart: function(event,ui){  // 리사이징이 시작될때 호출되는 콜백함수.
    alert(‍"리사이징이 시작될때의 이벤트");
   },
   resize: function(event,ui){  // 리사이징 될때 호출되는 콜백함수.
    alert(‍"리사이징 될때의 이벤트");
   },
   resizeStop: function(event,ui){  //  리사이징이 끝날때 호출되는 콜백함수.
    alert(‍"리사이징이 끝날때의 이벤트");
   },
   close: function(event,ui){  //  창이 닫힐때 호출되는 콜백함수.
    alert(‍"창이 닫힐때의 이벤트");
   }

  });

  // 버튼을 클릭하여 창을 열기.
  $("#btn_dialog1_open").click(function(){
   $("#dialog1").dialog("open");  // 첫번째 다이얼로그 박스를 오픈한다. 닫는것은 $("#dialog1").dialog("close");
  });

  $("#btn_dialog2_open").click(function(){
   $("#dialog2").dialog("open"); // 두번째 다이얼로그 박스를 오픈한다.
  });

  $("#btn_dialog3_open").click(function(){
   $("#dialog3").dialog("open"); // 두번째 다이얼로그 박스를 오픈한다.
  });
 });

 /*
  Methods
destroy
Signature: 
.dialog( "destroy" ) 
Remove the dialog functionality completely. This will return the element back to its pre-init state.

disable
Signature: 
.dialog( "disable" ) 
Disable the dialog.

enable
Signature: 
.dialog( "enable" ) 
Enable the dialog.

option
Signature: 
.dialog( "option" , optionName , [value] ) 
Get or set any dialog option. If no value is specified, will act as a getter.

option
Signature: 
.dialog( "option" , options ) 
Set multiple dialog options at once by providing an options object.

widget
Signature: 
.dialog( "widget" ) 
Returns the .ui-dialog element.

close
Signature: 
.dialog( "close" ) 
Close the dialog.

isOpen
Signature: 
.dialog( "isOpen" ) 
Returns true if the dialog is currently open.

moveTo‍Top
Signature: 
.dialog( "moveTo‍Top" ) 
Move the dialog to the top of the dialogs stack.

open
Signature: 
.dialog( "open" ) 
Open the dialog.


 */
  </script>
 </HEAD>

 <BODY style="font-size:70.5%;">
 <div id="dialog1" title="Dialog Title" style="border:1px solid">첫번째 다이얼로그 박스에용!!</div>
 <div id="dialog2" title="Dialog Title" style="border:1px solid">두번째 다이얼로그 박스에용!!</div>
 <div id="dialog3" title="세번째 다이얼로그" style="border:1px solid">세번째 다이얼로그 박스에용!!</div>
 <input type="button" id="btn_dialog1_open" value="첫번째 팝업 열기"/>
 <input type="button" id="btn_dialog2_open" value="두번째 팝업 열기"/>
 <input type="button" id="btn_dialog3_open" value=" 세번째 팝업 열기"/>
 </BODY>
</HTML>

Posted by 사라링

1. JSP 를 이용한 BLOB 저장

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

File            file       = (File) param.get("sajin"); // 등록할 File

Blob            emptyBlob  = null;            

OutputStream    outstream  = null;

FileInputStream finstream  = null;

ResultSet rs = null;

try{

    // EMPTY_BLOB() 처리

    sql = "update table set sajin=EMPTY_BLOB() where id=?";

    ps = con.prepareStatement(sql);

    ps.setString(1, (String)param.get("id"));

    if ( ps.executeUpdate() < 0 ) throw new Exception();


    // 저장할 sajin Column 가져온다.

    sql = "select sajin from table where id=?";

    ps = con.prepareStatement(sql);

    ps.setString(1, (String)param.get("id"));

    rs = ps.executeQuery();

    if ( rs.next() ) emptyBlob = rs.getBlob(1);

    // db blob output stream

    oracle.sql.BLOB bol = (oracle.sql.BLOB) emptyBlob;

    outstream = bol.getBinaryOutputStream();

    int size = bol.getBufferSize();

    // 파일 input stream

    finstream = new FileInputStream(file);

    

    // 파일 읽어서 db에 넣기

    byte[] buffer = new byte[size];

    int length = -1;

    while ((length = finstream.read(buffer)) != -1) {

        outstream.write(buffer, 0, length);

    }

} catch (Exception e){

    throw(e);

} finally {

    if( rs          != null ) rs.close();

    if( finstream   != null ) finstream.close();               

    if( outstream   != null ) outstream.close(); 

}

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

즉, 다른 타입처럼 update문이나 insert를 이용하지 않는다.

다시 한번 정리하면, insert할 column을 EMPTY_BLOB()로 초기화

초기화된 column을 select 하여 OutputStream을 통해 file을 DB에 저장한다.


2. JSP 를 이용한 BLOB 브라우저에서 보기

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

package showImage;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

public class ShowImageServlet extends HttpServlet

{

 public void doGet(HttpServletRequest request, HttpServletResponse response)

 throws ServletException, IOException

 {

  doPost(request, response);

 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)

 throws ServletException, IOException

 {

        Connection con       = null;

        ResultSet rs         = null;

        PreparedStatement ps = null;

        InputStream is       = null;

        // Image를 가져오기위한 키값들

        String key1 = request.getParameter("key1"); // Primary key 1

        String key2 = request.getParameter("key2"); // Primary key 2

        

        String file_type    = null; // Image 파일 타입

        String content_type = null; // Image 보여주기위한 Content_type

        // Image 가져올 SQL

        final String SQL =

                " SELECT image_type, image                       " +

                "   FROM cu_basic_t                              " +

                "  WHERE key1 = '"+key1+"' AND key2 = '"+key2+"' ";


        try {

            con = UtilDB.getConnection();     // DB 연결

            ps  = con.prepareStatement(SQL);

            rs  = ps.executeQuery();          // SQL 실행

            // Image 가져오는 부분(content type도 정해준다.)

      if (rs!=null && rs.next()){

       file_type = rs.getString("image_type");

    is = rs.getBinaryStream("image");

    if (file_type.toUpperCase().equals("JPG"))      file_type = "jpeg";

    else if (file_type.toUpperCase().equals("GIF")) file_type = "gif";

    content_type = "image/" + file_type;    // "image/jpeg"나 "image/gif"

    response.setContentType(content_type);  // Content Type Set

                // Image를 Stream을 통해 out

    ServletOutputStream os = response.getOutputStream();

    int binaryRead;

    while ((binaryRead = is.read()) != -1)

    {

     os.write(binaryRead);

    }

   } else {

       throw new Exception("사진이 없습니다.");

   }

  }

  catch(ServletException e) {

      e.printStackTrace();

      throw e;

  }catch(IOException e) {

      e.printStackTrace();

      throw e;

  }

  catch(Exception e) {

      System.out.println("An error occurs : " + e.toString());

      e.printStackTrace();

  }

  finally {

      UtilDB.closeConnection(con, ps, rs); // DB 닫아준다.

  }

 }

}

package showImage;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

public class ShowImageServlet extends HttpServlet

{

 public void doGet(HttpServletRequest request, HttpServletResponse response)

 throws ServletException, IOException

 {

  doPost(request, response);

 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)

 throws ServletException, IOException

 {

        Connection con       = null;

        ResultSet rs         = null;

        PreparedStatement ps = null;

        InputStream is       = null;

        // Image를 가져오기위한 키값들

        String key1 = request.getParameter("key1"); // Primary key 1

        String key2 = request.getParameter("key2"); // Primary key 2

        

        String file_type    = null; // Image 파일 타입

        String content_type = null; // Image 보여주기위한 Content_type

        // Image 가져올 SQL

        final String SQL =

                " SELECT image_type, image                       " +

                "   FROM cu_basic_t                              " +

                "  WHERE key1 = '"+key1+"' AND key2 = '"+key2+"' ";


        try {

            con = UtilDB.getConnection();     // DB 연결

            ps  = con.prepareStatement(SQL);

            rs  = ps.executeQuery();          // SQL 실행

            // Image 가져오는 부분(content type도 정해준다.)

      if (rs!=null && rs.next()){

       file_type = rs.getString("image_type");

    is = rs.getBinaryStream("image");

    if (file_type.toUpperCase().equals("JPG"))      file_type = "jpeg";

    else if (file_type.toUpperCase().equals("GIF")) file_type = "gif";

    content_type = "image/" + file_type;    // "image/jpeg"나 "image/gif"

    response.setContentType(content_type);  // Content Type Set

                // Image를 Stream을 통해 out

    ServletOutputStream os = response.getOutputStream();

    int binaryRead;

    while ((binaryRead = is.read()) != -1)

    {

     os.write(binaryRead);

    }

   } else {

       throw new Exception("사진이 없습니다.");

   }

  }

  catch(ServletException e) {

      e.printStackTrace();

      throw e;

  }catch(IOException e) {

      e.printStackTrace();

      throw e;

  }

  catch(Exception e) {

      System.out.println("An error occurs : " + e.toString());

      e.printStackTrace();

  }

  finally {

      UtilDB.closeConnection(con, ps, rs); // DB 닫아준다.

  }

 }

}

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

JSP 기준이다.

보여줄 JSP에 다음을 추가

<img src="/servlet/ShowImageServlet?key1=<%=key1%>&key2=<%=key12%>"

  width="100" height="100" />

SRC에 image를 보여주도록 만들어진 서블릿을 입력

참고 (서블릿 실행을 위해 WAS(Jeus) 설정법)

WEB-INF\web.xml 내에 서블릿 등록을 등록하고 서버 재 Start시킨다.


   <servlet>

      <servlet-name>ShowImageServlet</servlet-name>

      <servlet-class>showImage.ShowImageServlet</servlet-class>

   </servlet>

   <servlet-mapping>

      <servlet-name>ShowImageServlet</servlet-name>

      <url-pattern>/ShowImageServlet</url-pattern>

   </servlet-mapping>

Posted by 사라링

아이바티스 에서 xml 에 프로시져를 구현해보았다. 

DECLARE

V_CNT NUMBER;

V_KEY_SEQ NUMBER;

BEGIN

SELECT COUNT(*)

 INTO V_CNT

 FROM PUR_EPUR_KEY_MGT

WHERE KEY = #KEY#||TO_CHAR(SYSDATE,'YYYY');

IF V_CNT = 0 THEN

V_KEY_SEQ := 0;

ELSE

SELECT TO_NUMBER(MAX(KEY_SEQ)+1)

 INTO V_KEY_SEQ

 FROM PUR_EPUR_KEY_MGT

WHERE KEY = #KEY#||TO_CHAR(SYSDATE,'YYYY');

END IF;

INSERT INTO PUR_EPUR_KEY_MGT(

CONVERSATION_ID

,KEY

,KEY_SEQ

,INS_ID

,INS_DT

,UPT_ID

,UPT_DT

)VALUES(

#KEY#||TO_CHAR(SYSDATE,'YYYY')||LPAD(V_KEY_SEQ,8,'0')||'013'

,#KEY#||TO_CHAR(SYSDATE,'YYYY')

,V_KEY_SEQ

,#INS_ID# 

,SYSDATE

,#UPT_ID# 

,SYSDATE 

);

commit;

END;



로 구했는데 . 첫번째 프로세서 실행시 에는 문제가 없었으나 두번째에서 부터 문제가 발생 했다. 

확인해 보니 프로세서상 프로시져를 사용한후 오류가 생겨 트랜잭션이 롤백을 시도 햇는데 procedure 에서 실행한 쿼리 문이 제대로 롤백이 되지 않아

일어 나는 현상 이었다.


따라서 END; 위에 commit 를 추가 하여 문제를 해결했다.

프로세서 완료 후에는 commit 문장을 삭제함 .

 아이바티스및 프로세서의 트랜잭션을 전적으로 의지 하면 안된다는 교휵을 배웠다... 



Posted by 사라링

CLOB 읽기

2013. 2. 27. 10:01

SELECT NUM,SBJ,CONT,DBMS_LOB.substr( CONT, 255 )  FROM TMP_COM_BBS;


<resultMap id="borderResultMap" class="java.util.HashMap">
    <result property="seq" column="SEQ"/>
    <result property="cont" column="CONT" jdbcType="CLOB" javaType="java.lang.String"/>
</resultMap>

Posted by 사라링

JOIN!!

2013. 2. 6. 13:05

현재 오라클에서 사용하는 SQL은 T(Transaction)-SQL로 ANSI의 표준 SQL과는 
일부 차이가 있습니다. T-SQL이 편리한 점이 많지만 같은 내용의 SQL문이 벤더
 별로 차이가 남에 따라, ANSI SQL 3-1999에서는 모든 벤더가 표준 SQL문을 
지원하도록 하고 있으며, 오라클도 9i 버젼부터 사용이 가능합니다. 
 
대표적인 특징으로는 조인의 형태가 FROM 절에서 명시적으로 지정되며, 조인 
조건이 WHERE 절의 검색 조건과 구별되어 ON 절이나 USING 절에 표시됩니다. 
OUTER 조인의 경우 (+) 표시가 아닌 LEFT / RIGHT / FULL OUTER JOIN 문법
을 사용할 수 있습니다.


1) CROSS JOIN


예문)

SELECT ENAME, DNAME
FROM EMP CROSS JOIN DEPT;

크로스 조인은 두 개의 테이블에 대한 Cartesian Product와 같은 결과입니다.
의도적으로 데이터를 복제하기 위해 카테시안 프로덕트를 사용한 것이 아니라면, 
크로스 조인은 사용하지 않는 것이 바람직합니다.


2) NATURAL JOIN


예문)

SELECT *
FROM EMP NATURAL JOIN DEPT;

내츄럴 조인은 모든 동일한 이름을 갖는 칼럼들에 대해 조인을 합니다. 
즉, NATURAL 조인은 자동적으로 두 테이블에서 같은 이름을 가진 모든 칼럼에 
Equi Join을 수행합니다.

이때, 조인 칼럼들은 같은 데이터 유형이어야 하며, Alias나 테이블 명과 같은 
접두사를 붙일 수 없습니다. 만일 같은 이름을 가지는 칼럼들이 서로 다른 데이터 
형을 가질 때에는 오류가 반환됩니다.

그리고, SELECT * 문법을 사용한다면, 공통 칼럼들은 결과 집합에서 한 개만 표현
됩니다.


3) USING JOIN


예문)

SELECT E.EMPNO, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
USING (DEPTNO);

내츄럴 조인에서는 자동적으로 이름이 일치되는 모든 칼럼들에 대해 조인이 이루어지
지만, USING 절을 이용하면 원하는 칼럼에 대해서만 선택적으로 Equi Join을 할 수
가 있습니다.

만일 여러 개의 칼럼이 이름은 같지만 데이터 형이 모두 일치하지 않거나, 몇 개의 
칼럼만 선택적으로 조인 조건에 사용하고자 할 때는 Using 절을 이용하여 Equi Join
에 사용될 칼럼들을 지정할 수 있습니다.
USING 절을 이용한 Equi Join에서도 내츄럴 조인과 마찬가지로, 조인 칼럼에 대해서는
 Alias나 테이블 명과 같은 접두사를 붙일 수 없으며, Natural과 Using의 두 키워드는 
상호 배타적으로 사용됩니다.


4) ON JOIN


예문)

SELECT E.ENAME, E.DEPTNO, D.DNAME 
FROM EMP E JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO)
WHERE E.SAL > 1000;

조인 서술부(ON 절)와 비조인 서술부(WHERE 절)를 분리하여 이해가 쉽습니다.
ON 절을 이용하면 JOIN 이후에 논리 연산과 서브쿼리와 같은 추가 서술을 할 수 있습
니다.

Natural 조인과 달리 ON 조인은, 임의의 조인 조건을 지정하거나, 이름이 다른 칼럼
끼리 조인 조건으로 사용하거나, 조인할 칼럼을 명시하기 위해서 사용합니다.

● 여러 테이블의 조인

SELECT E.EMPNO, D.DNAME , B.SAL
FROM EMP E JOIN DEPT D  
ON ( E.DEPTNO = D.DEPTNO )
  JOIN BONUS B
ON ( E.ENAME = B.ENAME );

● WHERE 절과의 혼용

SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME 
FROM EMP E JOIN DEPT D
ON  ( E.DEPTNO = D.DEPTNO )
WHERE E.EMPNO >= 7000;

● ON 절의 조건 추가

SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D 
ON ( E.DEPTNO = D.DEPTNO  AND  E.MGR = 7698 );

● EXIST 절 사용

SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, B.BONUS
FROM EMP E JOIN DEPT D 
ON ( E.DEPTNO = D.DEPTNO 
     AND NOT EXISTS (SELECT 1 
                         FROM BONUS B 
                        WHERE E.ENAME = B.ENAME) );


5) OUTER JOIN


지금까지 오라클에서 제공하였던 Outer Join 표기는 (+)를 사용했지만, 이해가 
어렵고 실수를 유발하기 쉽다는 단점이 있습니다.

ANSI SQL-3의 기준을 오라클 9i에서 수용하면서 LEFT / RIGHT OUTER 조인뿐
만 아니라, 그 동안 UNION이나 UNION ALL을 이용해서 처리하던 양쪽 아우터 
조인도 FULL OUTER JOIN 문법으로 새로 추가 되었습니다.

● LEFT OUTER JOIN

Table A와 B가 있을 때 왼쪽에 있는 Table A가 기준이 됩니다. A와 B를 비교해서
 같은 것이 있을 때 그 해당 Data를 가져오고, B가 없는 경우에도 가져오는데 B에서 
가져오는 칼럼은 NULL 값으로 표시됩니다.

SELECT E.ENAME, E.DEPTNO, D.DNAME 
FROM EMP LEFT OUTER JOIN DEPT 
ON (EMP.DEPTNO = DEPT.DEPTNO);

● RIGHT OUTER JOIN

Table A와 B가 있을 때 오른쪽에 있는 Table B가 기준이 됩니다. A와 B를 비교해서
같은 것이 있을 때 그 해당 Data를 가져오고, A가 없는 경우에도 가져오는데 A에서 
가져오는 칼럼은 NULL 값으로 표시됩니다.

SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP RIGHT OUTER JOIN DEPT 
ON (EMP.DEPTNO = DEPT.DEPTNO);

● FULL OUTER JOIN

Table A와 B가 있을 때 (Table A, B 모두 기준), Left Outer Join과 Right Outer Join의 
결과를 UNION으로 합친 것과 같습니다.

SELECT E.ENAME, E.DEPTNO, D.DNAME
FROM EMP FULL OUTER JOIN DEPT 
ON (EMP.DEPTNO = DEPT.DEPTNO);  
이것만은 기억하자!

[출처] http://blog.naver.com/chanseog?Redirect=Log&logNo=20000703888

Posted by 사라링

경고! 


쿼리 실행시 기존에 사용한 쿼리문을 모두(또는 일부) 돌린후 쿼리 끼리 검증 함으로 반드시 일반 사용자가 사용하지 않은 시간에 돌려야 합니다. 


SELECT *
  FROM (SELECT                                 /*+ LEADING(u) USE_HASH(u s) */
              S.SQL_ID
              ,S.MODULE
              ,RANK () OVER (ORDER BY CPU_TIME DESC) CPU_USAGE_RANK
              ,NVL (RATIO_TO_REPORT (CPU_TIME) OVER (), 0) CPU_USAGE_RATIO
              ,SQL_FULLTEXT
              ,EXECUTIONS
              ,ROWS_PROCESSED
              ,ROUND (
                  DECODE (EXECUTIONS
                         ,NULL, 0
                         ,0, 0
                         , (NVL (ELAPSED_TIME, 0) / EXECUTIONS) / 1000000)
                 ,5)
                  ELAPSED_PER_EXEC
              ,ROUND (
                  DECODE (
                     EXECUTIONS
                    ,NULL, 0
                    ,0, 0
                    , (NVL (
                            CLUSTER_WAIT_TIME
                          + USER_IO_WAIT_TIME
                          + CONCURRENCY_WAIT_TIME
                          + APPLICATION_WAIT_TIME
                         ,0)
                       / EXECUTIONS)
                     / 1000000)
                 ,5)
                  WATI_TIME_PER_EXEC
              ,ROUND (
                  DECODE (EXECUTIONS
                         ,NULL, 0
                         ,0, 0
                         , (NVL (CPU_TIME, 0) / EXECUTIONS) / 1000000)
                 ,5)
                  CPU_TIME_PER_EXEC
              ,ROUND (
                  DECODE (
                     EXECUTIONS
                    ,NULL, 0
                    ,0, 0
                    , (NVL (CLUSTER_WAIT_TIME, 0) / EXECUTIONS) / 1000000)
                 ,5)
                  CLUSTER_WAIT_PER_EXEC
              ,ROUND (
                  DECODE (
                     EXECUTIONS
                    ,NULL, 0
                    ,0, 0
                    , (NVL (USER_IO_WAIT_TIME, 0) / EXECUTIONS) / 1000000)
                 ,5)
                  USER_IO_WAIT_PER_EXEC
              ,ROUND (
                  DECODE (
                     EXECUTIONS
                    ,NULL, 0
                    ,0, 0
                    , (NVL (CONCURRENCY_WAIT_TIME, 0) / EXECUTIONS) / 1000000)
                 ,5)
                  CONCURRENCY_WAIT_PER_EXEC
              ,ROUND (
                  DECODE (
                     EXECUTIONS
                    ,NULL, 0
                    ,0, 0
                    , (NVL (APPLICATION_WAIT_TIME, 0) / EXECUTIONS) / 1000000)
                 ,5)
                  APPLICATION_WAIT_PER_EXEC
              ,ROUND (
                  DECODE (EXECUTIONS
                         ,NULL, 0
                         ,0, 0
                         , (NVL (BUFFER_GETS, 0) / EXECUTIONS))
                 ,0)
                  BUFGETS_PER_EXEC
              ,ROUND (
                  DECODE (BUFFER_GETS
                         ,0, 1
                         , (BUFFER_GETS - DISK_READS) / BUFFER_GETS)
                 ,1)
                  BUF_HIT_RATIO
              ,CPU_TIME
              ,ELAPSED_TIME
              ,CLUSTER_WAIT_TIME
              ,USER_IO_WAIT_TIME
              ,CONCURRENCY_WAIT_TIME
              ,APPLICATION_WAIT_TIME
              ,PARSE_CALLS
              ,DISK_READS
              ,BUFFER_GETS
              ,FETCHES
              ,PLSQL_EXEC_TIME
              ,JAVA_EXEC_TIME
          FROM DBA_USERS U, GV$SQL S
         WHERE S.PARSING_USER_ID > 5 AND S.PARSING_USER_ID = U.USER_ID)
 WHERE CPU_USAGE_RANK <= 100;

'오라클' 카테고리의 다른 글

jsp BLOb 타입 다운로드  (0) 2013.03.13
JOIN!!  (0) 2013.02.06
TABLE DROP 복구 하기. PURGE 를 사용한 경우 복구 X  (0) 2013.01.14
컬럼명으로 특정 테이블을 찾는 쿼리  (0) 2012.12.20
connect by  (0) 2012.12.17
Posted by 사라링

where 절에 in 으로 1개 또는 여러개의 값을 집어 넣어 검색 하는 방법이 있다. 


1. 

   SELECT * FROM ACT_RESL_MST WHERE ACCT_CD IN (SELECT ACCT_CD FROM ACT_ACCT_CD)


   이런 방식이다 하나의 컬럼을 출력 하는 쿼리 문을 IN 절에 집어 넣어 구현 하며 제일 구현 하기 쉬우며 풀스캔으로 메모리를 많이 먹는다 


2. 

    SELECT * FROM ACT_RESL_MST WHERE ACCT_CD IN ($SUPER_ACCT_CD$)

     

    로 파라미터를 넘기는 방법인데 기존의 ## 으로 묶어서 보내는 것이 아닌 $$ 으로 보내는 것이다 이것은 STATEMENT 와 PREPARESTATEMENT 의 차이로 알면 쉽다

      SUPER_ACCT_CD  파라미터의 값은 스트링 값은 반드시 ArrayList  또는 iterator 형식으로 넣어야 한다. 

  [

Map map = getLoginMap(request);

String temp_Incm_Cls = ((String)map.get("INCM_CD_CLS")).trim();

String[] rscherNo = temp_Incm_Cls.split(",");

List<String> rscherNo_List =Arrays.asList(rscherNo);

map.put("INCM_CD_CLS", rscherNo_List);


 ]



3. 

  SELECT * FROM ACT_RESL_MST 

 <dynamic prepend="WHERE">

         <isNotEmpty property= userNameList>

USERNAME IN 

      <iterate  property="userNameList" open="(" close=")" conjunction=",">

 #userNameList[]#

</iterate>

</isNotEmpty >

 </dynamic >


     이런식으로 직접적으로 LIST 형식 String 값을 map 에 담아 쿼리문에서 생성 하여 구현 한다 속도 측면에서는 가장 높으며 JAVA 단에서 LIST 형식으로 만드는

 작업을 해야 한다. 

설명 하자면 userNameList 라는 리스트에 1개 또는 그 이상 있을때 실행 되며 userNameList 안에는 그 수의 String 타입의 in 조건들이 있다 먼저 username 이 비어 있는지 확인 한후 값이 있다면 username IN 을 생성 한후 다음에 ( 값을 넣고 다음 값이 있는 경우 ',' 넣고 다 끈난 경우 ) 로 닫고 끈낸다. 


Posted by 사라링


휴지통에 있는것을 복구 하며. 

show recyclebin ; 로는 검색이 안되었다. 이유는 잘 모르겠다...아무래도 DBA 권한 때문인듯도 하고.. 확인은 못함 


/


SELECT * FROM DBA_RECYCLEBIN ORDER BY 1


위 커리로 확인 하자 반드시 OWNER (사용자) 와 드랍일자 데이터 량 등을 확인 하자 

그후 플래쉬백을 사용 해야 하며 TABLE NAME 은 본래 이름이 아닌  두번째 컬럼임 오리지널 네임을 사용 해야 한다. 또한.

본래 테이블 이름의 테이블이 있다면 복구가 안됨으로 DROP CREATE  한경우에 데이터가 없는 테이블을 삭제 해야 한다. 


 flashback table "BIN$VPaE9OG4Qwa+KC0MesYKqw==$0" to before drop;


하면 테이블이 데이터 보존 상태로 그대로 복구 한다. 

'오라클' 카테고리의 다른 글

JOIN!!  (0) 2013.02.06
DB 부하율 검색 쿼리 (1등하면 안좋은것..)  (0) 2013.01.29
컬럼명으로 특정 테이블을 찾는 쿼리  (0) 2012.12.20
connect by  (0) 2012.12.17
패스워드 암호화 .  (0) 2012.12.07
Posted by 사라링

select *

   from all_tab_columns

where owner = 'IBS'

   and column_name = 'RES_NO'

 

 

select *
   from all_tab_columns
where owner = 
'계정명(사용자)'

   and column_name = '컬럼명'

'오라클' 카테고리의 다른 글

DB 부하율 검색 쿼리 (1등하면 안좋은것..)  (0) 2013.01.29
TABLE DROP 복구 하기. PURGE 를 사용한 경우 복구 X  (0) 2013.01.14
connect by  (0) 2012.12.17
패스워드 암호화 .  (0) 2012.12.07
숫자 함수.  (0) 2012.11.15
Posted by 사라링

connect by

2012. 12. 17. 11:17

START WITH ... CONNECT BY 절

설명

계층적 질의란 테이블에 포함된 행(row)간에 수직적 계층 관계가 성립되는 데이터에 대하여 계층 관계에 따라 각 행을 출력하는 질의이다. START WITH ... CONNECT BY 절은 SELECT 구문과 결합하여 사용된다.

구문

SELECT column_list

    FROM table_joins | tables

    [WHERE join_conditions and/or filtering_conditions]

    [START WITH condition]

    CONNECT BY [NOCYCLE] condition

START WITH 절

START WITH 절은 계층 관계가 시작되는 루트 행(root row)을 지정하기 위한 것으로, START WITH 절 다음에 계층 관계를 검색하기 위한 조건식을 포함한다. 만약, START WITH 절에 다음에 위치하는 조건식이 생략되면 대상 테이블 내에 존재하는 모든 행을 루트 행으로 간주하여 계층 관계를 검색할 것이다.

참고 START WITH 절이 생략되거나, START WITH 조건식을 만족하는 결과 행이 존재하지 않는 경우, 테이블 내의 모든 행을 루트 행으로 간주하여 각 루트 행에 속하는 하위 자식 행들 간 계층 관계를 검색하므로 결과 행들 중 일부는 중복되어 출력될 수 있다.

CONNECT BY [NOCYCLE] PRIOR 절
  • PRIOR : CONNECT BY 조건식은 한 쌍의 행에 대한 상-하 계층 관계(부모-자식 관계)를 정의하기 위한 것으로, 조건식 내에서 하나는 부모(parent)로 지정되고, 다른 하나는 자식(child)으로 지정된다. 이처럼 행 간의 부모-자식 간 계층 관계를 정의하기 위하여 CONNECT BY 조건식 내에PRIOR 연산자를 이용하여 부모 행의 컬럼 값을 지정한다. 즉, 부모 행의 컬럼 값과 같은 컬럼 값을 가지는 모든 행은 자식 행이 된다.
  • NOCYCLE : CONNECT BY 절의 조건식에 따른 계층 질의 결과는 루프를 포함할 수 있으며, 이것은 계층 트리를 생성할 때 무한 루프를 발생시키는 원인이 될 수 있다. 따라서, CUBRID는 루프를 발견하면 기본적으로 오류를 반환하고, 특수 연산자인 NOCYCLE CONNECT BY 절에 명시된 경우에는 오류를 발생시키지 않고 해당 루프에 의해 검색된 결과를 출력한다.
    만약, CONNECT BY 절에서 NOCYCLE이 명시되지 않은 계층 질의문을 수행 중에 루프가 감지되는 경우, CUBRID는 오류를 반환하고 해당 질의문을 취소한다. 반면, NOCYCLE이 명시된 계층 질의문에서 루프가 감지되는 경우, CUBRID는 오류를 반환하지는 않지만 루프가 감지된 행에 대해CONNECT_BY_ISCYCLE 값을 1로 설정하고, 더 이상 계층 트리의 검색을 확장하지 않을 것이다.
예제

아래 예제를 참조하여 계층 질의문을 작성할 수 있다. 예제를 실습하기 위해 필요한 데이터베이스 스키마는 다음과 같다.

tree 테이블

ID

MgrID

Name

BirthYear

1

NULL

Kim

1963

2

NULL

Moy

1958

3

1

Jonas

1976

4

1

Smith

1974

5

2

Verma

1973

6

2

Foster

1972

7

6

Brown

1981

tree_cycle 테이블

ID

MgrID

Name

1

NULL

Kim

2

11

Moy

3

1

Jonas

4

1

Smith

5

3

Verma

6

3

Foster

7

4

Brown

8

4

Lin

9

2

Edwin

10

9

Audrey

11

10

Stone

-- tree 테이블을 만들고 데이터를 삽입하기

CREATE TABLE tree(ID INT, MgrID INT, Name VARCHAR(32), BirthYear INT);

 

INSERT INTO tree VALUES (1,NULL,'Kim', 1963);

INSERT INTO tree VALUES (2,NULL,'Moy', 1958);

INSERT INTO tree VALUES (3,1,'Jonas', 1976);

INSERT INTO tree VALUES (4,1,'Smith', 1974);

INSERT INTO tree VALUES (5,2,'Verma', 1973);

INSERT INTO tree VALUES (6,2,'Foster', 1972);

INSERT INTO tree VALUES (7,6,'Brown', 1981);

 

-- tree_cycle 테이블을 만들고 데이터를 삽입하기

CREATE TABLE tree_cycle(ID INT, MgrID INT, Name VARCHAR(32));

 

INSERT INTO tree_cycle VALUES (1,NULL,'Kim');

INSERT INTO tree_cycle VALUES (2,11,'Moy');

INSERT INTO tree_cycle VALUES (3,1,'Jonas');

INSERT INTO tree_cycle VALUES (4,1,'Smith');

INSERT INTO tree_cycle VALUES (5,3,'Verma');

INSERT INTO tree_cycle VALUES (6,3,'Foster');

INSERT INTO tree_cycle VALUES (7,4,'Brown');

INSERT INTO tree_cycle VALUES (8,4,'Lin');

INSERT INTO tree_cycle VALUES (9,2,'Edwin');

INSERT INTO tree_cycle VALUES (10,9,'Audrey');

INSERT INTO tree_cycle VALUES (11,10,'Stone');

 

-- CONNECT BY 절을 이용하여 계층 질의문 수행하기

SELECT id, mgrid, name

    FROM tree

    CONNECT BY PRIOR id=mgrid

    ORDER BY id;

 

id  mgrid       name

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

1   null        Kim

2   null        Moy

3   1       Jonas

3   1       Jonas

4   1       Smith

4   1       Smith

5   2       Verma

5   2       Verma

6   2       Foster

6   2       Foster

7   6       Brown

7   6       Brown

7   6       Brown

 

-- START WITH 절을 이용하여 계층 질의문 수행하기

SELECT id, mgrid, name

    FROM tree

    START WITH mgrid IS NULL

    CONNECT BY prior id=mgrid

    ORDER BY id;

 

id  mgrid       name

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

1   null        Kim

2   null        Moy

3   1       Jonas

4   1       Smith

5   2       Verma

6   2       Foster

7   6       Brown

'오라클' 카테고리의 다른 글

TABLE DROP 복구 하기. PURGE 를 사용한 경우 복구 X  (0) 2013.01.14
컬럼명으로 특정 테이블을 찾는 쿼리  (0) 2012.12.20
패스워드 암호화 .  (0) 2012.12.07
숫자 함수.  (0) 2012.11.15
계층형구조 (CONNECT BY)  (0) 2012.11.05
Posted by 사라링

이클립스를 이용해 자바를 작성하다 보면 불필요하게 import된 구문을 정리해야 할때가 있다.

이때 대부분의 개발자들은 자바파일 하나씩 오픈해서 Ctrl - Shift - O 단축키로 정리하고 저장하고 하는 과정을 반복할것으로 본다.

그러나 잘찾아 보면 이클립스에서 한방에 여러 파일에 걸쳐있는 import문을 정리하는 방법이 있다.


위에서 보듯이 여러파일에 걸쳐져 있는 impor java.util.Map 문을 정리해야 하는데 아래 Problem View 에 보면 다른 사소한 Warning 때문에(100개정도만 보임) import 문 정리해야한다는 Warning 이 잘 보이지 않는다.

이때는 뷰오른쪽 상단의 역삼각형을 눌러보면 


위와 같이 그룹핑을 다시 하여볼수 있는 메뉴가 나타난다. Java Problem Type 으로 그룹핑하여 보면

Unnecessary Code란 카테고리 안에 The import..... is never used 라는 Warning 이 가득 보인다.

이때 해당 경고 위에서 마우스 오른쪽 클릭해보면 Quick Fix란 메뉴가 있는데 이를 눌러보면


Select a Fix 를 Remove unused import 에 두고 Select All 하여 전체파일을 선택한후 Finish를 누르면 프로젝트 전체에 걸쳐 필요없는 import문을 한방에 정리하게 된다.

Posted by 사라링

패스워드 암호화 .

2012. 12. 7. 14:01

No. 12036

 

데이터 암호화 기능 소개(8.1.6 new feature)

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

 

개    요

=========

Oracle 8i Release2(8.1.6)에서는 데이터를 암호화하여 저장할 수 있는 향상된

기능(DES Encryption)을 제공한다

(Oracle 8i Release3(8.1.7)에서는 Triple DES Encryption)

 

즉 신용카드번호, 패스워드 등 보안이 필요한 데이터를 암호화된 형태로 저장하여

기존의 3rd Party Tool이나, Application Logic으로 구현하던 암호화 정책을

데이터베이스 차원에서 구현할 수 있도록 해준다.

 

DBMS_OBFUSCATION_TOOLKIT

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

암호화 기능을 이용하려면 DBMS_OBFUSCATION_TOOLKIT을 이용해야 한다.

 

이 패키지는 4개의 프로시져로 이루어져 있다.

- VARCHAR2 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져

- RAW 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져

(다른 타입은 지원하지 않으므로 number인 경우는 to_char 이용)

 

DBMS_OBFUSCATION_TOOLKIT을 이용하기 위해서는 :

1) SYS 유저로

   @$ORACLE_HOME/rdbms/admin/dbmsobtk.sql

   @$ORACLE_HOME/rdbms/admin/prvtobtk.plb

   

 

2) grant execute on dbms_obfuscation_toolkit to public;

 

 

제 한 사 항

===========

1) DES(Data Encryption Standard) symmetric key algorithm 방식을 이용.

   즉 암호화할 때 이용한 key를 분실했을 경우 데이터를 해독할 방법이 없다.

 

2) Encrypt하려는 data가 8 bytes 배수(8,16,... bytes)이어야 한다.

 

3) 미국무부의 암호화기술 수출제한조치에 의해 56-bit key를 사용.

 

4) 미국무부의 암호화기술 수출제한조치에 의해 한번 암호화된 데이터를

   또다시 암호화할 수 없다.

 

*) 많은 테이블을 Encrypt/decrypt할 경우 CPU 사용량을 증가시킬 수 있다.

*) 아래의 예제는 UTF8을 사용할 경우 한글 데이터를 암호화할 수 없다.

   (RPAD의 제약으로)

 

사 용 예

========

1) encrypt/decrypt에 이용할 FUNCTION을 만든다.

   (만약 input string이 8 byte 배수가 아니면 패딩을 한다)

*) 8.1.6에서는 key값이 8 byte 이상이어야 함(8.1.7 이후에는 제한없음)

 

 

- - - - - - - - - - - - - - - Code begins here - - - - - - - - - - - - - - -

REM ------------------------------------------------------------------------

REM DISCLAIMER:

REM    This script is provided for educational purposes only. It is NOT  

REM    supported by Oracle World Wide Technical Support.

REM    The script has been tested and appears to work as intended.

REM    You should always run new scripts on a test instance initially.

REM ------------------------------------------------------------------------

 

CREATE OR REPLACE PACKAGE CryptIT AS

   FUNCTION encrypt( Str VARCHAR2,  

                     hash VARCHAR2 ) RETURN VARCHAR2;

   FUNCTION decrypt( xCrypt VARCHAR2,

                     hash VARCHAR2 ) RETURN VARCHAR2;

END CryptIT;

/

 

CREATE OR REPLACE PACKAGE BODY CryptIT AS

   crypted_string VARCHAR2(2000);

 

   FUNCTION encrypt( Str VARCHAR2,  

                     hash VARCHAR2 ) RETURN VARCHAR2 AS

   pieces_of_eight INTEGER := ((FLOOR(LENGTH(Str)/8 + .9)) * 8);

 

   BEGIN

 

      dbms_obfuscation_toolkit.DESEncrypt(

               input_string     => RPAD( Str, pieces_of_eight ),

               key_string       => RPAD(hash,8,'#'),

               encrypted_string => crypted_string );

      RETURN crypted_string;

   END;

 

   FUNCTION decrypt( xCrypt VARCHAR2,

                     hash VARCHAR2 ) RETURN VARCHAR2 AS

   BEGIN

      dbms_obfuscation_toolkit.DESDecrypt(

               input_string     => xCrypt,

               key_string       => RPAD(hash,8,'#'),

               decrypted_string => crypted_string );

      RETURN trim(crypted_string);

   END;

END CryptIT;

/

 

- - - - - - - - - - - - - - -  Code ends here  - - - - - - - - - - - - - - -

 

 

2) Encrypt하여 데이터 입력

 

drop table encrypt_table;

create table encrypt_table( id number, passwd varchar(10) );

 

insert into encrypt_table values( 1, CryptIT.encrypt('tiger', 'key_a'));

insert into encrypt_table values( 2, CryptIT.encrypt('tiger', 'key_b'));

 

3) Decrypt하여 데이터 조회

 

SQL> select id, passwd from encrypt_table where passwd = 'tiger';

 

no rows selected

 

-> 물론 Decrypt하지 않으면 암호화된 데이터와 비교된다.

 

주의) encrypt된 데이터를 화면에 출력하면, terminal emulator가 오작동할 수 있다.

      그럴 경우, terminal emulator 프로그램 종료 후 다시 시작.

 

SQL> col passwd format a60

SQL> select id, dump(passwd) passwd from encrypt_table;

 

        ID PASSWD

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

         1 Typ=1 Len=8: 246,27,80,184,227,225,245,31

         2 Typ=1 Len=8: 175,231,213,125,85,223,46,133

 

 

-> 저장장치에 Encrypt된 값으로 저장된다.

 

select id, CryptIT.decrypt(passwd,'key_a') passwd

from encrypt_table

where CryptIT.decrypt(passwd,'key_a') = 'tiger';

 

        ID PASSWD

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

         1 tiger

 

select id, CryptIT.decrypt(passwd,'key_b') passwd

from encrypt_table

where CryptIT.decrypt(passwd,'key_b') = 'tiger';

 

        ID PASSWD

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

         2 tiger

 

-> Encrypt할 때 사용한 Key로만 Decrypt할 수 있다.

 

주의) Table에 접근 권한이 있는 다른 유저도 Key값을 알면 Decrypt할 수 있다.

 

4) 관련 ORA number

ORA error 28231 "Invalid input to Obfuscation toolkit"

- input data, key값이 NULL일 경우 발생

 

ORA error 28232 "Invalid input size for Obfuscation toolkit"

- input data가 8 bytes 배수가 아닐 경우 발생

 

ORA error 28233 "Double encryption not supported by DESEncrypt in Obfuscation toolkit"

- encrypt data를 다시 encrypt경우 발생

 

 

관 련 자 료

===========

Oracle8i Supplied PL/SQL Packages Reference Release 2 (8.1.6)

'오라클' 카테고리의 다른 글

컬럼명으로 특정 테이블을 찾는 쿼리  (0) 2012.12.20
connect by  (0) 2012.12.17
숫자 함수.  (0) 2012.11.15
계층형구조 (CONNECT BY)  (0) 2012.11.05
토드 에서 벌레의 의미..;  (0) 2012.11.02
Posted by 사라링

  

정재석(Buzzer Beat) 님의 말 :

function doPrint(flag){

     

     if(datagrid1.rows == datagrid1.fixedRows){

      jsAlert("조회된 데이터가 없습니다.");

      return;

     }

        

     /*  2011-12-02 수정 */

//     var aiRqstNo = doScreenListPrint("datagrid2");

     var aiRqstNo1 = doScreenListPrint("datagrid1");

     var aiRqstNo2 = doScreenListPrint("datagrid2");

     

//     var param = "AI_RQST_NO="+aiRqstNo+"&AI_RQST_NO1="+aiRqstNo1+"&AI_RQST_NO2="+aiRqstNo2;

     var param = "AI_RQST_NO1="+aiRqstNo1+"&AI_RQST_NO2="+aiRqstNo2;

     param += "&TITLE1=" + model.getValue("/root/temp/title1");

     param += "&TITLE2=" + model.getValue("/root/temp/title2");

     if(flag == "view"){

      htmlwindow.aiReport("pms/common/popup/popDeptEmpRateList.jsp",param,"","");

     }else if(flag == "print"){

      htmlwindow.aiReport("pms/common/popup/popDeptEmpRateList.jsp", param, "pop", "print");

     }

    }

이게 xrw

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

SELECT AI_DATA_001

      ,AI_DATA_002

      ,AI_DATA_003

      ,AI_DATA_004

      ,AI_DATA_005

      ,AI_DATA_006

      ,AI_DATA_007

      ,AI_DATA_008

      ,AI_DATA_009

      ,AI_DATA_010

      ,AI_DATA_011

      ,AI_DATA_012

      ,AI_DATA_013

      ,AI_DATA_014

      ,AI_DATA_015

      ,AI_DATA_016

      ,AI_DATA_017

      ,AI_DATA_018

      ,AI_DATA_019

      ,AI_DATA_020

      ,AI_DATA_021

      ,AI_DATA_022

      ,AI_DATA_023

      ,AI_DATA_024

      ,AI_DATA_025

      ,AI_DATA_026

      ,AI_DATA_027

      ,AI_DATA_028

      ,AI_DATA_029

      ,AI_DATA_030

  FROM COM_AI_DATA_DTL

 WHERE AI_RQST_NO = '^AI_RQST_NO1^'

이게 ai쿼리

Posted by 사라링

안녕하세요.

 | 취미
2012. 11. 28. 14:56
현재 입니다
암호를 입력해주세요.

비밀글

스크립트 테스트 중입니다.;

'취미' 카테고리의 다른 글

자료 구조 - 팩토리얼  (0) 2015.03.10
Posted by 사라링

JQUERY!! 사이트

2012. 11. 26. 10:58

AJAX 가 웹 기술의 대세로 떠오르면서, Javascript 언어에 대해 새로운 접근들이 시도되고
다양한 AJAX 및 자바스크립트 라이브러리들이 출시되었습니다. 
많이 쓰이니까 쉽게 쓸 수 있도록 하는 방법들이 나오는 건 당연하겠죠.

Script.aculo.us, Prototype.js , MooTools , jQuery, YUI ( Yahoo UI Library ) 등등.. 

수 많은 Javascript 라이브러리중 최근의 대세 jQuery  http://jquery.com/ 입니다.

Google Trends를 통해서 위의 Script 라이브러리들을 비교해보면 이렇습니다.

http://google.com/trends?q=jquery+%2C+script.aculo.us+%2C+prototype.js+%2C+yui+%2C+mootools&ctab=0&geo=all&date=all&sort=0 

자바스크립트 비교
그래프만 봐도 딱 보이시죠. 이렇게 jQuery 가 인기를 끌어가는데.. Microsoft 가 강펀치를 하나 날려줍니다.
위에 E 부분에 보면.. Microsoft 가 jQuery 를 Visual Studio 에 내장하겠다고 발표한게 보이실겁니다.
이제 ASP.NET 의 AJAX 프레임워크에서 jQuery 를 기본으로 내장하고 활용하게 되었습니다. – Microsoft to ship jQuery with Visual Studio 

또한 Nokia 역시, 그들이 만들고 있는 Web Kit 기반의 Web-Runtime에서 jQuery를 사용할 것이라고 발표하였습니다.
http://jquery.com/blog/2008/09/28/jquery-microsoft-nokia/

Javascript 와 jQuery 공부하기


이제 Javascript 를 이용한 AJAX개발은 모든 웹 기반 개발의 기본기술이 되었습니다. 모바일 환경에서도 사용되는건 물론이구요.
한번 Javascript, AJAX와 jQuery 를 익혀보지 않으시겠습니까 ? 
공부하시는데 도움이 될만한 강의 문서들을 링크해 드립니다.

다소 좀 때늦은 포스팅이긴 하지만, 사내 메일링리스트에 보내느라 정리해둔게 있어서 늦게나마 기록차원에서 올려둡니다.

'J-Query' 카테고리의 다른 글

jquery 를 이용한 마우스를 올릴시에 백그라운드를 변경  (0) 2013.05.10
dialog 예제  (0) 2013.03.12
extjs 공부해 보자.  (0) 2012.11.22
jquey ready? $(function(){});?  (0) 2012.11.22
jquery 움직이는 스크롤 사이드바  (0) 2012.11.15
Posted by 사라링

많은 면접을 토대로 작성된 글이니 그냥 유념할 사항정도로만 생각하시면 되요.


- 우린 계약직으로 시작해서 정직을 내다보고 일을 시킨다.


   이게 가장 악질 적이고 인간 덜 되 쳐먹은것들이 하는 말입니다. 


   참고로 계약직이 1년 미만 계약이면 퇴직금이 발생이 되지 않습니다. 법적으로 지불 해달라고 요청도 못하죠. 

   아마  계약직으로 부려 먹는다는건 1년 미만이며 퇴직금도 발생이 되지 않으며, 

   계약직 후 평가에서 떨어졌으므로 정직이 되긴 힘들꺼 같다.

   란 상황이 발생 가능한 말입니다.


   또 계약직은 4대 보험 지원해준다는 미명으로 프리랜서 단가보다 수십만원 더 낮게 책정 됩니다.  

   

   이건 협상의 잔 기술중 하나 인데요. 그냥 헛소리려니 하세요. 보통 저렇게 해서 정직 되는것보다.

  괜찮은 회사 찾아서 정직으로 들어가는게 훨씬 기회가 많습니다. 

  

  참고로 과장 짬밥되는 경력일 경우 저런식으로 떡밥도 못 던집니다. 이유가 연봉이 높기 떄문이예요. 

  대략 이런식으로 입질이 왔다 하면, 일 빡쉐게 돌려 먹을 대리 or 초짜 과장을 싸게 부려먹고 달면 삼키고 쓰면 뱉겠다는 심산입니다.



- 인력을 유동적으로 배치 해서 해야 되는 상황이다. 

   

   유동 적이다란 말이, 필요한 인력이 5명인데 4명 or 3명 으로 처리해야될 상황에 써먹는 말 입니다. 

   즉 , 이곳저곳에서 빡쉐게 일이 발생하면 한곳 처리하고 다른곳도 니가 투입되서 처리 해야 한다. 의 다른 이야기 입니다. 



- 복지 혜택은 입사 후 1년 뒤부터...

   

   대략 돈 갖고 장난 치는 회사에서 이짓 많이 하는데요. 1년 동안 사업을 확장 할려고 하는데 돈이 좀 많이 들어갑니다. 

  일반적으로 사업을 신규 확장할 경우 새로운 사람을 뽑아야 하는데, 신규 사업이란게 편한쪽으로 들어갈 사업이 아닐 경우가 대다수.

  이럴 경우 1년 동안 빡쉐게 부려먹고 그후 닥달 놔서 나가게끔 만들수도 있는 상황이 발생 합니다. 

  

 또 복지를 다 같이 받는걸로 해놨기 때문에 받을때까지는 내 급여중 일부가 복지에 쓰이는거다라고 생각 하시면 됩니다.

 대다수 회사가 복지 핑계로 연봉을 낮게 책정 하죠?



- 학자금 지원 

   

   꼭 본인 또는 배우자 학자금 지원 유무인지 물어 보세요. 알고보면, 자녀 중학교, 고등학교, 대학교 진학시 일부 지원

   만약 자녀가 몇명 이상이면 전부 지원을 받는지 아닌지 물어보세요. 나중에 뒤통수 맞을일 생길수 있습니다. 

   참고로 대형 통신사 쪽 대학교 등록금 70% 지원인데 2명이면 1명만 지원해줍니다.




- 평가에 의한 연봉 차등 지급

  

   여기서 평가란 항목에 홀딱 넘어가시면 안됩니다. 

   돈 덜 주고 , 더 주는게 평가에 따라 달렸는데 회사 입장에서 5시간 더 일했다고 평가 좋게 주는게 아니죠. 

   일단 빡쉐게 부려 먹고 프로젝이 잘됐나 안됐냐, 기간 산정내로 일을 맞췄냐 안맞췄냐,

   타 프로젝과 비교시 어느정도 기간이 단축되었냐 안되었냐, 

   이 프로젝을 통해서 회사에 얼마정도의 이익을 갖어다 주었냐 안주였냐..

   대략 다양하게 평가 할 항목이 많습니다. 이런건 아는놈만 갖어가는 구조니, 잘 생각하시고 협상하세요.




- 야근 수당 지급 유무. 


   야근 수당을 줄수도 있고 안줄수도 있다 란 늬앙스가 나오는 프로젝트의 경우 , 지급 안한다가 맞습니다. 

   즉 이렇게 말 돌리는 회사의 경우 야근 하지 마세요. 하셔도 니가 자발적으로 한거다라고 막판에 뒤통수 후려 칩니다.

   

   프로젝트가 바쁠경우 어쩔수 없지 않냐? 라고 설득하는 회사의 경우, 결국 야근 수당 없다라는 이야기 이며, 

   막장일 경우에는 니가 업무 처리가 늦어서 야근 해야 하는거다라고 뒤집어 씌울수도 있으니까 잘 고려 하세요. 

    

   또 주말에 근무를 시킬경우 평일에 대체 휴일이다라고 하는데, 이럴 경우 평일 안쉴테니까 주말 특근으로 해서 단가 산정 하세요. 




- 퇴직금 관련 유무.

  

   저는 프리랜서가 맞아서, 일반적으로 특정 파트를 끝내는 방향으로 일을 받습니다. 그래서 저는 퇴직금 이런거는 저랑 안맞는거 같은데, 

   간혹 근무 형태가 정직하고 똑같은 프리분들이 계신것 같습니다.

   1년 넘을 경우 퇴직금 발생이 가능하니 IT노조 위원 분에게 문의 한번 해보시길 바랍니다.




- 개발자로써 자질을 묻는 질문들.


   참고로 개발자로써 란 질문 자체가 개발 인력을 사람으로 보는게 아니라 개발하는 부품으로 취급한다란 의미로 보시면 됩니다. 

   특히, Manager 급에서 개발자로써의 업무 평가 이런식으로 이야기가 나온다면, 그 관리 부서는 개발을 하나도 모르는 회사원급입니다.

   개발에 잠시 몸을 담았다가, 관리직으로 이동했는데, 이런 사람들은 개발 일정 후려치는 일이 비일 비재 합니다. 

   개발에 개 자도 모르는것들이 개발 인력 면접을 보는 경우가 허다 하니, 저런 질문 하는 사람들은 피하세요.





- Mission Clear 냐? Wasting time 이냐?


   불가능한 프로젝트를 주고선 마무리 지어도 잡소리 안하는 타입이신가요? 아니면 그냥 시간만 때우는 타입이신가요? 란 질문입니다.

   위의 질문은 사업 하시는 분께 턴키 베이스 유무 로 들리실 겁니다. 

   참고로 불가능한 프로젝트를 진행 시킨다(무리한 일정 및 자원)면 그건 하지 마세요. 일정 못맞추겠다고 이야기 하시고,

   그래도 진행 할려고 하신다면, 한달에 천만원 정도 달라고 이야기 하세요.


    회사 측에서 저렇게 일정을 잡고 일을 진행하는것 자체가, Software Development 를 모르는 사람들이 얽여서 그런겁니다.

    무능한 관리자가 어떻게 프로젝트를 말아 먹는지는 다덜 경험해보셨다고 생각합니다.


    남 의 똥 치워줄 생각하지 마세요. 성공하면 인사고가에서 반영되는 사람은 다 따로 있습니다. " 똥 치우실꺼면 천만원 "




Posted by 사라링

extjs 공부해 보자.

2012. 11. 22. 18:48

버전 - 3.x 기준

 

EXT JS 예제 사이트  http://dev.sencha.com/deploy/ext-4.0.0/examples/

 

EXT JS 다운로드 사이트 http://www.sencha.com/products/extjs/download?page=a

 

Ext JS 디자이너 다운 http://www.sencha.com/forum/showthread.php?152941-Sencha-Designer-2-Beta-Download-links

 

 사이트에세  저자가 가장 좋다고 생각하는 예제

 

  1. 'Feed Viewer'  - EXT JS 가장 많은 장점을 보여주는 예제복잡함

 

   2.   'Simple Tasks' - Google Gears 데이터베이스를 이용하는 업무 관리 PG

 

 

 

 EXT JS ?

하나의 자바스크립트 라이브러리만이 아닌구조화된 서버 데이터에 기반을  동적이고 배치가 자유로운 사용자 인터페이스를 만들어내는 클라이언트 라이브러리이다그렇지만 EXT JSadapter 사용하여 다른 자바스크립트 라이브러리와 같이 사용할  있다.

 

 EXT JS 사용 용도

풍부한 사용자 상호작용을 제공하기 위한  사이트를 제작할  사용

어떤 일을 처리하거나 어떤 흐름대로 처리해야 하는  사이트가 가장 적합

 

 EXT JS 제공하는 기능

-  브라우저의 환경에 맞게 미세 조정이 선행되어 있는 window, grid, form  같은 사용하기편리한 크로스-브라우저 위젯 제공

-윈도우 크기 변경이나 글씨 크기 변경 등에 발생하는 사용자 키눌림마우스 클릭모니터링 이벤트를 관리하는 EventManager 통한 사용자 상호작용

-AJAX(비동기적인 데이터 요청  결과 처리를 가능하게 ) 이용한 페이지 새로고침 없는 백그라운드에서의 서버와 통신

 

 

 어댑터

Ext JS  개의 프레임워크 jQuery Protaculous 두고 선택할  있게 하였다이는 다른라이브러리를 사용 중이었거나 다른 라이브러리가  적합하다고 판단된다면적절한 어댑터를 이용하여 Ext JS 함게 사용할  있음을 말한다어느 쪽이든 Ext JS 같은 기능을 제고하며어떤어댑터를 선택하든지 같은 커포넌트로 작업하게  것이다.

Ext JS 환경변수(조건)와의 직접적인 인터페이싱을 위한 어댑터도 가지고 있다다른 라이브러리나 프레임워크를 선호하지 않는다면, Ext JS 내장되어 잇는 어댑터만 사용해도  것이다.

[출처] Ext JS 란?|작성자 denees

'J-Query' 카테고리의 다른 글

dialog 예제  (0) 2013.03.12
JQUERY!! 사이트  (0) 2012.11.26
jquey ready? $(function(){});?  (0) 2012.11.22
jquery 움직이는 스크롤 사이드바  (0) 2012.11.15
jQuery 라이브러리 사용 방법  (1) 2012.11.15
Posted by 사라링

jquey ready? $(function(){});?

2012. 11. 22. 11:13

최근 자바스크립트 어플리케이션은 일반적으로  DOM이 완전히 로드된 후 코드를 수행한다.


이유는 코드에서 DOM탐색을 이용하는 경우가 자주 있으니까^^

따라서 웹 브라우저가 DOM은 완전히 로드했으나 이미지나 SWF파일 같은 자원들을 아직 로드하지 못한

시점을 알아내기 위한 방법이 필요합니다.


이를 위해서 window.onload를 이용한다면 자원을 포함한 전체문서 로드를 기다려야 하므로

기다리는 시간이 길어질 수 있습니다.


따라서 지금 필요한 건 DOM그 자체가 탐색과 조작을 위한 준비가 끝났다는 이벤트이고 

그 역할을 해주는 것이 ready메서드 입니다.


<script>

jQuery( document ).ready( function(){


   alert( jQuery( 'p' ).text() ); 


} );


</script>


<body>

<p>jQuery.ready실험</p>

</body>


ready()메서드는 window.onload이벤트를 대신하여 jQuery에서 제공해 주는  메서드입니다.

ready()메서드는 style선언을 한 이후에 사용하는 것이 좋습니다.

이유는 스타일시트가 다 로드된 후에 코드가 시작하는 것을 보장할 수 있으니까^^



ready()메서드에 대한 단축표현도 존재하는데 아래와 같습니다.


jQuery( function() { 

       // 실행 코드

 } );


이런 ready()메서드는 사실 자바스크립트가 페이지의 <head>요소 안에 놓여 있을 경우만 필요합니다.

대신 자바스크립트 코드와 인라인코드를 <body>를 닫기 바로 전에 두면 됩니다.


jQuery.ready실험





이것은 선택의 문제로 볼 수 있지만 자바스크립트를 </body> 태그 바로 전에 넣는

이유를 간단히 요약하면 아래와 같습니다.


최근 최적화 기술은 자바스크립트가 페이지 끝부분에서 로드되는 경우 페이지의 로드가 더 빨라진다고 한다.

즉 앞에서 로드하는 것보다 뒤에서 하는 것을 브라우저가 더 좋아라 한다.

대분분의 브라우저는 자바스크립트 엔진이 웹페이지에 있는 자바스크립트를 컴파일 할때까지 중단하기 

때문에 이런 처리가 더욱 효과적이라고 합니다.

물론 특정 상황에 따라 head에 넣을 수도 있겠죠^^


적은 량의 코드로 최적의 효과를 볼 수 있으니까

굳이 사용하지 않아도될 jQuery( document ).ready~ 등의 타이핑도 줄이고 

일반적인 실행시간도 적게 드니 당연안 결론이겠죠.


'J-Query' 카테고리의 다른 글

JQUERY!! 사이트  (0) 2012.11.26
extjs 공부해 보자.  (0) 2012.11.22
jquery 움직이는 스크롤 사이드바  (0) 2012.11.15
jQuery 라이브러리 사용 방법  (1) 2012.11.15
sliding  (0) 2012.11.15
Posted by 사라링

BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :