게시판
      
상위분류 : 잡필방 중위분류 : 서류가방 하위분류 : 전산과 컴퓨터
작성자 : 문시형 작성일 : 2010-04-29 조회수 : 7,275
제 목 : 김정선의 SQL Server 2008 이야기

 

김정선의 SQL Server 2008 이야기
논란의 중심, LINQ to SQL
  

 

  김정선(jskim@feelanet.com)
필라넷 DB사업부 수석컨설턴트
SQLServer 아카데미/트라이콤 교육센터 강사
 
Microsoft SQL Server MVP
MCT/MCITP/MCDBA
 
 
 
개발자가 아닌, DBA 시각에서 바라보는 LINQ to SQL
ORM(Object Relational Mapping), ADO.NET 3.5, LINQ, LINQ to SQL 그리고 ADO.NET Entity Framework 이런 용어들은 일반적인 DBA에게 매우 낮 설은 용어들일 것 입니다. 이는 Visual Studio 2008과 함께 새로 제공되는 ADO.NET 3.5의 이전까지 없었던 단일 개념으로는 가장 대규모의 변화로 느껴집니다. LINQ 는 현재 Visual Studio 2008에 중요한 화두가 되어 있으며, 많은 개발자들이 상당한 관심을 보이고 있습니다. 그 중에서도 LINQ to SQL은 논쟁의 중심에 있습니다. 실제로 Visual Studio 관련된 세미나와 자료 등에서 LINQ와 LINQ to SQL이 핵심 주제 중의 하나로 다루어지고 있는 것을 알 수 있습니다. 저 또한 그러한 세미나를 통해 다른 전문가들의 의견을 들어 보고 있습니다.
 
Microsoft ADO.NET팀을 포함해서 많은 개발자들이 LINQ, LINQ to SQL에 대해서 침이 마르도록 그 장점과 이득을 강변하는 것을 들을 수 있습니다. 물론 저 또한 상당 부분 동의를 합니다. 그러나 오늘은 개발자로서의 관심사가 주제가 아닙니다. SQL Server를 관리하는 DBA 입장에서 LINQ to SQL이 어떻게 다가올 지 약간의 염려와 함께, DBA로서 바라보는 시각이 어떤 것인지, 무엇에 관심 있는 지, 그리고 앞으로 어떻게 다루어야 할지에 대한 작은 고민을 해 보고자 합니다.
 
ORM, LINQ to SQL, Entity Framework 등등, 그 안에서 무슨 일이 벌어지고 있던 DBA에겐 관심 없는 영역입니다. Application 혹은 Service를 무엇으로 어떻게 구현하든, ORM를 어떻게 현실화하건 결국 SQL Server에 요청되는 명령은 SQL입니다. 따라서 DBA에게 관심 있는 것은 LINQ to SQL이 아니라, LINQ to SQL에 의해서 호출되는 바로 그 쿼리에 해당하는 것이죠.
 
특히, 그 중에서도 가장 관심 있는 영역은 바로 그 쿼리의 성능 문제입니다. DBA로서 당연한 관심사입니다. 이 글을 읽는 분이 DBA 가 아니시라면, DBA의 시각과 그들의 관심사를 이해하는 목적으로 보시면 좋겠습니다. 나중에 또 티격태격 싸우지 않으시려면……^^
 
 
DBA를 위한 LINQ to SQL 소개
LINQ(Language INtegrated Query) 및 LINQ to SQL을 모르는 DBA를 위한 주제이므로 간단히 소개부터 하겠습니다. 직접 개발할 것은 아니므로, 그 구현 단계까지 상세하게 설명할 필요는 없을 것 같습니다. 그저 아~ 이런 것이구나? 라고 느낄 정도면 충분할 듯 합니다. 핵심만 간단히 정리하고 참고 자료로 마무리하겠습니다.
 
간단히 두 버전을 비교해 보면 쉽게 이해할 수 있습니다. 우선 LINQ to SQL을 사용하기 이전의 일반적인 ADO.NET 코드 그리고 LINQ to SQL을 사용한 코드 예제입니다.
 
[그림. 일반적인 ADO.NET 코드 예제]
 
 
 
[그림. LINQ to SQL 예제]
 
 

 

두 예제 코드의 차이점이 보이는지요?
결론만 얘기하자면, 바로 SQL을 구현하는 방법의 차이입니다. 즉, 이전엔 흔히 하드 코딩된 쿼리 혹은 Adhoc 쿼리라고 부르던 방식입니다. 말 그대로 프로그램 코드 안에 SQL 쿼리를 직접 작성해서 입력하는 방식이죠. 반면에 LINQ to SQL은 직접 쿼리를 작성하지 않습니다. LINQ to SQL Class Model과 ORM Framework을 통해서 구현된 class에 대해 LINQ 문법을 이용해서 코드를 작성하면 실행 시 실제 SQL 쿼리가 Framework에 의해서 자동 구현되고 호출되는 것입니다. 아마 이를 처음보시는 분은 엥? 문법이 왜 저래? 왜 거꾸로 된 거야? 라고 황당해 하는 분들이 대부분이실 겁니다. 이건 상상해 맡기겠습니다. ^^
 
보시고 무슨 생각이 드시나요? 매우 좋아 보이시나요? 혹시 무언가 염려스러운 부분은 없습니까?
여러분들의 생각과 의견이 궁금합니다. 꼭 댓글을 통해 알려주세요.
 
참고. LINQ에 대한 자세한 내용은 공개된 많은 자료들을 통해 보실 수 있습니다. 그 중에서도 .NET 개발자 플랫폼 전무이사인 Scott Guthrie(얼마 전 한국에 방문했었죠, 역시 대단하신 분)의 블로그의 내용이 아주 좋습니다. http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx - 여기서부터 읽어보세요.
 
 
LINQ to SQL, 무슨 일이 벌어지고 있나!
그럼, 저희들의 관심사를 확인해 보죠. LINQ 문법과 Framework에 의해서 실제로 SQL Server로 호출되는 쿼리는 어떤 모양을 가지고 있을까요? 현재 LINQ는 기본적인 SQL 문법을 상당 부분 지원하고 있습니다. 즉 단순한 SELECT 뿐만 아니라, WHERE, ORDER BY, GROUP BY, JOIN 등의 해당하는 LINQ 문법을 모두 지원합니다. 심지어 게시판 형태의 Paging 구현 작업에 사용될 수 있는 Skip(), Take() 등의 메서드를 이용하면, ROW_NUMBER(), TOP 과 같은 쿼리들도 구현이 됩니다.
 
그럼, 그 중에서 JOIN, JOIN과 GROUPING, 그리고 앞서 소개한 Paging 작업에 대한 LINQ to SQL 구현 예제와 함께 실제로 어떤 쿼리가 생성되고 호출되는지 Profiler를 통해 추적과 결과를 보여드리도록 하겠습니다. 실제 쿼리를 보시면 어떻게 처리되고 있는지 금방 짐작하실 수 있으실 겁니다.
 
우선 아래 그림은 Visual Studio 2008의 LINQ to SQL 디자이너를 이용해서 만든 class 모델입니다.
Northwind 데이터베이스의 세 개의 테이블을 가지고 있고, 각각 조인 및 집계 작업으로 아래 예제에서 구현될 것입니다.
 
[그림. LINQ to SQL 디자이너 화면]
 
 
 
[그림. JOIN]
 
 
[그림. JOIN  – 실제 쿼리]
 
 
  
 [그림. JOIN과 GROUPING, 집계]
 

| | 목록으로