잊지 않겠습니다.

'Book'에 해당되는 글 33건

  1. 2010.02.07 [책광고] 삼성을 생각한다.
  2. 2009.06.08 1. 데이터 모델링 주요 개념
  3. 2009.03.17 도서구입 1
  4. 2009.02.21 Scrum 1
  5. 2009.01.15 Pro LINQ (07)
  6. 2009.01.13 Pro Linq (06)
  7. 2009.01.09 Pro LINQ (05)
  8. 2009.01.09 Pro LINQ (04)
  9. 2009.01.08 Pro LINQ (03)
  10. 2009.01.07 Pro LINQ (02)
[책광고 릴레이] 삼성을 생각한다

주 요 일간지에서 삼성의 눈치를 보며 광고를 거절한 책....
우리나라의 지배자가 삼성이 되지 않기를 바라며, 일본 애니 등에서 묘사된 "거대 기업에 지배당하는 비참한 미래"를 막기 위해서...

저도 책광고 릴레이에 동참합니다.

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
,

도서구입

Book 2009. 3. 17. 22:48
kangcom.com 의 Mypage에서 지금까지 구입한 금액을 확인할 수 있는 페이지가 있어서 한번 들어가봤다. 
지금까지 구입한 책이 약 300만원어치..;; 

비전공자이기 때문에, 다른 사람들은 더 많이 알고 있을 내용을 난 거의 모르는 경우가 많아서, 책을 열심히 사서 봐야지 된다는 생각을 무척많이했었는데. 그동안 투자했던 것들이 나에게 도움이 어떻게 되었는지가 요즘들어 생각이 드는것 같다. 

일단, 이번 분기. (3~5 월)에 볼 책들.  구입도 했고... 이젠 배송을 기다려야지. ^^

1. CLR via C#
: .NET Framework의 내부를 건드린 국내에서는 거의 유일한 책이다. GC와 memory, dual core cpu에서의 동작 등이 나온 굉장히 기대하고 있는 책. 책의 독자구분이 중급/고급으로 되어있는 책이라서 더 기대가 되고있는 것 같다. ^^

2. Windows via c/c++
: Programming windows application을 지은 제프리의 책이다. 지금은 비록 잘 사용하지 않지만, C++, C로 win32 api를 콕콕 찍고, 윈도우의 동작원리를 설명한 책으로는 지금도 가끔씩 보는 Programming windows application의 버젼업 책이라고 보면 될것 같다. 굉장히 기대하면서 너무나 맘에 들것 같은 책.

3. Head First HTML
: HTML을 근간들어서 자주 사용하고 있는데, 좀더 깔끔한 HTML 코드를 만들어보고 싶어서.. 난 HTML에 관한 책은 단 한권도 없다.;

4. Head First javascript

: 요즘에는 그냥 jquery를 이용해서 javascript를 만들기 하지만, 그전에 인터넷 강의에서 javascript의 기본 구조를 이용해서 ajax call을 하는 것을 알고 javascript  framework 들을 볼때와 그렇지 않았을때의 차이점을 몸으로 느껴본 기억이 있어서, 무언가 계속 잡고 공부하기 보다는 훌~ 하고 읽어보는 목적으로 사용하고 싶은 책이다. Head First 책들에 대한 신뢰가 쌓인 상태라서 보이자마자 주문을 눌러버린 책. ^^

4권이니까.. 한 2달정도 잡아서 보는 것을 생각해봐야지 될 것 같다. 
가장 큰 문제는 저 windows via c/c++ 인데, 그 전판이라고 할 수 있는 programming windows application을 엄청나게 오래본 기억이 있어서.. 가장 많이 배우기도 한 책이지만, 내용이 정말로 깊긴 깊었다.; windows virtual memory, file memory등에 대해서 나온 책은 그책 이외에는 못봤으니까.;

끊임없이 재미를 가지면서. ^^
Posted by Y2K
,

Scrum

