Tag Archives: sql

Interpreter pattern은 SQL 또는 통신프로토콜을 기술하는 언어 구현시 주로 이용되는 아키텍쳐

인터프리터 아키텍쳐 패턴(Interpreter Architectural pattern)은 프로그래밍 언어의 특정 구문을 해석/분석하는 컴포넌트 디자인에 많이 사용됩니다.

이 아키텍쳐의 기본 아이디어는 각각의 표현마다 클래스를 가지도록 하여 이를 조합하는 구조를 만드는 것입니다.

Interpreter pattern은 SQL 또는 통신프로토콜을 기술하는 언어 구현시 주로 이용되는 아키텍쳐
인터프리터 아키텍쳐 패턴(Interpreter Architectural pattern)은 SQL과 같은 Database Query Language 또는 특정 통신 프로토콜을 기술하기 위한 언어 등에 주로 응용되고 있습니다.

인터프리터 아키텍쳐 패턴(Interpreter Architectural pattern)의 장점이라 함은 동적인 설계가 가능하며, 최종 사용자가 프로그래밍하기 좋다. 즉, 인터프리터 프로그램을 쉽게 교체할 수 있기 때문에 유연성이 향상된다고 할 수 있습니다.

반면에 인터프리터 언어는 일반적으로 컴파일 언어보다 느리기 때문에 성능 문제가 발생할 수 있다는 단점이 있습니다.

그루비(Groovy) 튜토리얼 6 – GSQL

그루비(Groovy) 튜토리얼 6 - GSQL
2008.4.22 translation & editing by gilbird

원문: http://groovy.codehaus.org/Tutorial+6+-+Groovy+SQL

그루비 SQL

이번 튜토리얼에서는 앤드류 글로버(Adrew Glober)가 작성한 그루비 SQL에 대한 글의 일부를 보도록 하자. 아래는 문자열 선언부에 변수를 넣는 새로운 언어 구성체이다.  아래를 보도록 하자.

piEstimate = 3;println(“Pi is about ${piEstimate}”);println(“Pi is closer to ${22/7}”);

보시다시피 문자열에서 그루비는 ${}를 그루비 식으로 인식한다.

이 형식은 아래와 같이 보다 확장할 수 있다.

간단한 질의 실행하기

첫번째 그루비 SQL 코드는 세 줄이다.

