애플리케이션

MS LINQ에 대해 알아야 할 5가지 진실

John Paul Mueller | CIO 2008.06.30
마이크로소프트의 새로운 발명품인 통합 언어 쿼리(Language Integrated Query : LINQ)는 아직 많은 사람들에게 생소한 기술이다. 설사 LINQ라는 말을 들어봤다 해도 아마 대부분은 따분해 하면서 요구 사항을 유발하는 또 다른 신기술쯤으로 치부했을 것이다.

그러나 LINQ는 주장하는 바를 실제로 모두 구현할 수 있다는 점에서 다른 대부분의 신기술과 구별된다. 필자는 지금까지 수많은 기술을 다뤄봤고 그때마다 실망했지만 1년 가까이 LINQ로 작업하면서는 실망감을 느끼지 않았다. LINQ는 놀라울 정도로 사용하기 쉬운데다 무척 안정적이다. LINQ에 대해 필자와 같은 느낌을 받은 다른 개발자들이 만든 다양한 서드 파티 애드 온을 보면 이것이 필자 혼자만의 생각이 아님을 알 수 있다.

아직 LINQ를 다뤄본 적이 없는 사람을 위해 간단히 정의해 보자. LINQ는 SQL과 같은 일종의 쿼리 언어이지만 구문은 약간 다르다. 기본적인 개념은 사용자가(보다 정확히 말하자면 사용자의 애플리케이션이) 질문을 하면 LINQ가 지정된 데이터 소스에서 답을 가져다 주는 것이다.

이때 데이터 소스는 단순한 데이터베이스가 아닐 수도 있다. 예를 들어 회계 부서 소속 직원들이 누구인지 LINQ에 묻고 데이터 소스로 액티브 디렉토리를 제공한다면 LINQ는 액티브 디렉토리에서 사용자가 원하는 답을 가져다 준다.

소프트웨어 개발자를 대상으로 하는 LINQ 관련 문서는 많으므로 이 글에서는 IT 관리자가 이해해야 하는 중요한 점에 대해 살펴보기로 하자.

1. 자세한 배경 지식이 없어도 신기술을 이용할 수 있다.

LINQ의 가장 큰 장점은 재사용성이다. 개체에 액세스하기 위해 만든 복잡한 쿼리를 액티브 디렉토리, 마이크로소프트 SQL 서버, MySQL, 또는 웹 서비스에서도 사용할 수 있다. 즉, 개발자는 LINQ를 이용하기 위해 신기술을 계속해서 익혀야 할 필요가 없다.

기본적인 LINQ 설정에는 여러분이 생각할 수 있는 모든 데이터 소스, 즉 데이터 개체, SQL 서버 데이터베이스, XML 및 DataSet에 대한 액세스 기능이 포함되어 있다. 그러나 여기까지만 본다면 LINQ의 진정한 장점은 놓치는 셈이다.

마이크로소프트에 속하지 않은 사람들이 만든 서드 파티 공급자, 즉 LINQ 애드 온을 통해 그 외의 다른 데이터 소스에도 마음껏 액세스할 수 있다. 또한 이러한 애드 온은 상당히 많이 나와 있다. 이 중에는 액티브 디렉토리와 같은 일반적인 데이터 소스도 있고 자원 기술 프레임워크(Resource Description Framework: RDF)와 같은 흔치 않은 데이터 소스도 있다.

프로그래밍 환경에서 기본적으로 지원되지 않는 데이터 소스에 액세스하려면 험난한 과정을 거치거나 변칙적인 프로그래밍 시나리오를 따라야 한다. 한 부분을 바꾸려면 대부분의 경우 막대한 양의 코드를 변경해야 한다. LINQ에서는 항상 동일한 쿼리를 사용한다. 이러한 특성으로 인해 개발 과정이 대폭 간소화되는데, 특히 프로젝트에 새로 참여해 아직 팀의 DBA와 친숙한 관계가 아닌 프로그래머에게 이 장점은 크다. 기술적인 예가 필요한가? 간단히 설명하기 위해 우선 다음과 같은 C# 문자열 배열을 가정해 보자.

String[] QueryString = { "One", "Two", "Three", "Four", "Five" };

길이가 3자 이상인 모든 문자열을 찾으려면 다음과 같은 쿼리를 사용하면 된다.

var ThisQuery = from StringValue in QueryString where StringValue.Length > 3 select StringValue;

여기에서는 ThisQuery가 쿼리 프로세스의 결과다. LINQ가 알아서 처리하기 때문에 실제 형식은 정의하지 않아도 된다. 대신 var을 데이터 형식으로 사용한다. 이 코드는 StringValue를 사용해 QueryString에서 where 조건인 StringValue.Length > 3에 부합하는 개별 데이터 값을 저장한다. 쿼리에서 select 부분은 데이터 소스에서 무엇을 선택할지 나타내는 역할만 한다.

