살아 숨 쉬는 웹 - 블루비

1 2 3 

[펌] iBatis와 Hibernate 의 특성 비교Total 477 : Today 7 : Yesterday 7

[출처] [본문스크랩] iBatis와 Hibernate 의 특성을 비교한 (FlexComponent) |작성자 브라이언

iBatis : http://ibatis.apache.org
Hibernate : http://www.hibernate.org

HibernateiBatis


1. 2개의 프레임웍의 분류
a. Hibernate: Object Relational Mapper
b. iBatis: SQL mapper

2. Object Relational Mapper란?
a. Database 엔티티(일종의 테이블 row)와 자바 객체를 동기화 하는 역할을 담당
b. Hibernate는 이러한 역할을 하는 프레임웍
c. 모든 sql문은 프레임웍에서 생성되고 실행됨
d. sql작업이 필요할 경우 HSQL을 통하여 이루어짐(EJB-QL과 유사)
e. HSQL은 실제적인 sql의 앞단에서 처리되는 객체지향 쿼리 랭귀지
f. 종류: hibernate, TopLink, Cocobase, JDO 구현체

3. SQL Mapper
a. 자바객체를 실제 sql 문장에 맵핑.(자바 코드에서 sql 관련부분 제거)
b. Sql 문장은 자동 생성되는 것은 아니고 개발자가 기술해 줌
c. 맵핑 자체는 데이터베이스이 엔티티와 관계(relationship)에 독립적임.(mapping 자체가 sql문에 국한)
d. 실제적으로 모든 임베디드 sql 시스템은 모두 sql mapper로 간주가능
e. 예: iBATIS SQL Maps, Oracle SQLJ, Forte 4GL Embedded SQL, Pro*C Embedded SQL
f. iBatis sql map의 경우 xml에 임베디드된 sql (자바코드의 sql을 xml 파일로 분리)

4. Hibernate와 iBatis의 비교우위
a. Hibernate와 iBatis는 다른 특성을 갖는 프레임웍임
b. 일차원적인 비교는 불가능
c. 상황에 따라 적용 프레임웍의 효율성이 달라짐
c-1 Hibernate가 적절한 경우
* 새로운 프로젝트가 시작된 상태
* 객체 모델과 데이터베이스 디자인이 미완성인 상태
c-2 iBatis가 적절한 경우
* 3rd party databases에 접근하는 경우
* 레거시 데이터베이스와 연동이 필요한 경우
* 적업하고 디비 디자인이 부적절한 상태(지져분한 설계)시
* O/R Mapper가 이러한 상황을 제어할 능력이 없을수도 있음.
* SQL Mapper를 사용할 경우 객체 모델과 데이터 모델사이의 멥핑에는 아무런 제약 사항이 없음.
* sql문을 인력을 사용하여 수작업으로 tuning이나 최적화를 해야 할경우

5. Performance 측면의 비교

a. 과거 embeded sql mapper
* 컴파일 랭귀지를 사용하여 제작됨
* 매우 빠른속도를 제공하고 시스템 환경에 최적화 되어 있음
b. O/R mapper
* sql mapper에 비하여 다양한 일을 수행
* 대부분 reflection 방식 (hibernate),
* binary code inhencement 방식(JDO).
* hibernate의 향후 버전에서는 binary code inhencement방식을 채용
* reflection 방식을 사용한다는 측면은 iBatis와 공통점

6. 프레임웍 성능비교는 무의미
a. 프레임웍 성능이란 프레임웍을 어떻게 사용하는 방식에 따라서 결정
b. 일반적으로 O/R mapper가 sql mapper에 비해서 훨씬더 효율적인 맵핑을 하고 수행전략을 수립.
c. O/R mapper는 객체 모델과 데이터베이스 모델에 대한 광범위한 정보를 포함있음
d. 간단한 CRUD 어플리케이션에 테이블-클래스 맵핑을 사용한다면 단순성과 성능이란 측면에서 O/R mapper많은 장점을 갖고 있음
f. 복잡한 데이터 전송방식의 환경에서는 sql mapper가 효율적임
g. Sql mapper가 더 효율적인 sql의 장점들을 표출할 수 있음