Book 2009. 2. 21. 03:04


  Scrum을 소개를 받은 것은 약 2년전즈음에, 잘 아는 개발자들과 XP에 대해서 토론을 하다가 Microsoft와 NCsoft에서 적용하고 있는 Agile방법론이라는 것을 들을 때였다. 그 뒤에 이 책이 소개가 되었을때는 Agile 방법론을 팀에 적용하는 것에 대하여 회의를 가지고 있어, "뭐.. 뻔한 XP에 대한 서적이 또하나 나왔구나" 라는 생각으로 한동안 읽을 생각을 전혀 하지 않다가, 우연한 기회로 책을 받아 읽게 되었다. 

  읽고 난 후의 느낌이란 C로 Hello World를 만들다가 C#으로 Hello World를 만든 느낌이라고 해야지 될까. 내가 지금까지 고민하던 여러가지 사항을  해결해주면서, 또한 내 자신에게 많은 고민을 안겨준 속이 시원하기도 하면서 약간은 답답한 느낌을 주는 책이라는 느낌이다.

  사실 Scrum이란 추천글의 김창준님이 적으신 것 처럼 "전체 규칙을 설명하는데 10분도 안걸리는 방법이다. 그렇지만 이러한 방법을 실천해나가기 위해서는 아직 우리나라에서는 험난한 과정을 거쳐야지 되는 것이 사실이다. 자신의 소스를 감추는 개발자, 지나가는 길에 간단히 물어본 대답에 프로젝트의 전체 일정이 결정되고,
개발이 될 뿐 유지보수가 전혀 되지 않는 환경자체에서 우리가 Scrum을 지혜롭게 적용할려면 어떻게 해야지 될까. 라는 생각이 될때. 10분도 안걸리는 방법이라는 Scrum을 설명하는 이 책에서 보다 더 많은 내용을 얻을 수 있다고 생각된다. 

  이 책은 Scrum을 개인에게 적용하는 방법부터 팀에게 적용하는 방법까지 Scrum에 대한 많은 사례들과 To-Do List로 채워져있다. 가장 인상깊게 본 내용을 뽑으라면 개인에게 Scrum을 적용하기 위한 가장 작은 발걸음이자 가장 중요한 일인 BackLog 작성에 관한 내용이다. 자신이 해야지 될 일들에 대한 Sprint BackLog를 작성하고, 그 Sprint BackLog를 하나둘씩 제거해나가는 것이다. 어찌보면 가장 쉬우면서도 자신이 해야지 될  일을 정확히 판단하고 기술 할 수 있어야지 된다. 쉬우면서 어려운 방법이라고 해야지 될까. 이러한 시작이 되는 작은 발걸음 뿐 아니라, 팀내에서 Scrum을 적용하는 방법에 대해서도 많은 것들을 알려주고 있는데... 이러한 많은 방법들과 다양한 사항들을 볼때, 과연 팀에서 이렇게 적용이 가능한 것일까? 라는 의문이 개인적으로는 계속해서 생긴다. 

  이 책에서 말하는 내용은 이미 XP에 대해서 기술한 애자일 프랙티스나 린 소프트웨어 개발방법론에서 기술된 내용들도 꽤나 많다. 이것은 애자일에 대한 공통적인 항목이니 당연히 그럴만도 하겠지만, 읽다보면.. 결국은 프로젝트의 성공을 위해서는 끊임없는 자기 혁신, 의사소통, 보다 인간다움, 지치지 않는 열정이 필요하다는 말을 달리 표현 해놓은 것 같아서 약간은 씁쓸하기도 하다. 그리고, "이렇게 정의적인 느낌이 드는 것 조차 현장에서는 전혀 안되고 있는데.." 라는 생각이 들면서 기분이 나뻐지는 것은 이 분야에서 일하는 사람들은 다들 같은 생각들이 아닐까? 

  그렇다고, 내가 이 책을 비하가거나 낮은 점수를 주는 것은 절대로 아니다. 이 책은 프로젝트를 성공하기 위해서 무엇이 필요한지에 대한 지혜를 제공한다. 팀단위 뿐 아니라, 자기자신 개인에게도 말이다. 무엇보다도 이 책은 프로젝트 관리에 대한 가장 자연스럽고 단순하며 상징적인 방법을 재조명하고 있다는 점에서 높게 살 수 있다. 그리고 약간은 비관론적으로 생각되는 것이 결국은 "용기"가 부족해서 하지를 못하고 있다는 증거가 아닐까 싶다.

  국민이 모여서 나라가 되듯이, 개인이 모여서 팀이 이루어진다. 비록 적용하기 힘든 현실이긴 하지만, 자신의 Sprint BackLog부터. 옆자리의 동료와의 일일 스크럼 회의부터 시작될 수 있다면 보다더 Happy한 Project를 할 수 있지 않을까. 