import groovy.sql.Sqlsql = Sql.newInstance(“jdbc:jtds:sqlserver://serverName/dbName-CLASS;domain=domainName”, “username”,                     “password”, “net.sourceforge.jtds.jdbc.Driver”)sql.eachRow(“select * from tableName”, { println it.id + ” — ${it.firstName} –“}

첫번째 줄은 자바 import이다. Sql 객체의 전체 이름을 알리고 있다. 두번째 줄은 SQL 데이터베이스에 새로운 연결을 하고 sql 변수에 연결을 저장한다.

이 코드는 MS SQL 서버로 연결하는 jTDS 연결용으로 작성했다. 각자 username과 password와 같이 사용하고자하는 데이터베이스에 대한 파라메터를 조절하기 바란다.

마지막 세번째 줄은 sql의 eachRow 메서드에 두개의 인자를 전달하는데 첫번째 인자는 질의 문자열이고 두번째 인자는 값을 출력하는 클로져이다.

클로저의 “it”은 두가지 다른 방식으로 액세스 한다는 점을 주의깊게 보기 바란다. 첫번째는 it의 id를 액세스하는 간단한 필드 참조이고 두번째는 앞서 언급한 그루비 식이 들어있다.

따라서 한 열에 대한 출력은 아래와 같이 나온다.

001 — Lane —

DB에서 값 가져오기

DB의 한 열에서 한 개 이상의 컬럼 값이 필요하다면 아래와 같이 하면 된다.

row = sql.firstRow(“select columnA, columnB from tableName”)println “Row: columnA = ${row.columnA} and columnB = ${row.columnB}”

복잡한 질의 수행하기

위 예제들은 아주 간단했는데 insert, delete, update 등 복잡한 데이터 처리 질의에 대해서 다루는 경우 그루비 SQL이 아주 유용하다. 이 때 클로저를 쓸 필요없이 그루비의 Sql 객체의 execute와 executeUpdate 메서드를 쓰면 된다. 이 메서드들은 기존 JDBC Statement 클래스에 있는 것들과 이름과 동작이 유사하다.

아래는 ${} 문법으로 변수를 치환하여 insert를 수행하는 간단한 예이다. 이 코드는 새로운 열을 people 테이블에 insert한다.

firstName = “yue”lastName = “wu”sql.execute(“insert into people (firstName, lastName) “+  ” values (‘${firstName}’, ${lastName})”)

위의 예에서 insert문의 모든 문자열에 작은 따옴표를 넣어야 하는 점에 유의해야 한다. 이 방식은 바람직하진 않다 (데이터에 작은 따옴표 문자가 있을 경우를 생각해보라). 보다 나은 방식은 아래와 같이 prepared statement를 사용하는 것이다.

firstName = “yue”lastName = “wu”sql.execute(“insert into people (firstName, lastName) “+  ” values (?,?)”, [firstName, lastName])

위의 예를 보면 insert문에서 넣고자 하는 데이터를 ?로 표시하고 실제 넣을 값은 배열 인자로 전달하면 된다. update도 유사한 방식이다. 아래 예를 보면 executeUpdate 메서드 역시 질의에서 ?에 들어갈 값을 가져온다.

comment = “Lazy bum”sql.executeUpdate(“update people set comment = ? where id=002”, [comment])

delete는 질의 문법이 다른것 외에는 위와 동일하다.

sql.execute(“delete from word where word_id = ?” , [5])

JPG 저장된 DB 이미지 JSP로 보여주기

Blob Type으로 저장된 DB 이미지를 JSP로 보여주는 비기를 공개한다.

<%@ page language=”java” contentType=”image/jpeg” %>
<%@ page import=”java.util.*, java.sql.*, java.io.*” %>
<%
  String sql = “”;
  Connection con = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;

  OutputStream output = response.getOutputStream();
  InputStream input = null;

  try {
    con = DriverManager.getConnection(“Jdbc:oracle:thin:@서버주소:PORT:SID”,”USER”,”PASSWORD”);
    sql =” select imagedata from imageTable where id = ‘00000’ “;
    pstmt = con.prepareStatement(sql);
    rs = pstmt.executeQuery();
    if (rs.next()) {
      input = rs.getBinaryStream(“imagedata”);
      int byteRead;
      while((byteRead = input.read()) != -1) {
        output.write(byteRead);
      }
      input.close();
    }
  } catch(Exception e) {
    out.print(e);
  } finally {
    try {if (rs != null) rs.close();} catch (Exception ex) {}
    try {if (pstmt != null) pstmt.close();} catch (Exception ex) {}
    try {if (con != null) con.close();} catch (Exception ex) {}
  }
  input.close();
  output.flush();
  output.close();
%>

오라클8i 글자수 무제한 게시판소스

턱없이 부족한 실력이지만 구현해보았습니다.
intermedia text 를 사용하지 않고 4000byte 가 넘는 텍스트를 like 검색
(경계에 걸리는 단어는 검색불가능합니다만 그외의 단어는 검색가능합니다.
SQL을 잘 안다면 잘라진 텍스트를 붙여서 검색하는 쿼리도 생각해 볼 수 있겠죠.
^^; 불가능 할 수도 있을 거구요.)
가능하도록 쪼개서 넣는 로직으로 구현했습니다.
한글이 맨 마지막에 들어갈 경우 4001 바이트가 되므로 한 덩어리 크기는
3999 bytes로 잘랐습니다.

소스를 보시고 더 좋은 의견이 있으신 분은 답글 달아주시면 감사하겠습니다.
index는 달지 않았습니다. 습작이기 때문이기도 하고, 제가 db를 잘 모르는
이유도 있습니다.

board_insert2.jsp 파일에 텍스트를 자르는 루틴이 들어있습니다.
db schema는 답변형 게시판으로 잡았지만 아직 구현되지는 않았습니다.
readme.txt 파일에 설치및 기능 설명을 해 놓았습니다.

읽어주셔서 감사합니다. 좋은 하루 되십시오.
/*
   okboard 0.61
   작성자 : kenu@okjsp.pe.kr
   배포처 : http://www.okjsp.pe.kr
   작성일 : 2001-05-23 6:33오전
   테스트 : http://210.219.132.222/okboard/board.jsp (no guarantee)
*/
Oracle8i, jspSmartUpload 를 이용한 자료게시판입니다.

개발환경
apache 1.3.19,
tomcat 3.2.1, Resin 1.2.5,
Oracle 8.1.5, 8.1.6, 8.1.7

설치법
root(예: c:/jsphome)
c:/jsphome/index.html
c:/jsphome/okboard/board_create.jsp  <– 게시판 생성 한번실행 후 파일명 바꾸시거나 삭제하세요.
c:/jsphome/okboard/board_delete.jsp  <– 게시판 drop 시킵니다 파일명 바꾸시거나 삭제하세요.
c:/jsphome/okboard/board.jsp         <– 게시물리스트
c:/jsphome/okboard/board_insert.jsp  <– 자료 입력폼
c:/jsphome/okboard/board_insert2.jsp <– 자료 입력처리
c:/jsphome/okboard/board_reply.jsp   <– 답변 입력폼
c:/jsphome/okboard/board_reply2.jsp  <– 답변 입력처리
c:/jsphome/okboard/passchk.jsp       <– 수정권한 암호 입력
c:/jsphome/okboard/board_modify.jsp  <– 수정폼
c:/jsphome/okboard/board_modify2.jsp <– 수정처리
c:/jsphome/okboard/db.jsp            <– jdbc 정보파일
c:/jsphome/okboard/go.jsp            <– back 방지용 중계처리
c:/jsphome/okboard/delete.jsp        <– 삭제권한 암호 입력
c:/jsphome/okboard/delete2.jsp       <– 삭제처리
c:/jsphome/okboard/path.jsp          <– jvm의 classpath 확인
c:/jsphome/okboard/download.jsp      <– 다운로드 처리
c:/jsphome/okboard/okboard.css       <– 페이지 CSS
c:/jsphome/okboard/okboard.js        <– javascript

c:/jsphome/okboard/images/           <– 그림파일 디렉토리
c:/jsphome/WEB-INF/classes/com/      <– JspSmartUpload 컴포넌트 디렉토리
c:/jsphome/upload/                   <– 파일이 업로드되는 디렉토리

※ D:oracleora81jdbclibclasses12.zip 이 jvm 의 classpath 에 인식이 되어야 합니다.
   그렇지 않을 경우 java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 메세지가 뜹니다.
   Oracle 8.0 이하는 쿼리가 제대로 동작하지 않을 수 있습니다.

 

실행법
설치 완료 후 tomcat을 구동시킨 후
브라우저에서 http://localhost/okboard/board_create.jsp 를 요청합니다.
kboard 라는 table 이 만들어 지면 됩니다.
board_create.jsp 파일 이름을 바꿔주세요.
board_delete.jsp 파일 이름을 바꿔주세요. 테이블리셋 시에 바꾼이름을 브라우저에서 요청하면 됩니다.

보안
oracle의 데이터베이스의 기본 접근권한으로 되어있습니다. (scott, tiger)
변경을 원하시면 db.jsp 파일만 수정하시면 됩니다.

table 구성 (kboard, kboard_cnts)
CREATE TABLE KBOARD (
 BBSID VARCHAR2 (10) NOT NULL,
 REF NUMBER NOT NULL,
 STEP NUMBER DEFAULT 0 NOT NULL,
 LEV NUMBER DEFAULT 0 NOT NULL,
 WRITER VARCHAR2 (50) NOT NULL,
 SUBJECT VARCHAR2 (500) NOT NULL,
 PASSWORD VARCHAR2 (8),
 EMAIL VARCHAR2 (50),
 READ NUMBER DEFAULT 0 NOT NULL,
 FILENAME VARCHAR2 (200),
 MASKNAME VARCHAR2 (20),
 FILESIZE NUMBER DEFAULT 0,
 DOWNLOAD NUMBER DEFAULT 0,
 WHEN DATE,
 IP VARCHAR2 (24)) ;

CREATE TABLE KBOARD_CNTS (
 BBSID VARCHAR2 (10) NOT NULL,
 REF NUMBER NOT NULL,
 STEP NUMBER NOT NULL,
 LEV NUMBER NOT NULL,
 CONTENT VARCHAR2 (4000),
 CID NUMBER DEFAULT 0 NOT NULL) ;

0.61 –  2001-05-23 6:33오전
리스트 버그 수정

0.6 –  2001-05-21 1:58오전
게시판 제목, 이름, 내용 검색 추가
select 항목 지정하는 javascript 추가

0.5 –  2001-05-20 1:11오전
수정기능 추가
Cookie로 입력신상 저장

0.4 –  2001-05-18 10:56오전
답변기능 추가
Fn.java 버그 수정

0.3 –  2001-05-17 5:57오후
오라클의 4000바이트 제한을 풀었습니다.
다운로드 방식을 바꾸었습니다.
한글제목파일, 이미지 다운로드시 이상없습니다.
게시물 작성 후 refresh 되도록 했습니다.
email 링크로 변경했습니다.
doc, xls, ppt, gif, img 모두 다운로드 창 뜹니다.
jsp 코드 올려도 실행되지 않습니다.

전신
kboard 를 오라클용으로 전환합니다.