7. 결론
a. 하나이상을 선택하여 테스트 해보라.
b. 프로젝트에 대한 컨셉에 따라 세밀하게 테스트 해보라.
c. 모든 프로젝트의 특정은 모두 다르며 상황에 따라 Hibernate, iBATIS SQL Maps, TopLink, raw JDBC를 유연하게 사용해야 함

8. 필자의 의견 (Clinton Begin-iBatis 개발자)
이 러한 이유에서 다양한 툴(프레임웍)을 빠르고 효과적으로 선택하고 테스트 하는 방법을 배우는 것이 더 중요하고 유용하다. 프레임웍중 하나만을 사용할 줄 아는 것은 중요한 것이 아니다. 다양한 상황에서 연습을 해보고, 더 좋은 결정을 내려보시길 바랍니다. 성배를 찾는 것은 중요한 것이 아닙니다.
IBatis와 Hibernate의 특징을 잘 알고 선택하세요.
플렉스는 결과를 XML로 받는다는 점에서 IBatis가 유리 합니다.
서버측은 프로젝트의 성격에 따라서 Hibernate를 선호할 수도 있습니다.
2008/11/07 17:49 2008/11/07 17:49
웹프로그래밍™/PHP, ASP, JSP, JAVA 2008/11/07 17:49 by 블루비

TRACKBACK :: http://blueb.net/blog/trackback/1333

Leave a Comment
[로그인][오픈아이디란?]
이제 대전에서도 IT관련 컨퍼런스를 진행하는 군요
자바개발자에게 도움이 될만한 내용입니다.
전 자바언어를 하지 않지만 앞으로 해야 하기에 도움이 될거 같아 참석하려고 합니다.
관심있는 분들도 참석하시면 좋은 시간이 될거 같네요 그럼 그때 보자구요~~!!!! ^^

