프로그램을 오래 짜 왔지만, 주로 시스템 베이스의 프로그램만 만들어 왔습니다. Windows 나 unix 시스템 계열의 코딩만 하다보니, c/c++ 에 너무 익숙해져서 뭔가 허전하더군요. 요즘 대세인 web programming 도 못하고, 그러던 차에 몇년전 부터 후배의 꼬임에 넘어가서 emacs 라는 툴을 다루기 시작하면서 lisp 에 관한 관심이 가더군요. 무지하게 매력적인 lisp 이란 언어에 푹 빠졌습니다.

뭐 사업하면서 코딩을 하고 있을 수는 없고 해서, emacs 라는 툴만 간간히 다루고 마음속에만 담아두고 있었는데, 요즘 회사 일손이 부족하여 저도 본격적으로 코딩을 다시 시작하게 됐습니다. 3년만에 다시 잡는 코딩이라 많이 생소한 느낌에 또 새로운 분야(아이폰 앱스 개발)라 진행도가 느린데 일과는 별도의 간단한 어플리케이션을 짤 일이 생겼습니다. 그래서 다시 lisp 을 찾아보게 됐습니다.

서두가 길었는데요, 리습은 emacs lisp 과 common lisp 그리고 수많은 방계 언어들이 많습니다. emacs lisp 은 익혀두면 모든것이 emacs 안에서 이루어지는 프로그램을 짤 수 있는데요, 유연함은 아무래도 common lisp 에 비해서 떨어집니다. common lisp 은 개발하기 위한 환경만 떨렁 갖춰두고 있었는데요,(slime + sbcl) 개발 환경만 가지고는 뭔가 만들었다는 기분이 들지가 않더군요.

개발하고 있는 것과는 별도로 데이타베이스의 사용자 테이블에 누가 있는지 궁금해서 서버팀에게 종종 물어봤는데, 일 방해하는것 같아서 직접 sql 모드로 들어가서 알아보다가, 반복적인 작업을 계속 하는 것 같아서 결국 프로그램을 짜기로 했습니다.

함수는 2개 입니다. 접속하는 함수 한개, 쿼리 날리는 함수 한개입니다. 이것을 패키징 해보겠습니다.

* db_user.lisp *

(in-package :db_user)
(require 'clsql)

(defun connect-our-db ()
 ....
))

(defun search-person (name)
...
)


뭐 이런식입니다. 함수형 언어니 함수 몇개를 만들면 되겠지요. (더 복잡한 것은 아직 모름..)

package 로 만들기 위해서는 2가지 파일이 더 필요합니다. 관련 파일들의 정보인 package.lisp 파일과 이것들을 묶어서 사용하게 해줄 asdf 파일인 db_user.asd 파일입니다. 그것들을 살펴보기로 하지요.

* package.lisp *

(in-package :cl-user)
(defpackage :db_user (:use :cl :clsql)
            (:export :connect-our-db
                     :search-person))


package 선언 부분이 들어 있는데요. db_user.lisp 에서 선언한 :db_user 를 선언하고 있지요. 거기에 db_user 에서 사용하는 다른 패키지에 관한 정보도 표현되어 있습니다. (예를 들면 clsql  같은 정보) 그리고 외부에서 불러서 써야할 함수들을 export 정보를 통해서 표현하고 있습니다.

* db_user.asd *

(defpackage :db_user (:use :asdf :cl))
(in-package :db_user)

(defsystem db_user
  :name "db_user"
  :depends-on ("clsql")
  :components ((:file "package")
               (:file "db_user" :depends-on ("package")))
  )


거의 비슷하고요. 다만 package.lisp 에서 써줬던 clsql 을 여기서 종속 관계로 명시해줘야 한다는 것입니다.
:depends-on("clsql") <-- 이부분
:components 부분은 연결된 파일을 차례로 써줘가는 것입니다. 처음에 package.lisp 이고, 그것과 연관된 세부 파일들을 세세하게 적어주는 것이지요.

여기 까지 만들어 줬으면 , 이 세개의 파일을 담고 있는 디렉토리를 *central-registry* 에 넣어두고 slime prompt 에서 (sbcl 인 경우)

(require 'db_user)


하면 패키지 로드되고

(db_user:connect-our-db) (db_user:search-person "crazia")


이런식으로 함수를 쓸 수가 있습니다.

다른 훌륭한 패키지들도 이런식으로 하나 하나 추가해 나가는 방식입니다.


+ Recent posts