진짜 흥미로운 부분은 바로 여기다. 똑 같은 쿼리를 사용해서 RDF에서, 또는 액티브 디렉토리에서 데이터를 가져올 수 있다. 데이터 소스에 대한 공급자만 있다면 똑 같은 코드를 사용해서 해당 데이터 소스에서 데이터를 가져올 수 있다. 멋지지 않은가!

LINQ의 범위를 안전한 오픈 소스 프로젝트나 마이크로소프트 전용 데이터 소스로 한정해 생각하면 안 된다. LINQ는 MySQL뿐만 아니라 그 외에 부가적인 여러 가지 LINQ 데이터 소스에서 잘 작동한다.

LINQ 쿼리가 복잡한 상황은 처리하지 못하리라 생각할 수도 있다. 여기에 사용된 예는 LINQ에 대해 알아보려는 경우 어디서부터 시작하면 좋을지 알려 주기 위한 예일 뿐이다. 즉, LINQ 쿼리는 SQL 쿼리와 마찬가지로 데이터 소스와 결과물 요구 사항이 추가됨에 따라 복잡해질 수 있다. 이러한 복잡한 쿼리의 학습 난이도 자체는 그다지 높지 않지만 LINQ 역시 다른 모든 기술과 마찬가지로 사용자가 더 많은 일을 요구할수록 복잡해지게 된다.

2. 보다 적은 코드로 완전한 애플리케이션을 만들 수 있다.

처음에 필자는 LINQ를 사용하면 더 적은 코드로 애플리케이션을 만들 수 있다는 마이크로소프트의 주장에 대해 회의적이었다. 말은 그렇게 하지만 실제로 지켜지지 않는 솔루션을 수없이 봐왔기 때문이다. LINQ를 사용해 SQL 서버 쿼리를 만들기 전까지 이러한 필자의 생각에는 변함이 없었다. 그런데 어떻게 된 영문인지 이전의 프로그래밍에서는 똑 같은 일을 하기 위해 8줄의 코드가 필요했던 쿼리가 LINQ로는 단 한 줄의 코드로 완성됐다.

LINQ 쿼리에서 사용할 데이터 소스 개체를 만들기 위해 여기에 두 줄의 코드를 추가해야 하지만 이건 닷넷 애플리케이션으로 작업을 하는 경우에도 마찬가지로 해야 할 일이므로 손해 볼 부분은 전혀 없다.

이쯤이면 대가 없이 무언가를 얻지는 못한다는 사실이 떠오를 법도 하다. 사실이다. LINQ를 사용하려면 개발자는 비주얼 스튜디오에서 데이터베이스에 액세스할 때와 마찬가지로 공급자를 제공해야 한다. 공급자는 데이터 소스와 LINQ 사이의 중개자 역할을 하고, 그 결과로 LINQ가 코드를 재사용할 수 있게 된다.

즉, 개발자는 맞춤형 데이터 소스에 액세스해야 하는 경우가 아니라면 공급자 코드를 작성할 필요가 없다. 과거에는 직접 작성해야 했던 코드의 대부분이 공급자에 포함되기 때문에 개발진이 작성해야 하는 코드의 양이 전체적으로 줄어든다. 코드의 양이 더 적다는 것은 오류가 발생할 소지도 그만큼 감소됨을 의미하고 따라서 QA 부서의 업무량도 줄어들게 된다.

3. 애플리케이션 개발 시간을 단축하고 오류를 줄일 수 있다.
LINQ는 코드를 더 이해하기 쉽게 만들어 준다(적어도 프로그래머가 이해하기에는 더 쉽다. 기술적인 배경이 없는 관리자는 전혀 느끼지 못할 수도 있다).

LINQ는 많은 개발자들이 이미 익숙한 SQL과 유사한 구문을 사용한다. SQL과 마찬가지로 개발자는 원하는 결과만 지정하면 된다. 그러면 LINQ는 개발자가 지정한 공급자를 기반으로 어떻게 해야 이 결과를 얻을 수 있는지 판단한다. 작성해야 하는 코드의 양이 줄어들고 코딩 환경이 단순화된다면 애플리케이션을 개발하는 시간도 더 단축된다.

또한 이렇게 만든 LINQ 애플리케이션에는 오류도 그만큼 더 적게 발생한다. 데이터 소스 공급자를 만든 개발자는 LINQ에서 사용하기 전에 이미 이 공급자를 디버깅하고 최적화하기 때문이다. 개발자가 작성하는 코드의 양이 더 적고, 각 코드 라인은 기본적으로 동일한 구조를 기반으로 하므로 애초부터 오류가 더 적은 애플리케이션을 만들 수 있다.

