aboutSQL은 무엇을 다루는가?
한빛미디어
|
2005-08-05
|
by HANBIT
20
14,362
aboutSQL은 무엇을 다루는가?
SQL이 무엇인지 아는 것이 싫은가? 진지한 응용프로그램 개발자는 경력에 플러스를 위해서라도 SQL에 대해서 조금은 배울 필요가 있을 것이다. 그리고, SQL을 배우기 시작하면, 바로 그것을 사용할 수 있다.
이 칼럼은 SQL에 대한 것을 다룰 것이며, 이번에는 SQL이 무엇이며, 왜 SQL을 사용해야 하는 지에 초점을 둘 것이다. 재미있을 것이다.
SQL의 역사
1970년대로 거슬러 올라가서, 컴퓨터는 비싸고, 데이터를 처리하기는 어려웠다. 은행과 같은 대기업이나 정부는 거대한 정보를 저장할 뿐만 아니라 조작할 필요가 있었다. 물론 IBM은 그 당시에 모든 컴퓨터에 대한 소스였다. 그리고 San Jose에 있는 연구 그룹에서는 관계형 데이터 모델에 기반한 새로운 데이터베이스 패러다임을 내놓았다.
System R은 효율적인 테이프 저장장치나 순수한 순차 데이터 덤프 대신에 데이터 사이의 관계에 초점을 두었기 때문에 진보를 향한 큰 걸음이었다. 관계형 데이터베이스는 객체 지향 프로그래밍 시대에는 당연한 것처럼 보이지만, 그 당시에 그것은 앞을 향한 큰 도약이었다.
System R의 개발 부분은 비 순차적, 데이터베이스 질의를 구조화하기 위한 영어와 비슷한 언어를 가지고 있었다. 이 언어는 구조적인 영문 질의 언어(Structured English Query Language) 또는 SEQUEL(역자 주 : ‘시퀄’이라 발음한다)이라고 불렀다. 다른 벤더들은 도구로서 관계형 데이터베이스의 능력를 알았고, 그래서 오라클과 다른 회사들은 그들 고유의 관계형 데이터 베이스를 내놓았다. 이들 관계형 데이터베이스는 SEQUEL과 같은 문법에 기반한 언어를 포함하고 있었다. 관계형 데이터베이스 제품이 개발되어감에 따라, 표준이 필요하다는 것이 명백해졌다. 그래서 1986년에 소위 SQL-86 표준이 ANSI에 의해 표준으로 제정되었으며, 그 다음해에 ISO에 의해서 표준으로 제정되었다. 1986년 이후로, 세 가지의 새로운 버전의 SQL 표준이 개발되었다. SQL-89, SQL-92, 그리고 SQL 3이라 불리는 SQL-99 모두가 스펙에 추가적인 기능으로 추가되었으며, 그러한 스펙은 데이터베이스 툴 커뮤니티의 개발에 의해 바뀌는 경향이 있다.
표준 SQL은 간단한 문서가 아니다 – 2000페이지 이상의 어려운 기술 용어, 관계형 데이터 모델에 대한 수학적 증명, 로직, 표준들이 말하는 것은 쉽게 읽을만한 것은 아니다! 그러나 SQL은 거의 30년이나 된 표준이며, 여러분의 일상적인 프로그래밍 작업에 손쉽게 사용할 수 있는 것이다.
객체 지향 데이터베이스(OODB – 역자 주: Object-Oriented Database로서 DBMS의 발전은 관계형 데이터베이스(RDBMS)에서 과도기적인 객체 관계형 데이터베이스(ORDB)를 거쳐 현재는 객체 지향 데이터베이스(OODB)로 넘어가고 있다. Oracle 7은 RDBMS이며, Oracle 8i은 RDB와 OODB의 장점을 합친 ORDB이며, Oracle 9i는 OODB가 될 것이라한다)가 현재 더 매혹적일지라도, SQL은 실제로 데이터를 읽고, 저장하고, 조작하는 중요한 응용 프로그램에서 기본적인 역할을 한다. 오랜 클라이언트 서버 작업에서 SQL은 Perl에서 Java, PHP, ColdFusion, ASP에 이르기까지 수 많은 웹 프로그래밍 도구에서 사용되어왔다. 아직도 SQL을 실행하는 것을 모른다면, 곧 알게될 것이다. 지금 준비하자, 독자여러분 – 우리는 이제 SQL에 대해 얘기할 것이다.
표준은 표준이다….가 표준?
좋다, 이제 솔직하게 말하도록 하자. 어떠한 도구도 SQL3 표준을 완전히 구현하지 못한다. 사실, 많은 툴들은 SQL-92 표준도 구현하지 못한다. 여러분은 사진을 갖고 있다. 표준의 대부분은 구현되어 있다. 여러분이 사진을 갖고 있다고 생각하자. 여러분이 필요로 하는 모든 것들은 대부분 표준에서 구현된 것이며, 모든 실질적인 목적에 적합한 것이다. 내 생각에, SQL은 엄격한 표준보다 훨씬 더 많은 가이드라인을 가지고 있다. 물론, ANSI와 ISO는 필자와 논쟁하고 싶어할지도 모른다. 그러나 모든 목적에 있어서, SQL은 기초적인 관계형 데이터베이스 개발에 있어서 보통의 글루 언어(Glue Language : 역자주 – 글루 언어는 말 그대로 풀과 같은 언어로서 어떠한 언어에도 붙여서 쓸 수 있는 언어를 뜻한다. Perl역시 글루 언어로서 C, C++, Java등의 언어와 같이 사용할 수 있는 것과 마찬가지로 SQL역시 많은 DBMS와 웹 프로그래밍 언어에서 하나의 서브셋으로 사용될 수 있다)로서 제공된다. SQL은 또한 운영 체계에 관계없을 뿐만 아니라, 데이터베이스 플랫폼에 관계없이 이식성있는 데이터베이스 응용 프로그램을 개발하는데 있어 핵심이 된다. 여기에 상대적으로 기술적이지 않은 사람들도 많은 데이터 조작을 할 수 있도록 쉬운 접근을 제공한다.
SQL의 비밀을 탐험하기 위해 앞으로 칼럼들을 보게됨에 따라, SQL은 Perl언어에서 초기화를 의미하는 ‘/a(.*)b\1c/;’과 같은 문장과 달리 이해하기 쉽게 읽을 수 있다는 것을 알게 될 것이다.
SQL 표준은 주요 3가지 엔티티(entity)를 정의한다 : 객체, 데이터 형, 언어 요소
표1에서 이러한 클래스와 간단한 예제들을 볼 수 있다. 만약에 데이터베이스를 가지고 작업한 적이 있다면, 이들 용어가 쉽게 이해될 것이다.
표 1: SQL 언어 엔티티(entity)
객체 테이블(table), 컬럼(column), 프로시저(procedure), 함수(function)
데이터형 실수(float, real), 정수(int), 문자(char), 불리언(Boolean)
언어 요소 SQL 문장을 구성하는 예약어, 토큰, 특수문자(SELECT, >= 등)
그래서, 표준은 각각 고유의 데이터베이스의 기능에 대하여 기본적인 정의를 제공한다. 그 다음 단계는 각각 고유의 데이터베이스 툴을 개발하는 개발 팀에 달려있다 – 그들은 어떠한 기능을 포함하고 무시할 것인지를 결정한다. 추가된 기능이 표준에 없는 것일 수도 있다. 그들이 구현한 스펙중의 일부는 표준이 아닌 메소드로 구현될 수도 있다.
어떤 제품과 SQL 표준의 일치의 정도는 기본적으로 비용이라는 기본 프로그래밍 원칙에 의한다 – 개발에 필요한 시간과 노력은 본질적 특징에 비교된다. - 왜 수천달러나 하는 Oracle이 mSQL과 같은 공개 프로그램과 비교되는 풍부한 기능들을 갖고 있는지를 이해하면 쉽다. 그러나 둘다 표준 SQL 객체, 데이터 형, 연어 요소들을 사용하며, 대부분의 응용 프로그램이 두 데이터베이스 사이에 포팅될 수 있다는 것에 주목하는 것이 중요하다.
일상에서의 SQL
만약에 여러분이 컴퓨터 공학 과정을 이수했다면, 여러분은 모든 기초적인 프로그래밍 개념에 대하여 얘기할 것이다. – 예를 들면, 알고리즘, 제어 구조, 데이터 구조론 등등. 그러나 일단 프로그램을 위한 데이터 구조를 만들었다면, 그것들을 어딘가에 저장하기를 원할 것이다. 특히 간단한 데이터의 경우, 일괄적인 순차 텍스트 파일이 좋을 것이다. 다른 예로, 데이터 레코드에 대하여 비순차 접근을 하는 바이너리 파일을 구현할지도 모른다. 그러나, 데이터의 크기가 증가하고 복잡해지기 시작하면, 응용 프로그램은 견고하고 빠르게 될 필요가 있을 때, 여러분은 아마도 데이터베이스 툴의 세계에서 해멜 것이다. 응용프로그램 데이터를 관리하기 위해 데이터베이스 툴을 선택함으로서 얻게되는 이점은 여러분이 게을러 질 수 있다는 것이다. 내가 알기로는 보다 복잡한 데이터를 위한 효율적인 검색 알고리즘은 물론이고, 나의 머리 꼭대기 까지 짜내어서 좋은 버블 정렬 알고리즘을 작성한 적이 없다. 그러나 만약 내가 데이터를 기능적으로 데이터베이스에 추상화시킨다면, 단순히 그러한 데이터베이스에 대한 인터페이스를 다루고 관계형 데이터베이스를 기능적으로 최적화하는데 수 많은 시간을 보내는 수 많은 사람들에게 의존하면 된다. 프로그래머가 고려하는 만큼, 데이터를 조작할 수 있는 고성능의 인터페이스가 SQL이다.
Authors 파일의 세번째 칼럼에서 LastName이 Ashenfelter인 사람을 찾기 위해서, 탭으로 구분되어 있는 데이터로 된 텍스트 파일을 검색하는 알고리즘을 작성한다고 생각해보자. 아마, 여러분은 배열, 비교 연산자, 재귀 호출, 그외 컴퓨터 공학 과정에서 배우지 못한 것들, 아직 컴퓨터 옆 책꽂이에 꽂힌 아직 읽지 않은 컴퓨터 책들에 있는 것과 같은 모든 종류의 어려운 이론을 다루어야 할 것이다.
다시 말해서, 여러분이 원하는 것은 LastName을 갖고 있는 데이터 파일에서 “Ashenfelter”라는 텍스트를 SELECT하는 것이다. 자, 여러분이 원하는 언어로 알고리즘을 작성하는 동안에(필자는 Perl을 추천한다) 필자는 그러한 요구를 SQL 문장으로 고쳐쓸 수 있다. 계속 할까요? 여러분이 알고리즘을 작성할때까지 기다려 줄까요?
SELECT Lastname FROM Authors WHERE Lastname="Ashenfelter";
필자가 여러분을 이긴다는 데에 걸겠다. 게다가 필자의 코드는 더 짧다. 위 예제에 있는 SQL 코드와 위에 쓴 문장이 비슷하다는 것에 주목하십시오.(역주:원문은 I mean, all you want to do is select the text "Ashenfelter" from the column that holds the last name in the data file!을 말하며, SQL 문장과 비슷하다는 것은 ‘select the text “Ashenfelter” from the column’을 말한다)
기본적으로, 동사 SELECT, 동사에 행위를 지시하는 목적 Subject, 약간의 연산자, 그리고 마지막에는 세미콜론 ;, 또는 내가 질의하고있는 데이터베이스의 종류에 따라서 – SQL은 그러한 모든 것을 단순함, 표준 인터페이스로 감추고 있다. 이것이 표준 언어의 아름다움이다.
주의 : 모든 SQL 문장은 세미콜론(;)으로 끝나지만, 대문자가 필요한 것은 아니다.
대부분의 언어와 응용 프로그램 플랫폼은 표 2에서와 같이 관계형 데이터베이스에 연결하기 위한 기반 기술을 제공한다. 이러한 기술은 그러한 툴이 프로그래밍 환경과 데이터베이스 엔진 사이에 데이터베이스 연결을 열도록 제공한다. 그리고 기본적으로 개발자가 그러한 연결에서 SQL 코드를 데이터베이스로 보내도록 한다. 많은 고수준의 데이터베이스는 또한 native call-level(역자주 : 굳이 번역하면 ‘원시 함수 호출 수준의 인터페이스’가 될 것이다. 이것은 고유의 DBMS가 지원하는 API를 말한다. Oracle은 OCI(Oracle Call Interface)를 지원하며, SQL Server는 SQLDMO와 같은 API Wrapper와 API를 지원한다) 인터페이스를 지원하며, C/C++과 같은 프로그래밍 언어에서 호출 할 수 있다.
표 2: 데이터베이스-응용프로그램 기술 인터페이스
DBI, DBM Perl
JDBC Java
ODBC Visual Basic, ColdFusion, ASP 등
OLE-DB Microsoft tools (ASP, VB)
ODBC(역자주 : ODBC는 Open DataBase Connectivity의 약자이다)는 표준 인터페이스로서 벤더에 독립적으로 응용 프로그램과 데이터베이스 사이에 통신할 수 있다. ODBC는 인터페이스를 제공하여 데이터베이스 고유의 드라이버를 사용하여 ODBC 요청을 데이터베이스 고유의 호출로 변환한다. 표 2에 있는 다른 툴들은 기본적으로 그와 같은 벤더 독립적인 레이어를 제공하여 데이터베이스사이에 통신을 하도록 한다 – 주어진 SQL 데이터베이스에 대한 드라이버가 많아질수록, 새로운 플랫폼에 데이터를 복사하고, 새로운 드라이버를 설치함으로써 응용프로그램의 백엔드에 있는 데이터베이스를 변경할 수 있다.
많은 실세계의 시나리오에서, 여러분은 ODBC를 사용하여 응용프로그램을 데이터베이스에 연결하고 질의를 만들기위해 SQL을 사용하게 될 것이다. 특히, ColdFusion이나 ASP와 같은 웹 프로그래밍 도구를 사용하여 웹 어플리케이션을 작성하는 경우에 그렇다. 이러한 프로그래밍 도구는 대부분의 프로그래머들에게 SQL을 좋은 도구로 만든다.
일단 SQL을 배우게 되면 좋을 것이다 – 서버에 적절한 ODBC 드라이버를 설치하고 DBA는 데이터베이스를 관리하고 구조를 만들고, 여러분은 단순히 SQL 문으로 데이터를 넣기만 하면 된다. ColdFusion과 Access를 사용해서 NT 박스에서 개발한 다음에 단순히 적절한 ODBC 드라이버로 변경함으로써 멀티 프로세서 Solaris 박스에 배치할 수 있다.Perl, JDBC, 그외 위에 언급한 도구들은 모두 위와 같다.
단, 주의할 점은 여러분이 작성한 SQL 문장이 적절하게 크로스 플랫폼으로 만들 수 있도록 해야한다는 것이다. 즉, DBMS 고유의 확장이나 구조, 비정규적인 복잡한 중첩등을 갖고 있지 않아야 한다는 것이다. 대부분의 경우에 그러한 제약은 여러분에게 거의 제한이 되지 못할 것이다.
AboutSQL에 대하여
SQL이 쵸콜릿으로 덮인 익스프레소 콩이나 H2Joe이후로 가장 좋은 것이라고 확신하면 좋겠다.(역자주 : H2Joe는 H2O를 빚댄 필자의 농담이다. 필자 John의 애칭은 Joe이다. 인간이 산소(H2O)를 발견한 것처럼 필자(H2JOE)를 발견한 이후로 SQL이 가장 좋은 발견이었으면 좋겠다는 농담이다. 곳곳에 농담과 비유가 많아서 번역하기 힘들어서 역자는 죽겠다. -_-) 이 컬럼은 여러분이 SQL을 배우고, 개발 시간과 노력을 줄이는데 중점을 둘 것이다. 주간 단위로 SQL 키워드, 함수, 트릭, 고도의 팁에 대한 정보를 갖고서 이 컬럼에서 여러분을 만나게 될 것이다. 그때까지, 질문이나 문의사항이 있으면 john@ashenfelter.com으로 보내주기 바란다.
TAG :