[Weblocks] (Action-link) 링크 연결하기

Weblocks 는 리습으로 된 프레임 워크 입니다. 멋지고 편리한 개념으로 무장하고 있지만 리습이라는 언어 자체가 가지는 비 인기성으로 널리 퍼지지는 않았습니다.

그래도 몇가지 편리한 기능들이 있어서 주목하고 있는데, 그중에 대표적인 기능이 Widget 개념입니다. 모든 웹 컴포넌트를 widget 으로 만들고 그 widget을 엮어서 웹 페이지를 만들게 하는 것이지요.

자세한 매뉴얼이나 공식적인 튜토리얼등 형식을 취하는 것이 몇개는 있지만, 전반적으로 문서가 많이 부족합니다. 게다가 lisp 자체에 대한 이해도가 필요합니다. (CLOS 같은 것에 대한 지식)

더구나 저는 Web 도 잘 모르는 판국이라 여러가지로 배우기가 힘들지만 한개씩 한개씩 정복해 나가는 재미가 있습니다.

설치하고 웹 프로젝트 만들고 이런 것들은 http://trac.common-lisp.net/cl-weblocks/wiki/UserManual 에 잘 나타나 있습니다. (물론 영어입니다.)

딱히 그런부분은 어렵지 않습니다. 그러면 그 와중에 제일 중요하다고 볼 수 있는 PAGE 끼리 연결 시키는 link 만드는 법에 대해서 알아보겠습니다.

링크를 클릭하면 보통 동작이 발생합니다. (페이지로 이동하거나 글을 포스팅 하거나 등등) 그런 모든 동작을 통칭해서 weblocks 에서는 action-link 라고 합니다. 그 action-link 에 관한 간단한 예를 보기로 하지요.

temp-cloud 라는 이름으로 project 를 생성했습니다. 생성하는 방법은 위에 링크되어 있는 UserManual 하단에 보면 "Creating a New Project" 에 잘 설명되어 있습니다.

만든상태에서 temp-cloud/src/init-session.lisp 파일을 열어 봅니다.

(defun init-user-session (comp)
  (setf (composite-widgets comp)
        (make-test-page)))

라는식으로 바꿔줍니다. 이상태에서 make-test-page 함수를 작성해 줍니다.

(defun make-test-page ()
  (make-instance 'composite
                 :widgets
                 (list (lambda ()
                         (with-html
                           (:p :id "message" "야호!")
                           (:p :id "message2" "호야!")
                           )))))


조금 설명을 하자면 init-user-session 함수는 root widget 을 설정해주는 일을 합니다. (weblocks 는 웹페이지에 보이는 모든것을 widget 으로 표현합니다. html 마크업 , 동작하는 함수, 상태를 담고 있는 변수들도 전부 widget 으로 표현합니다. 이런 widget 들은 tree 형태로 구성되어 있는데 그중 최상단 root widget 을 init-user-session 에서 설정해 주는 것입니다) root widget 으로 make-test-page 함수를 쓴다고 설정해 주는 것입니다.

make-test-page 는 composite widget 을 만드는 방법이 들어 있는 함수입니다. 'composite 이라는 객체를 만들고 그안에 속해있는 widget 으로 list 함수를 이용해서 widget 들을 엮어서 지정해 줍니다. lambda 함수 뒤에 나열된 기능들이 html 을 실제로 보여주는 부분입니다.

단순히 여기까지 하고 (C-cC-c : 함수 단위 컴파일, C-cC-k: 파일 단위 컴파일) 컴파일을 해주고 화면에 보이는 부분에서 Reset Sessions 링크를 클릭하면 바뀐 부분으로 바껴서 웹페이지가 출력됩니다.

서론이 길었습니다. 이제 바로 Action-link 를 연결하는 부분을 보기로 하지요. 함수 한개를 추가해 줍니다.

(defun make-anim-page ()
  (make-instance 'composite
                 :widgets
                 (list (lambda ()
                         (with-html
                           (:p :id "message" "이런")))
                       (lambda ()
                         (render-link (lambda (&rest args)
                                        (declare (ignore args))
                                        (do-page (make-test-page)))
                                      "Modify")))))


make-anim-page (이름은 아무 의미 없습니다) 는 html 으로 p 태그 내용 하나와 "Modify" 라는 이름으로 링크를 거는 render-link 함수를 호출하고 있습니다. "Modify" 를 클릭하면 Lambda 함수가 실행이 됩니다. 즉 (do-page(make-test-page)) 가 실행이 되는 것이지요. render-link 사용법을 눈여겨 보시기 바랍니다.

(defun init-user-session (comp)
  (setf (composite-widgets comp)
        (make-anim-page)))

이렇게 init-user-session 함수를 바꾸어 주면 깔끔하게 첫페이지에서 link 를 클릭해서 다른 페이지로 이동하는 예제를 보실 수 있습니다.