PS : 불행히도 내가 아는 대부분의 조직은 개발자가 약자다. 다른 팀에서의 방해를 막을 힘이 있는 개발팀을 거의 본 기억이 없다. 거의 모든 개발팀은 외부로부터의 혼란, 복잡성과 불확실성에서부터 보호받지 못한다. 보호를 받고 성공한 프로젝트(국내의!!)에 대한 홍보나 한국에서의 애자일 방법의 적용 같은 주제를 다룬 책이 있다면 어떨까.. 하는 생각이 무척 많이 든다.


Posted by Y2K
,

Pro LINQ (07)

Book 2009. 1. 15. 02:32
XML Schema(*.xsd)파일을 이용한 XML의 Validation과 기존의 XmlDocument에서 지원되는 XPath 역시 같이 지원 가능하다. 또한, 제공되는 XML을 통한 XML Schema를 역으로 얻어내는 방법을 같이 제공하고 있다. 

var xDocument = new XDocument();
var rootElement = new XElement("BookParticipants");

var bookElement1 = new XElement("BookParticipant");
bookElement1.Add(new XAttribute("type", "Author"));
bookElement1.Add(new XElement("FirstName", "Joe"));
bookElement1.Add(new XElement("LastName", "Rattz"));
rootElement.Add(bookElement1);

var bookElement2 = new XElement("BookParticipant");
bookElement2.Add(new XAttribute("type", "Editor"));
bookElement2.Add(new XElement("FirstName", "Ewan"));
bookElement2.Add(new XElement("LastName", "Buckingham"));
rootElement.Add(bookElement2);

xDocument.Add(rootElement);
xDocument.Save("bookparticipants.xml");

XmlSchemaInference infer = new XmlSchemaInference();
XmlSchemaSet schemaSet = infer.InferSchema(XmlReader.Create("bookparticipants.xml"));
XmlWriter xmlWriter = XmlWriter.Create("bookparticipants.xsd");

foreach(XmlSchema xmlSchema in schemaSet.Schemas())
{
    xmlSchema.Write(xmlWriter);
}
xmlWriter.Close();

XDocument schemaDocument = XDocument.Load("bookparticipants.xsd");
Console.WriteLine(schemaDocument);

정말로 대단한 기능이라고 생각이 되는 것이, XML 파일만 있더라고 그 안에서 XSD의 추론이 가능해지기 때문에, 그 응용을 어떤 방향으로 솔찍히 해줘야지 될지 잘은 모르겠다는 생각이 든다. 아직 XSD를 잘 사용을 안하고 있는 것이 잘 모르고 있는 이유중 하나일 것 같다.

XML의 Validation은 다음과 같이 할 수 있다. 기존의 XmlDocument와 코드가 완전히 동일하다.
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(string.Empty, "bookparticipants.xsd");
try
{
    xDocument.Validate(schemaSet, null);
    Console.WriteLine("Document validated successfully");
}
catch(XmlSchemaValidationException ex)
{
    Console.WriteLine(ex.Message);
}


마지막으로 XDocument에서의 XPath 사용을 간략한 예이다.
xDocument.Add(rootElement);
XElement xElement = xDocument.XPathSelectElement("//BookParticipants/BookParticipant[FirstName='Joe']");
Console.WriteLine(string.Format("Selected Element : {0} / {1}", xElement.Name, xElement.Value));




Posted by Y2K
,

Pro Linq (06)

Book 2009. 1. 13. 10:51
LINQ를 이용한 XML의 검색방법 역시 기존의 LINQ와 동일하다. 
특징적으로 이야기할 수 있는 사항은 각각의 XML의 element, attribute, comment 등으로 검색이 가능하다는 점으로, DB LINQ나 Object LINQ에서 사용하는 것과 같이 XML의 특성으로 검색이 가능하다. 

