잊지 않겠습니다.

.NET 3.0 Framework을 내놓으면서 LINQToSQL을 발표하면서 데이터와 모델간의 하나의 큰 전환점을 MS는 가지고 왔다. Java 진형의 Hybernate나 iBatis에 대항한 LINQToSQL이 바로 이것인데.. Visual Studio에서 특별한 코딩이 없이, 바로 Db의 Schema를 데이터의 Type으로 얻어오는 것이 가능하고, 그 Type의 생성 및 수정, 삭제가 Data와 같이 연동되어서 사용되어 질 수 있는 MS 진형에서는 나름 혁명적인 사건이라고도 할 수 있다.; (개인적으로는.;)

물리적 Model인 Database의 data를 개념적인 모델인 class로 변경시키고, 개발자들은 보다더 개발에 대해서 Application과 object에 대한 관점을 높이는 것이 보다 더 나은 application을 만들 수 있다는 것이 기본적인 발상인데.. 

이번에 발표된 내용으로는 Visual Studio 2008에 있던 LINQToSQL을 조금은 버리고, ADO .NET Entity Model을 중점으로 갈 것 같다는 느낌이 든다. 

무엇보다 MS SQL Server에 치중된 LINQToSQL이 아닌, ADO .NET 에서 얻을 수 있는 모든 데이터는 다 사용 가능한 ADO .NET Entity Model이 더욱더 좋은 모델이겠지만, 이거 얼마 안지나서 또 바뀌는 것에 대한 이 찜찜함은.;;;

기본적인 사용법은 ADO .NET Entity Model과 LINQToSQL이 거의 같다. 
차이가 있다면 DataContext로 연결된 데이터 모델이 ObjectContext로 변경되었고, Generate되던 코드들의 차이점정도 이외에는 큰 차이가 나타나지 않는다. 

큰 차이가 하나 있다. 기본적으로 LINQToSQL은 DataContext에서 Table에 Insert, Delete가 가능하지만, ADO .NET Entity Model에서는 ObjectContext에서 AddTo{Table}, DeleteObject method를 이용해서 Insert, Delete를 한다. 좀 더 접근성을 높인 명명법을 만든 것인지 모르겠지만.... 기존것이 더 직관적이긴 했는데.;

MS에서 발표하기로는 속도면에서는 LINQToSQL이 훨씬 낫다고 하는데..
이건 기본적으로 ADO .NET에서 SqlConnection, SqlCommand 자체가 MS Sql에서 훨씬 빨랐던 그 차이를 그대로 가지고 온 것에 불과하고.... 

그럼 나머지는 모두 DbConnection, DbCommand가 내부적으로 구현되어서 사용되고 있는 것인가??? ;;
한번 뒤져볼 내용일 것 같다. 
Posted by Y2K
,
회사에서 난생처음 linux에서의 web 작업을 하는 도중에 php를 사용하면 더 편할 것 같은 예감이 들어서, php로 뚝딱뚝딱. 

linux의 언어설정은 unicode로 되어있고, php의 언어설정은 되어있지 않아서, 한글이 깨지는 문제가 계속해서 발생해서 조금 고생한 듯. 기종간 최고의 문제는 역시 언어설정인것을 다시 한번 느끼게 되었다. 

#메일 보내기
<?
function encode_2047($subject) {
    return '=?euc-kr?b?'.base64_encode($subject).'?=';
}

function customer_sendmail($email_str, $userName, $subject, $message)
{
    mb_internal_encoding('EUC-KR'); 

    $from_name = $userName;
    $from_name = encode_2047(iconv("UTF-8","EUC-KR",$from_name));

    $subject = iconv("UTF-8","EUC-KR",$subject);
    $message = iconv("UTF-8","EUC-KR",$message);

    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'X-Mailer: PHP' . "\r\n";
    $headers .=  "Content-Type: text/html; charset='ks_c_5601-1987'\r\n";
    $headers .= 'From: '.$from_name.' < test@smtp.co.kr >'. "\r\n";

    // 메일 보내기
    $result = mb_send_mail($email_str, $subject, $message, $headers) ;
    return $result; 
}

// 멋진 코드. Post로 보내진 모든 데이터를 $Name 형태로 모두 만들어준다. 
foreach($_POST as $key=>$value)
{
       $$key=$value;
}