마이크로소프트의 LINQ 디버깅 기능 역시 디버깅 절차를 훨씬 더 쉽게 해준다. 필요하다면 각 쿼리가 정보를 낚아채는 과정을 하나하나 관찰할 수 있다. 마이크로소프트가 이번에는 일을 제대로 한 모양이다.

물론 모든 부분이 항상 완벽하지는 않다. 서드 파티 공급자와 관련한 한 가지 잠재적인 문제는 LINQ 기능이 완전히 포함되지 않은 공급자가 있다는 점이다. 만일 오류가 발생할 가능성이 있다면, 그 원인은 여러분이 사용하는 서드 파티 공급자가 완벽하지 않다는 데 있다고 보면 된다.

LINQ에는 개발자가 복잡한 쿼리를 만드는 데 도움이 되는 몇 가지 메서드가 있다. 서드 파티 공급자가 이 중 일부 메서드를 지원하지 않는 경우 개발자는 누락된 부분을 채울 방법을 직접 찾아야 한다. 마이크로소프트는 공급자가 모든 요소를 갖추었는지 확인하고 이 조건에 부합할 경우 해당 업체에게 인증서 또는 기타 알아볼 수 있는 표식을 부여하는 서드 파티 공급자 인증 프로그램을 만들어야 한다. 그건 그렇고, 사실 필자가 지금껏 사용한 최악의 서드 파티 공급자도 대부분의 개발자에게 필요한 쿼리를 만드는 데는 충분했다.

4. 변칙적인 프로그래밍 트릭에 의존하지 않고 여러 데이터 소스를 결합
개발자라면 하나의 쿼리에서 여러 데이터 소스의 데이터를 결합할 수 있는 LINQ의 기능을 반길 것이다. 따라서 개발진이 프로젝트를 더 빨리 끝내기를 희망하는 관리자(특히 프로젝트가 다른 마이크로소프트 제품 및 서비스와 상호 연계되는 프로젝트인 경우) 역시 이 기능을 좋아할 수밖에 없다.

회사 부지의 특정 건물에 근무하는 모든 직원을 찾은 후 해당되는 직원들을 급여 데이터베이스에서 검색하려는 경우를 예로 들어 보자. LINQ를 사용하면 액티브 디렉토리에서 결과를 가져와 이를 SQL 서버 데이터베이스 쿼리에 적용하는 단일 쿼리를 만들 수 있다. 마찬가지로 SQL 서버 쿼리와 MySQL 쿼리를 결합하거나 웹 서비스 쿼리를 RDF의 제품 검색에 추가할 수도 있다. 가능성은 무한하다.

5. 새로 참여한 개발자의 작업 속도 향상

요즘의 신참 개발자들이 직면한 한 가지 문제는 지난 세월 동안 기술이 큰 폭으로 발전했다는 점이다. 필자가 처음 코드를 작성하기 시작한 무렵에는 이해하기 쉬운 베이직 명령문 몇 개만 있으면 재미있는 작업이 가능했다. 5~6줄짜리 코드로 화면에 줄무늬를 그릴 수 있었다.

그러나 지금의 신참 개발자는 간단한 애플리케이션 하나를 만들기 위해서도 온갖 험난한 고초를 모두 겪어야 한다. 대상을 속속들이 알지 못한다면 어떤 애플리케이션을 개발하든 그 노력은 수포로 돌아가고 만다. 설사 경험이 풍부한 개발자라 해도 새로운 환경의 모든 요소들의 함축적 의미를 이해하는 데는 상당한 시간을 투자해야만 한다. LINQ가 이렇게 험난한 적응 과정에서 발생하는 모든 문제를 해결하지는 못하지만 확실히 도움은 줄 수 있다.

LINQ를 도입하면 관리자가 안달하지 않아도 신참 개발자의 작업 속도가 빨라진다. 출근한지 하루나 이틀 된, 약간의 손재주가 있는 신참 개발자는 훨씬 더 즐겁게, 더 생산적으로 일할 수 있다. 생산성이 높은 개발자들은 보다 짧은 시간 안에 훌륭한 애플리케이션을 뽑아낸다. LINQ는 무거운 일은 모두 공급자에 맡기는 방법으로 프로그래밍 작업의 복잡성을 한결 덜어준다. 개발자는 결과를 얻는 방법은 알 필요가 없다. 그저 원하는 결과가 무엇인지만 알면 된다.

*존 뮬러는 자유 기고가이며 기술 관련 편집자이기도 하다. 타고난 저술가인 그는 지금까지 네트워킹에서 인공지능, 데이터베이스 관리에서 복잡한 프로그래밍에 이르는 광범위한 주제로 80권의 책을 펴냈고 300개 이상의 기사를 썼다. 지금은 ‘누구나 따라 하는 LINQ(LINQ for Dummies)’를 저술 중이다(2008년 8월 출간 예정).

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.