본문 바로가기

PreparedStatement

(8)
PreparedStatement 의 clearParameters() 는 불필요..? 하나의 PreparedStatement 로, 여러개의 쿼리를 실행(또는 하나의 쿼리로 파라미터를 바꾸면서 여러번 실행)할 때.. 이전에 세팅했던 파라미터를 모두 클리어 하는 용도입니다만.. 필요가 없을듯 하네요. 물론, 넣어도 상관은 없는데.. 동시 사용자가 갑자기 많아진다 했을 때, 이게 여러번 실행되면.. 실행되지 않았을 때에 비해 아무래도 그 만큼의 퍼포먼스를 잡아 먹게 됩니다. 물론, GC 를 위해 사용한다는 분도 있던데, 불필요한 것은 마찬가지. 기술되는 순간 시스템은 그만큼 느려진다는.. 다만, 파라미터 갯수가 바뀌는 시점에서는 사용해야 함.. ㅠ 다른 의견 있으시면, 댓글 바랍니다. #1 finally 에서 각종 요소를 초기화 할 때..? ... try{ ... }catch(Exception..
오라클 varchar2(4000) 과 한글의 오묘한 만남..? 원문1 : https://javafreak.tistory.com/98 원문2 : http://egloos.zum.com/realcool/v/2585694 SQLInjection 을 막기 위해, PreparedStatement 를 사용하는 것이 기본이겠죠. DB 칼럼에 varchar2(4000) 이 있고, 한글 2000 자를 insert 또는 update 하려 할 때.. 에러가 발생합니다, 글자를 너무 많이 입력했다공.. 이것은, 오라클이.. setString() 을 사용할 때 한글을 UTF-8 로 자동변환 하면서, 한글 1글자를 3bytes 로 인식하기 때문이라네요. 이걸 JDBC 버그라 말하기도 하는데, Statement 를 사용할 때는 setString() 으로 진행해도, 한글 2000자가 잘 들어가..
PreparedStatement SQL 문에 ? 를 적용할 수 없는 것 이를테면, String sql = "select no, name from table_name where no = '32' "; 라는 쿼리가 있다고 하자(물론, 정상 작동한다고 가정한다).. 우리가 익히 보아 온 PreparedStatment 의 SQL 문은 아래와 같은 것이다. String sql = "select no, name from table_name where no = ? "; 그러면, DB table 의 column 명 대신에 ? 를 아래와 같이 사용해 보면 어떨까? String sql = "select no, name from table_name where ? = ? "; 예외를 throw 하지도 않으면서 에러가 난다.. try ~ catch 에 잡히지도 않는다. 이제, DB table 명 ..
프로시저 call 시 어떤 Statement 를 사용해야 할까..? JDBC 버전에 따라서는,PreparedStatement 로 OUT 파라미터가 없는 Procedure 를 호출했을 때,return 값이 항상 0 인 경우가 발생하므로..Exception 이 발생하지 않는 경우에는 성공한 것으로 간주.Clob 을 DB 에 넣을 때, select for update 를 사용할 때 리턴값을 체크하지 않는 것과 유사.-------------------------------------------------------------------------------------------------- 프로시저를 call 할 때 항상 CallableStatement 를 사용해 왔었는데..오늘 우연찮게 PreparedStatement 를 사용해도 정상 작동.. ㅠ.그러면, Statement ..
모바일에서 Base64 로 encode 하고 이를 String 으로 전달받은후 DB 처리 import java.io.BufferedInputStream;import java.io.ByteArrayInputStream;import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; public class ClassMng{ /** * 모바일에서 올려질 때 Base64 로 encode 하고 이를 String 으로 전달받아왔는데, * 이를 Base64 로 docode 하면서 byte 로 전환하고 ByteArrayInputStream 에 담았다가 차후 작업을 생각해서 다시 BufferedInputStream 에 담다 * @param ClassInfo1 작업할 대상 * @return boolean 성공 여부 * @throws Exception */ pub..
QueryRunner 로 PreparedStatement 다루는 방법 QueryRunner" %>DbUtils" %>MapHandler" %>ResultSetHandler" %>    Connection   conn   = null; // 이 부분은 알아서.. ^^.    Map          map    = null;    StringBuffer query  = null;    List         list   = null;    List         params = null;     try {         conn                 = ...; // 커넥션 부분은 알아서..        QueryRunner      qr  = new QueryRunner();        ResultSetHandler rsh = new ..
JSP 프로그램 처리시 보안성 제고 사용자가 입력하는 부분에 대한 보안처리에는 아래와 같은 사항들이 존재. 1. 자동 시스템으로 입력이 되지 않도록 한다. 서버 단에서 처리하는 로직에서 이전 페이지가 어디인가 하는 것은 중요한 화두. a.jsp 에서 사용자가 입력을 하면 b.jsp 가 서버 상의 File 처리나 DB 처리를 하는 경우, b.jsp 는 a.jsp 에서 호출한 것인지를 체크해야 한다. b.jsp 가 직접 호출되는 경우 더이상의 프로세스가 진행되면 안 된다. 2. 사용자가 입력하는 정보에 대한 Validation Check 는 자바스크립트에 의존하지 않는다. a.jsp 에서 사용자가 입력하는 정보를 체크하는 것은 좋은데 이는 가이드 용도 또는 편이성 제공 측면에서 처리하고, b.jsp 에서 사용자가 입력한 정보가 정상적인지를 최..
LongRaw 와 Blob 은 getBinaryStream() 로 추출해서 루프를 통해 byte[] 단위로 스트림 아웃 하세욤.. 어떤 프레임 웍을 사용하든 기본은 DB 작업과 파일 작업. 만약 ResultSet 에 담긴 정보를 사용할때 프레임 웍에 따라 다른 클래스나 메소드에서 작업하면서, DB 작업에서 사용한 (Prepared)Statement 나 Connection 을 ResultSet 작업 전에 닫아 버리지 않도록 주의. LongRaw 로 된 사진 이미지도 Blob 과 동일하게 getBinaryStream() 메소드로 추출. SQLInjection 을 예방하려면 Statement 는 포기하고 PreparedStatement 를 사용. 아래 코드는 스프링 프레임 웍에서 필요한 부분만 따왔어요. 첫번째 메소드는 DB 쪽과 바로 닿아 있는 DAO 이고, 두번째 메소드는 DAO 에서 데이타를 읽어서 비즈니스 로직을 구현하는 부분. ..