$to = "to@smpt.co.kr";
$subject = "[코로케이션] 시스템 무료 점검 신청_" . $companyName;

$body="
====================================
* 회사 이름 : $companyName
* 사용자 이름 : $userName
* 연락처 : $phoneNumber1-$phoneNumber2-$phoneNumber3
* 운영체제(os) 버젼 : $osVersion
* DB 버젼 : $dbVersion
* 서버 용도 : $useService
* 기타 점검 요청 사항 : $etc   
=====================================
";
customer_sendmail($to, $userName, $subject,$body);
?>


#메일 & 첨부파일 보내기
<?php
function encode_2047($subject) {
    return '=?euc-kr?b?'.base64_encode($subject).'?=';
}
foreach($_POST as $key=>$value)
{
       $$key=$value;
}

if($_SERVER['REQUEST_METHOD']=="POST"){
mb_internal_encoding('EUC-KR'); 
  $to = "to@smtp.co.kr";
  $subject=encode_2047(iconv("UTF-8","EUC-KR","[코로케이션]시스템 무료 점검 사전정보_".$companyName));
$from = iconv("UTF-8","EUC-KR",$companyName);
  $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
  // 파일 이름 얻어오기. 넘기는 페이지의 input="file"의 name 속성으로 넘엉
  $tmp_name = $_FILES['filename']['tmp_name'];
  $type = $_FILES['filename']['type'];
  $name = $_FILES['filename']['name'];
  $size = $_FILES['filename']['size'];

  $headers = 'MIME-Version: 1.0' . "\r\n";
  $headers .= 'X-Mailer: PHP' . "\r\n";
  $headers .=  "Content-Type: text/html; charset='ks_c_5601-1987'\r\n";
  $headers .= 'From: '.$from."<test@smtp.co.kr>\r\n";
$engineer = "아니오";
if($rdEngineer == "true") {
$engineer = "예";
}
$protect = "아니오";
if($rdProtect == "true") {
$protect = "예";
}
$duplication = "아니오";
if($rdDuplication == "true") {
$duplication = "예";
}
$backup = "아니오";
if($rdBackup == "true") {
$backup = "예";
}
$message = "";
if($rdEngineer == "true") {
 $message = "
  ==================================== <br/>
* 회사 이름 : $companyName<br/>
* 서비스 유형 : $serviceType<br/>
* 구매 날짜 : $buyDate<br/>
* 전문 엔지니어 관리 : $engineer<br/>
* 보안 설정 : $protect<br/>
* 이중화 구성 : $duplication<br/>
* 백업 구성 : $backup<br/>
* 기타 문의 사항 : $etc<br/>
====================================
";
}
else {
$message = "
  ==================================== <br/>
* 회사 이름 : $companyName<br/>
* 서비스 유형 : $serviceType<br/>
* 구매 날짜 : $buyDate<br/>
* 전문 엔지니어 관리 : $engineer<br/>
- 서버 관리 : $noEngineer<br/>
* 보안 설정 : $protect<br/>
* 이중화 구성 : $duplication<br/>
* 백업 구성 : $backup<br/>
* 기타 문의 사항 : $etc<br/>
====================================
";
}
$message = iconv("UTF-8","EUC-KR",$message);
if (file_exists($tmp_name)){
if(is_uploaded_file($tmp_name)){
$file = fopen($tmp_name,'rb');
$data = fread($file,filesize($tmp_name));
fclose($file);
$data = chunk_split(base64_encode($data));
    }
$headers = "From: $from\r\n" .
         "MIME-Version: 1.0\r\n" .
         "Content-Type: multipart/mixed;\r\n" .
         " boundary=\"{$mime_boundary}\"";
$message = "This is a multi-part message in MIME format.\n\n" .
         "--{$mime_boundary}\n" .
         "Content-Type: text/html; charset='ks_c_5601-1987'\n\n" .
         $message . "\n\n";
$message .= "--{$mime_boundary}\n" .
         "Content-Type: {$type};\n" .
         " name=\"{$name}\"\n" .
         //"Content-Disposition: attachment;\n" .
         //" filename=\"{$fileatt_name}\"\n" .
         "Content-Transfer-Encoding: base64\n\n" .
         $data . "\n\n" .
         "--{$mime_boundary}--\n";
}
mail($to, $subject, $message, $headers);
}
?>