제1회 대전 IT 개발자 컨퍼런스
(Daejeon IT Developer Conference)

  • 일시 및 장소
    2008년 09월 28일(일) 10:00~14:00 / 대전문화산업진흥원 3층 시사실
  • 개요
    "대전IT개발자컨퍼런스"는 대전 지역 비영리 개발자 모임인 "대전개발자커뮤니티"가 주최하는 컨퍼런스로 지역 개발자의 전문적 자질을 갖출 수 있도록 방향을 제시하고 지역 업체의 개발자 교육 필요성 제시를 목적으로 합니다.
  • 주제
    웹 프레임워크 -
    Struts 2, Hibernate 3, iBATIS 2, 웹서비스개발 실습 (Agenda 참조
    )
  • 주최 및 주관
    대전개발자커뮤니티, 대전문화산업진흥원

  • 참가 비용 (유료)
    사전 신청: 10,000원 - 기간: 9월 25일(목), 입금: 우리은행 / 심익찬 (1002-037-626178)
    현장 신청: 12,000원* 환불: 2008년 09월 10일(수) 이전 환불 시 "전액 환불"이 가능하고 이후 "환불 불가"
  • 행사 문의
    대전개발자커뮤니티 (http://www.communityDDC.net) - 행사문의 게시판 이용
2008/09/22 19:05 2008/09/22 19:05
웹프로그래밍™/PHP, ASP, JSP, JAVA 2008/09/22 19:05 by 블루비

TRACKBACK :: http://blueb.net/blog/trackback/1301

Leave a Comment
[로그인][오픈아이디란?]

PHP Modify HTTP Headers (Examples)Total 843 : Today 1 : Yesterday 4

출처 : http://www.jonasjohn.de/snippets/php/headers.htm



// See related links for more status codes

// Use this header instruction to fix 404 headers
// produced by url rewriting...
header('HTTP/1.1 200 OK');

// Page was not found:
header('HTTP/1.1 404 Not Found');

// Access forbidden:
header('HTTP/1.1 403 Forbidden');

// The page moved permanently should be used for
// all redrictions, because search engines know
// what's going on and can easily update their urls.
header('HTTP/1.1 301 Moved Permanently');

// Server error
header('HTTP/1.1 500 Internal Server Error');

// Redirect to a new location:
header('Location: http://www.example.org/');

// Redriect with a delay:
header('Refresh: 10; url=http://www.example.org/');
print 'You will be redirected in 10 seconds';

// you can also use the HTML syntax:
// <meta http-equiv="refresh" content="10;http://www.example.org/ />

// override X-Powered-By value
header('X-Powered-By: PHP/4.4.0');
header('X-Powered-By: Brain/0.6b');

// content language (en = English)
header('Content-language: en');

// last modified (good for caching)
$time = time() - 60; // or filemtime($fn), etc
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT');

// header for telling the browser that the content
// did not get changed
header('HTTP/1.1 304 Not Modified');

// set content length (good for caching):
header('Content-Length: 1234');

// Headers for an download:
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"');
header('Content-Transfer-Encoding: binary');
// load the file to send:
readfile('example.zip');

// Disable caching of the current document:
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Pragma: no-cache');

// set content type:
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain'); // plain text file
header('Content-Type: image/jpeg'); // JPG picture
header('Content-Type: application/zip'); // ZIP file
header('Content-Type: application/pdf'); // PDF file
header('Content-Type: audio/mpeg'); // Audio MPEG (MP3,...) file
header('Content-Type: application/x-shockwave-flash'); // Flash animation

// show sign in box
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
print 'Text that will be displayed if the user hits cancel or ';
print 'enters wrong login data';
2008/07/17 09:52 2008/07/17 09:52
웹프로그래밍™/PHP, ASP, JSP, JAVA 2008/07/17 09:52 by 블루비
TAG ,

TRACKBACK :: http://blueb.net/blog/trackback/1265

Leave a Comment
[로그인][오픈아이디란?]

PHP 소켓을 이용한 원격 파일 접근Total 995 : Today 0 : Yesterday 1

<?php
function shutdown_connection()
{
global $fp;
socket_shutdown($fp);
fclose($fp);
}

function check_remote($url, $timeout = 1)
{
$url_stuff = parse_url($url);

$host_name = $url_stuff[host];
$fp = fsockopen($host_name, 80, $errno, $errstr, 2);
if (!$fp) {
return 0;
} else {
socket_set_timeout($fp, $timeout);

$out = "GET $url HTTP/1.1\r\n";
$out .= "Host: $host_name\r\n";
$out .= "Connection: Close\r\n\r\n";

if (fputs($fp, $out)) {
$res = "";
while (!feof($fp)) {
$res .= fgets($fp, 128);
}
return $res;
}
fclose($fp);
}
return null;
}


$res = check_remote("http://blueb.net/socket_remote.php?data=123123");
shutdown_connection();

print_r(explode("\r\n",$res));

?>
2008/06/18 18:36 2008/06/18 18:36
웹프로그래밍™/PHP, ASP, JSP, JAVA 2008/06/18 18:36 by 블루비

TRACKBACK :: http://blueb.net/blog/trackback/1247

Leave a Comment
[로그인][오픈아이디란?]

PHP MySQL Paging SourceTotal 676 : Today 1 : Yesterday 1

<?
/****
* description : MySQL Paging Source
* author : blueb http://blueb.net/blog
* date : 2008-06-17
*/

$condition = "";
$sql = "select count(*) as total from [Table] where 1 $condition";
$r = mysql_query($sql);
$t = mysql_fetch_object($r);
$total = $t->total;

$start = ((int)$_GET['start'] > 0 ) ? (int)$_GET['start']:0;

$limit = 10;
$total_page = ceil($total/$limit);
$vno = $total-$start;
$seek = $start;

$sql = "select * from [table] where 1 $condition limit $seek,$limit";
$r = mysql_query($sql);
while( $t = mysql_fetch_object($r) ){
echo "....";
}//end while
mysql_free_result($r);


$baseUrl = "?params";//add params
$vpage=5;

$first_start = 0;
echo "<a href='$baseUrl&amp;start=$first_start'>1</a> ... ";


$prev_start = ($limit*$vpage) * (floor($start/($limit*$vpage))-1);
if( $prev_start < 0 ) $prev_start = 0;

echo "<a href='$baseUrl&amp;start=$prev_start'>◀</a> ";

for( $i = 1 ; $i <= $vpage ; $i++ ){
$page = $i+(floor($start/($limit*$vpage))*$vpage);

$_start = $limit*($page-1);

if( $start == $_start ){
echo "<b>$page</b> ";
}else{
echo "<a href='$baseUrl&amp;start=$_start'>$page</a> ";
}
if( $_start >= ($total-$limit) ) break;
}

$next_start = ($limit*$vpage) * (floor($start/($limit*$vpage)+1));
if( $next_start >= $total ) $next_start = $_start;

echo "<a href='$baseUrl&amp;start=$next_start'>▶</a>";

$last_start = ($total_page-1)*$limit;
echo " ... <a href='$baseUrl&amp;start=$last_start'>".$total_page."</a>";

?>

2008/06/18 12:43 2008/06/18 12:43
웹프로그래밍™/PHP, ASP, JSP, JAVA 2008/06/18 12:43 by 블루비

TRACKBACK :: http://blueb.net/blog/trackback/1245

Leave a Comment
[로그인][오픈아이디란?]
RSS를 만들어 보겠다고 마음만 먹고 실천 하지 못하는 이 게으른 블루비
이런 마인드도 고쳐야할때가 아닌가 싶다...
각설하고 IBM의 Senthil Nathan, 선임 소프트웨어 엔지니어가 RSS피드 수집기를 구현한 PHP소스코드를 공개하였다. 역시 코드가 고급이다..
아직도 난 초급기능사(?) ㅋㅋ 언제 저런 코드 짜서 공개하나?

RSS

Enabling the Web 2.0 Information Ecosystem


RSS(Rich Site Summary, RDF Site Summary 또는 Really Simple Syndication)는 1990년대 중반에 생겨났습니다. 지금까지 다양한 변종이 나타났다 사라졌으며, 여러 단체와 개인이 소유권 논쟁을 벌였습니다. 그럼에도 불구하고 RSS는 한 웹 사이트에 담긴 정보를 여러 사람에게 배포하는 메커니즘으로 꾸준하게 각광을 받아왔고, 이러한 RSS의 인기를 발판으로 피드 구독기(feed reader) 혹은 피드 수집기(feed aggregator) 라는 새로운 웹 소프트웨어가 생겨났습니다. 상업적으로 판매되는 피드 수집기도 여럿 있지만, 자신의 피드 수집기를 직접 구현해 자신의 웹 응용 프로그램에 통합하기가 그리 어렵지 않습니다. 이 기사에서는 사용자 정의 가능한 RSS 피드 수집기를 구현해 봅니다. 완전히 돌아가는 PHP 코드를 제공하고, RSS 피드 수집기 수정을 위한 서버측 PHP 함수 사용법도 소개합니다. 또한 완전히 돌아가는 RSS 피드 수집기 코드도 제공하므로 곧바로 내려 받아 사용할 수도 있습니다.

more..



출처 : http://www.ibm.com/developerworks/kr/library/wa-aj-rssphp/
2008/04/21 07:21 2008/04/21 07:21
웹프로그래밍™/PHP, ASP, JSP, JAVA 2008/04/21 07:21 by 블루비

TRACKBACK :: http://blueb.net/blog/trackback/1206

Leave a Comment
[로그인][오픈아이디란?]

PHP ExcelReaderTotal 1215 : Today 4 : Yesterday 3

엑셀파일을 php 에서 읽어와 각 셀을 읽어 올 수 있는 ExcelReader 입니다.

http://sourceforge.net/projects/phpexcelreader

위주소에서 제공 되는 파일은 소스를 수정해야 합니다.
개발자가 확인안하고 올린 모양입니다.
파일명이나 include 위치등이 문제가 되는 부분이 있습니다.

하단에 수정된 파일을 링크 해놨습니다.
<?
require_once 'excel/reader.php';
$data = new Spreadsheet_Excel_Reader();

$data->setUTFEncoder('mb'); //한글깨질 경우 추가

// Set output Encoding.
$data->setOutputEncoding('CP949'); //한글 코드

$data->read('excelfile.xls');

error_reporting(E_ALL ^ E_NOTICE);

echo "<table border=1>";
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
echo "<tr>";
for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
echo "<td>&nbsp;".$data->sheets[0]['cells'][$i][$j]."</td>";
}
echo "</tr>\n";
}
echo "</table>";
?>