조금 복잡한 LINQ query를 하나 예시로 든다면.. 

            var biddata = from b in bids.Descendants("bid_tuple")
                          where double.Parse(b.Element("bid").Value) > 50
                          join u in users.Descendants("user_tuple")
                              on b.Element("userid").Value equals u.Element("userid").Value
                          join i in items.Descendants("item_tuple")
                              on b.Element("itemno").Value equals i.Element("itemno").Value
                          select new
                                     {
                                         Item = b.Element("itemno").Value,
                                         Description = i.Element("description").Value,
                                         User = u.Element("name").Value,
                                         Date = b.Element("bid_date").Value,
                                         Price = b.Element("bid").Value
                                     };
            foreach(var bd in biddata)
            {
                Console.WriteLine("{0, -12} {1, -12} {2, -6}, {3, -14}, {4:C, 10}", bd.Date, bd.User, bd.Item,
                                  bd.Description, bd.Price);
            }

보면 재미있는 내용중 하나가 select 구문에서의 새로운 Class의 생성이다. 이 Class는 따로 선언되어있지 않으며, 각각의 Property의 이름을 각각 적어서 생성하게 된다. 이 부분은 C# 4.0에서 dynamic programming과 비슷하게 보이지만 dynamic으로 선언된것과는 다르게 사용된다. var로 선언되어 익명 class로 생성된 상태이다. 