php를 사용하건, ruby를 사용하건, 어떤 언어를 사용하더라도...
가장 중요한 것은 일단 해보자라는 용기?? ^^


Posted by Y2K
,
식별자 (PK, FK)
: database에서의 index.

대표헝 여부에 따른 분류 : 주식별자, 보조 식별자
생성 여부 : 내부 식별자, 외부 식별자
단일 속성 여부 : 단일 식별자, 복합 식별자
대체 여부 : 원조 식별자, 대리 식별자

주식별자 / 보조 식별자
: Entity type을 유일하게 식별할 수 있게 하는 특징을 가짐.
: 해당 업무에 적합한 식별자를 주 식별자로 이용한다. (카드사에서 카드번호와 주민번호 중에서 카드 번호를 주 식별자로 이용하는 경우)

내부 식별자 / 외부 식별자
: 내부 식별자 : 자신의 entity type에서 스스로 생성되서 존재하는 식별자
: 외부 식별자 : 다른 entitiy type에서 관계에 의해 주식별자 속성을 상속받아서 사용되는 경우(FK)

단일 식별자 / 복합 식별자
단일 식별자 : 주식별자의 속성이 한가지 속성으로 구성된 경우
복합 식별자 : 주식별자의 속성이 두가지 이상의 속성으로 구성된 경우

원조 식별자 / 대리 식별자 
대리 식별자 : 여러개의 속성을 묶어서 하나의 속성을 만들어 주식별자로 사용하는 경우


관계(Relationship)
: 행위에 의한 관계, 존재에 의한 관계로 분류 가능
존재에 의한 관계 : 기본 entity type 사이의 관계를 의미
행위에 의한 관계 : event의 발생에 따라 생성되는 성격을 가지고 있다. 

정규화
특징
1. 정규화는 적절한 Entity type에 각각의 속성을 배치하고 Entity type을 충분히 도출해가는 단계적인 분석 방법이다.
2. 정규화 기술은 Entity type에 속성들이 상호 종속적인 관계를 갖는 것을 배경으로 종속관계를 이용하여 Entity type을 정제하는 방법이다.
3. 각각의 속성들이 데이터 모델에 포함될 수 있는 정규화의 원리를 이용하여 데이터를 분석하는 방법에서 활용될 수 있다. 
4. 정규화는 현재 데이터를 검증할 수 있고, 데이터의 표현관점에서 Entity type을 정의하는 데 이용할 수 있다. 
5. 정규화는 Entity type을 object 별로 분석하는 법이 아닌 개별 데이터를 이용한 수학적 접근 방법을 이용해 분석 한다. 

: 일반적으로 Object 분석 방법에 의해서 도출하게 된다. 그러나, Object 분석 방법에 의한 도출 역시 제 3 정규화 규칙이 모델링 작업의 기초에 관여하고 있다. 
: 정규화 규칙을 이용한 검증이 가능하다. 

정규화 단계
1차 정규화
: 복수의 속성값을 분리
: 복수의 속성값이 없는 경우에는 1차 정규화 대상이 아니다.

2차 정규화
: 주 식별자에 종속적이지 않은 속성의 분리
: 부분 종속적 속성의 분리
: 자신의 Table에 주식별자를 구성하는 속성이 복합 식별자인 경우에만 해당된다. 

3차 정규화
: 속성에 종속적인 속성의 분리
: 이전 속성(Transitive Dependency)의 분리
: 주식별자가 아닌 속성중에서 식별자가 되는 경우에 그 식별자와 그에 종속된 속성을 분리한다.

보이스-코드 정규화
다수의 주 식별자 분리
: 1, 2, 3차 정규화가 모두 마쳐진 후에 가능
: 주 식별자가 다수가 되는 경우에는 삭제, 업데이트, 입력시에 에러가 발생할 수 있기 때문에 최대한 없애는 것이 좋다.

4차 정규화
: Multi-Valued Dependency 속성 분리

5차 정규화
: 결합 종속인 경우는 두개 이상의 N으로 분리





Posted by Y2K
,