여기에서 bd에 대해 type을 얻어보면 다음과 같다.
<>f__AnonymousType1`5[String, String, String, String, String]
사용된 Item, Description, User, Date, Price에 대해서 5개의 Property를 갖는 익명 Class의 선언으로 되어 있는 것을 알 수 있다.
Posted by Y2K
,

Pro LINQ (05)

Book 2009. 1. 9. 01:16
LINQ를 이용하면 XML의 검색 뿐 아니라, XML의 조작도 간단한 코드로 가능하다. 예전처럼 DataSet을 지정해서, DataSet에 Read Position을 잡아서 해주는 것이 아닌 직관적인 Method을 이용해서 XML의 조작이 가능하게 된다. 

기본적으로 사용되는 Method의 종류는 다음과 같다. 

추가 : Add(), AddFirst(), XNode.AddAfterSelft()
삭제 : Remove(), RemoveAll()
변경 : Update(), Replace(), ReplaceAll()

여기에서 재미있는 것이 ReplaceAll()의 경우인데, 모든 Element의 이름을 기준으로 값을 일괄적으로 변경이 가능하게 된다. 잘만 찾으면 재미있는 결과를 가지고 올 수 있을 것 같다. 

LINQ를 이용한 XML의 검색 및 변경에서 조금 특이한 경우가 XAttribute인데, XAttribute의 경우에는 W3C XML DOM API와 다르게 XAttribute를 통해서 이루어지게 된다. Element, Comment, Processing 과는 아주 약간 다른 조작을 행하게 되지만, 기본적으로 큰 차이는 존재하지 않는다. 

LINQ 및 기존의 XmlDocument에서 재미있는 내용중 하나는 각 Xml Element들에 대한 Event인데, XDocument에서도 기본적으로 Changing, Changed에 대해서 Event를 제공하고 있다. 

XDocument의 생성 및 변경을 통해서 재미있는 일을 할 수 있는데, 그 중 가장 재미있어보이기도 하고, 무엇보다 자주 사용할 수 있어보이는 XSLT transformation에 대한 재미있는 소스를 하나 적어보고 오늘 글을 마쳐볼려고 한다. ^^

XSLT :
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:output method='html'/>
<xsl:template match='/'>
<html>
<head>
<title>Student Directory</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>

<xsl:template match='student_list'>
<h3>Student Directory for example.edu</h3>
<xsl:apply-templates />
</xsl:template>
<xsl:template match='name'>
<p>Name: <xsl:apply-templates /></p>
</xsl:template>
<xsl:template match='major'>
<p>Major: <xsl:apply-templates /></p>
</xsl:template>
<xsl:template match='phone'>
<p>Phone: <xsl:apply-templates /></p>
</xsl:template>
<xsl:template match='email'>
<p>Email: <xsl:apply-templates /></p>
</xsl:template>
</xsl:stylesheet>

XML : 
<student_list>
<student>
<name>John</name>
<major>Math</major>
<phone>010</phone>
<email>student1@mail.co.kr</email>
</student>
<student>
<name>Tom</name>
<major>English</major>
<phone>0001389</phone>
<email>student2@mail.co.kr</email>
</student>
</student_list>

이 둘에대한 transformation에 대한 소스는 다음과 같다. 
            XDocument xDocument = XDocument.Parse(xml);
            XDocument transformedDoc = new XDocument();
            using(XmlWriter xmlWriter = transformedDoc.CreateWriter())
            {
                XslCompiledTransform transform = new XslCompiledTransform();
                transform.Load(XmlReader.Create(new StringReader(xsl)));
                transform.Transform(xDocument.CreateReader(), xmlWriter);
            }
            Console.WriteLine(transformedDoc);


그리고 멋진 실행결과는 다음과 같다. ^^


이걸 이용하면 MailTemplate들이나 Table 표시 포멧을 만들어주는데 표준적인 방법을 제시할 수 있다. (당장 써보고 싶은 기능이다.)
Posted by Y2K
,

Pro LINQ (04)

Book 2009. 1. 9. 01:02
XML을 얻는다면 일반적으로 XmlDocument를 선언하고, XmlDocument에서 지정된 Node의 선택과 node에 대한 Tree 구조로 탐색을 하게 된다. 그러나, LINQ를 사용하게 될 경우에는 이러한 Tree 구조 탐색에 별 의미가 없게 된다. 

XElement에서 각 이름에 대한 검색 및 각 속성에 대한 검색을 모두 지원하고 있다. 다음 소스의 결과는 다음과 같다. 

        public void DoForAncestors()
        {

            XDocument xDocument = new XDocument(
                new XElement("BookParticipants",
                             new XElement("BookParticipant",
                                          new XAttribute("type", "Author"),
                                          new XElement("FirstName", "Joe"),
                                          new XElement("LastName", "Rattz")),
                             new XElement("BookParticipant",
                                          new XAttribute("type", "Editor"),
                                          new XElement("FirstName", "Ewan"),
                                          new XElement("LastName", "Buckingham"))));
            Console.WriteLine("Original XML : ");
            Console.WriteLine(xDocument.ToString());
            Console.WriteLine();
            Console.WriteLine("Search node : name == FirstName");
            var elements = xDocument.Element("BookParticipants").Descendants("FirstName");
            foreach(var element in elements)
            {
                Console.WriteLine(element.Value);
            }
        }



기존의 경우에는 모든 node의 트리 구조를 알고 있어서 xpath를 이용해서 SelectSingleNode 또는 SelectNodeList를 이용해서 각 값을 구해주었지만, LINQ를 이용하면, node에 대한 이름만을 이용해서 얻는 것이 가능하다. 그리고 얻어진 node에서 각 Parent를 얻어내는 것도 가능하다. 

여기에서 한가지 의문이 생기는 것이... 기존의 XmlDocument의 경우에는 거의 필요가 없는 class가 되어버리는 경향이 있는 것 같다. XmlDocument에서 이용하던 거의 모든 method들을 XDocument에서 제공하고 있으며, LINQ 및 보다더 선언적인 XML을 선언할 수 있는 것까지. 지금은 잘 모르겠지만.. 아무래도 XmlDocument를 앞으로는 사용할 일이 그다지 없지 않을까 라는 성급한 생각도 해보게 된다. (물론 .NET Framework 2.0에서의 경우는 또 다르다.;)

XML을 검색을 할때에 Element, Processing, Comment에 대한 검색을 하는 것 역시 LINQ에서 지원이 가능하다. 
또한 선언적인 Type을 넣어줄 수 있기 때문에 코드의 가독성 역시 같이 높아진다. 

        public void SearchForType()
        {
            XDocument xDocument = new XDocument(
                        new XElement("BookParticipants",
                         new XElement("BookParticipant",
                                      new XAttribute("type", "Author"),
                                      new XComment("This is XComment"),
                                      new XProcessingInstruction("Processing", "New Processing"),
                                      new XElement("FirstName", "Joe"),
                                      new XElement("LastName", "Rattz")),
                         new XElement("BookParticipant",
                                      new XAttribute("type", "Editor"),
                                      new XElement("FirstName", "Ewan"),
                                      new XElement("LastName", "Buckingham"))));
            Console.WriteLine(xDocument.ToString());
            Console.WriteLine();

            var elements = xDocument.Element("BookParticipants").
                Elements("BookParticipant").Nodes().OfType<XComment>();

            foreach(var element in elements)
            {
                Console.WriteLine(element);
            }
        }



Posted by Y2K
,

Pro LINQ (03)

Book 2009. 1. 8. 00:28
먼저 설명된 select, take 등이 지연된 operation이라면, 모든 Action이 호출즉시 나오게 된다. 이럴 경우에는 LINQ가 가진 속도의 장점을 잃어버리게 된다. 그렇지만 모든 객체를 한번에 얻어와서 일을 처리하게 될 경우에는 보다더 용의하게 된다. 

    public class DataContextLinq
    {
        public void QueryDatas()
        {
            NorthwindDataContext dbContext = new NorthwindDataContext(@"Data Source=Y2K\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=True");
            dbContext.Log = Console.Out;

            Console.WriteLine("Queried datas - Start");
            var products = (from p in dbContext.Products where p.Color == "Red" select p.Name).ToList();
            Console.WriteLine("Queried datas - End");
            
            Console.WriteLine("Deferred Operation - Start");
            foreach(string productName in products)
            {
                Console.WriteLine(productName);
            }
        }
    }

결과는 다음과 같다. 

차이를 보면, 값을 얻어오는 순간 모든 Query가 실행이 되고, 전 값을 다 얻어오게 된다. 
nondeferred operation은 다음과 같다. 

ToArray()
ToList()
ToDictionary()
ToLookup()
First()
FirstOrDefault()
LastOrDefault()
Single()
SingleOrDefault()
ElementAt()
Sum()
Max()
Min()
etc.... 


경우에 따라 deferred operation과 non-deferred operation의 사용을 달리해줄 필요가 있다. 많은 양의 데이터를 가지고 온다면 deferred operation이 속도 면에서 더 나은 선택이 되지만, 많은 데이터에 대해서 일괄처리를 하게 될 경우에는 non-deferred operation이 선택이 될 수 있다. 











Posted by Y2K
,

Pro LINQ (02)

Book 2009. 1. 7. 18:50
LINQ에서 사용되는 select, where, selectmany는 지연된 동작(deferred operation)을 행한다.

LINQ query가 실행하는 동시에 각 객체를 얻어내고 실행하는 것이 아닌, 결과가 이용될 때에 각각의 객체를 얻어오는 형식이 된다. 

다음과 같은 예제 LINQ query를 보면..
    public class DataContextLinq
    {
        public void QueryDatas()
        {
            NorthwindDataContext dbContext = new NorthwindDataContext(@"Data Source=Y2K\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=True");
            dbContext.Log = Console.Out;

            Console.WriteLine("Queried datas - Start");
            var products = from p in dbContext.Products where p.Color == "Red" select p;
            Console.WriteLine("Queried datas - End");

            Console.WriteLine("Deferred Operation - Start");
            foreach(Product product in products)
            {
                Console.WriteLine(product.Name);
            }
        }
    }

여기에서 var products = from p in dbContext.Products where p.Color == "Red" select p; 에서 검색이 이루어지는 것이 아닌, 각 객체를 얻어낼 때에 그 Query를 던지게 된다. 결과는 다음과 같다. 



이는 foreach 문에서 기존의 DataReader에서 MoveNext() 구문을 호출하게 되는 것과 동일하게 움직이게 된다. 
또한 값을 처음호출할때, DB에 대한 Connection을 연결하기 때문에, DBContext 객체의 경우에는 생성 및 삭제에서 조금 덜 엄격한 IDispose role을 따르게 된다. 
Posted by Y2K
,