2008년 4월 29일 화요일

웹 표준 경진대회가 열렸습니다.

사용자 삽입 이미지

일전부터 관심을 두고 있었떤 대회인데 무사히 시작될 수 있어서 다행스럽네요.
CDK관계자 분들께서 꽤나 신경쓰시고, 애쓰신 모양입니다. 웹표준이 어느 한 직군만의 책임이 아니니 만큼 웹퍼블리셔분들 뿐 아니라 웹디자이너와 개발자 분들도 많은 관심을 갖고 함께 참여해 주셨으면 합니다.

자세한 정보는 CDK 웹사이트웹표준 경진대회 공식 사이트 에서 확인해 보실 수 있습니다.

다음은 자세한 대회 내용입니다.

누군가가 시켜서 만드는 웹, 누구를 위해 만드는 것인지 알 수 없었던 웹은 이제 우리 자신과 보다 많은 사람들을 위해 개선되어 나가야 합니다. 더 많은 사람들이 더 좋은 방법을 이용하여 웹 사이트를 제작하고 사용할 수 있어야 하고, 시대가 이런 점을 이미 요구하기 시작했습니다. 이제는 가르치고 배우는 과정을 넘어 더 많은 사람이 보다 손 쉽게 이용할 수 있는 웹 표준으로 나아가야 할 것입니다. '규칙과 창조의 만남'이라는 슬로건처럼 웹 표준이라는 규칙을 지킴으로써 사이트가 얼마나 창조적으로 유연하게, 얼마나 더 편리해질 수 있는지를 많은 사람들이 알 수 있게 될 것입니다.

CSS Design Korea에서 주최하고, Hosting.kr, 에이콘출판사, 디지털미디어리서치가 후원하는 이번 대회는 2008년 5 월 1일부터 약 한달간 진행되며 2008년 6월 예정인 세번째 웹 표준의 날에 그 대미를 볼 수 있게 됩니다. 우리가 원하는, 모두를 위한 웹을 만들어가려는 이번 행사에 많은 분들의 참여를 기대합니다.

참가자격
개인 혹은 3인 이내로 구성된 팀
참가방법
제시된 콘텐츠(인터넷 웹 콘텐츠 접근성 지침)를 웹 페이지로 작성하여 소정의 페이지를 통해 접수

1. 주어진 내용 전체를 사이트의 콘텐츠로 활용해야 합니다.
2. 사이트의 형식은 자유롭게 작성할 수 있습니다. (일반적인 정보 제공 형태의 사이트, 블로그 등)
3. 최소한 1개 이상의 메뉴 형식이 포함되어야 합니다.
4. HTML, CSS, Javascript와 이미지 파일만 허용되며 각각의 고유 확장자를 사용해야 합니다. (.html, .css, .js, jpg, .gif, .png 등)
5. 최종 작업물은 로컬에서 열었을 때 정상 동작할 수 있도록 작성되어야 합니다.
6. 최종 작업물과 스크린샷을 압축하여 참가 신청서에 첨부해야 합니다.
평가방법
100점기준
Markup(35) / CSS(30) / 디자인(20) / 기타(15)
시상내역
대상(1팀) : iPod Touch 8Gb + Hosting.co.kr(도메인/호스팅 3년 이용권)
금상(1팀) : iPod Touch 8Gb + Hosting.co.kr(도메인/호스팅 1년 이용권)
은상(2팀) : 웹 표준 완전정복 세트
동상(5팀) : 웹 표준의 교과서

* 입상팀을 제외한 참가자 전원에게 Web Standards day 컵(소량으로 참가 신청순에 의하여 지급 될 수 있습니다. )과 Hosting.co.kr(웹 호스팅 1년 이용권) 지급

출품기간
2008.5.01~6.01
결과발표
2008.6.15 (입상시 개별 통보)

DTD 어떻게 읽는지 아세요?

웹표준과 관련된 글들을 올리면서 가장 많이 언급하는 것이 HTML 문서의 DTD이다. 기본적으로 HTML에는 3.2, 4.0, 4.01이 나와 있고, XHTML 1.0과 1.1이 발표되었다. 그런데 HTML 4.01이라고 다 같은 HTML 4.01이 아니고, XHTML 1.0이라고 해서 똑같은 XHTML 1.0이 아니라는데 애로가 있다. 각 버전에는 문법에 대한 엄격성에 따른 DTD가 존재하는데 다음과 같다.

more..


현재 가장 많이 사용되고 있다고 볼 수 있는 DTD를 열거했는데, 크게 보면 HTML 4.01과 XHTML 1.0에 가장 엄격한 문법 준수를 요구하는 Strict, 하위 버전과의 호환성을 보장해주는 Transitional, 프레임셋을 위한 Frameset 타입 세가지로 구성되어 있다. XHTML 1.1에 와서는 의미적으로 Strict 타입만을 지원하며 표기는 위와 같이 한다. 아울러 가까운 미래에 나오게 될 HTML 5 에서는 단순히 <!DOCTYPE html> 라고만 정의하면 그만이게 된다.

DTD는 HTML 문서가 어떠한 구조로 작성되어야 하는지를 명시적으로 정의하는 스펙으로 표준화된 방법을 제안하고 있다. 따라서 우리가 위의 7가지 DTD중 하나를 선택해서 HTML 문서를 작성했다면 해당 DTD가 명시하고 있는 문법 규칙을 올바르게 따라야 오류가 없는 무결한 HTML 문서를 만들수 있게 된다. HTML 문법과 관련된 웹사이트 강좌나 서적이 이미 많이 나와 있고, 완성된 HTML 문서의 유효성 검증(Validation)을 실시해 주는 서비스도 여럿 존재기 때문에 작업에 어려움은 없지만 기왕에 HTML을 다루는 직업을 가졌다면 자신이 사용하는 DTD의 내용을 읽고 이해할 수는 있어야 하지 않을까 하는 생각이 든다. (많은 사람들이 위 DTD를 입맛 따라 골라서 복사해서 붙여놓고 쓸 줄만 알지 어떤 내용인지는 신경쓰지 않는것 같다) 그래서 이 글은 DTD를 읽고 이해하는 방법을 설명하고자 한다.

W3C HTML 4.01 Specification3.3 How to read the HTML DTD 에서 HTML DTD를 어떻게 읽을 것인지를 간단히 설명하고 있다.

사용자 삽입 이미지

  1. 주석(Comment)
    주석은 한 줄 또는 여러 줄이 될 수 있고, 선언문 내에서 연속된 하이픈(-) 두개를 주석내용의 앞과 뒤에 위치시켜서 쓸 수 있다.
    ※ XHTML DTD는 선언부 내 하이픈(-) 주석을 사용하고 있지 않다.

  2. 파라메터 엔티티(Parameter Entity)
    어려운 용어로 정의되어 있는데 파라메터는 매개변수를 말하고, 엔티티는 대체문자를 말한다. 간단히 설명하면 미리 정의된 변수를 대체문자로써 사용하겠다라는 뜻이다. 다시 말해 %attrs;이라는 엔티티에는 이미 style, class, alt, title과 같이 거의 모든 엘리먼트에 포함되는 속성명들을 정의해 놓고 있어서 이후에 정의하는 엘리먼트에서는 단순히 %attrs;이라고만 정의하면 된다라는 의미다. 프로그래밍을 해보신 분이라면 쉽게 이해하실수 있을것 같다. x라는 변수에 숫자 '3'을 미리 기억시켜 놓고, y = x + 2 라는 프로그래밍을 하게 되면 y의 값은 미리 기억된 x의 값 '3'을 불러와 합산을 해서 '5'라는 결과를 보여주는 것과 같다.

  3. 엘리먼트(Element)
    엘리먼트는 이름과 태그, 컨텐츠 모델(Content Model)로 구성되어 있다. 엘리먼트 이름은 HTML 문서에서 실제로 사용되는 태그의 명칭이 되고, 두번째 나오는 '- O'은 시작태그와 종료태그의 형태를 기술한 것이다. 하이픈(-)일 경우에 태그는 사용되어야 하고, 'O(Omitted)'일 경우에는 생략이 가능하다. 위의 경우에는 시작태그는 필요하고, 종료태그는 생략할 수 있다고 기술한 것이다. 세번째 컨텐츠 모델은 어떤 내용을 갖을 것인가? 하는 것을 기술한다. 위에서는 파라메터 엔티티로 정의된 %inline;과 %flow;가 DT 엘리먼트와 DD 엘리먼트에 각각 기술되어 있고, 괄혹 속에 들어가 있는 것을 볼 수 있다. 또, 애스테리스크(*, 별표)가 붙어 있는 것을 볼 수 있다. 좀 더 쉬운 예를 보자.

    <!ELEMENT DL - - (DT | DD)+>

    DL 엘리먼트를 정의한 것인데 괄호안에 'DT'와 'DD'가 있고, 플러스(+)표시가 붙어 있다. 당연히 알고 있겠지만 DL 엘리먼트에는 DT 요소와 DD 요소를 자식요소로 가질 수 있고,  한 번 이상 쓰일 수 있는데 그것을 위와 같이 기술한 것이다. 정의된 엘리먼트의 괄호는 내용의 그룹이 되며, 산술 기호는 등장 횟수가 된다. 다음과 같은 기호들이 사용된다.

    ( ... ) : 그룹 제한
    A : 오직 A 하나만 나타날 경우
    A+ : A 가 무조건 한 번 이상 나타나는 경우
    A? : A 가 생략되거나 한 번 나타나는 경우
    A* : A 가 생략되거나 한 번 이상 나타나는 경우
    +(A) : A 를 포함할 수 있는 경우
    -(A) : A 를 포함할 수 없는 경우
    A | B : A 또는 B, 둘 다는 아닐 경우
    A , B : A 와 B가 순서대로 나타나는 경우
    A & B : A 와 B가 순서없이 모두 나타나는 경우


    IMG 요소나 BR 요소와 같이 내용을 포함하지 않는 요소의 경우에는 'EMPTY'라고 정의하고, 문자열 이외의 자식 요소를 포함하지 않는 경우(OPTION 요소)에는 '(#PCDATA)'와 같이 정의한다. 또한, A 엘리먼트와 같이 자식요소에 자신을 포함하지 못하는 경우는

    <!ELEMENT A - - (%inline;)* -(A)>

    와 같이 정의한다.

  4. 애트리뷰트(Attribute)
    애트리뷰트를 설명하기 위해서 IMG 요소의 정의 부분을 보겠다.
    <!ATTLIST IMG
      %attrs;                              -- %coreattrs, %i18n, %events --
      src         %URI;          #REQUIRED -- URI of image to embed --
      alt         %Text;         #REQUIRED -- short description --
      longdesc    %URI;          #IMPLIED  -- link to long description
                                              (complements alt) --
      name        CDATA          #IMPLIED  -- name of image for scripting --
      height      %Length;       #IMPLIED  -- override height --
      width       %Length;       #IMPLIED  -- override width --
      usemap      %URI;          #IMPLIED  -- use client-side image map --
      ismap       (ismap)        #IMPLIED  -- use server-side image map --
      >

    애트리뷰트의 이름과 타입, 디폴트 값을 정의한 것을 볼 수 있다. src 애트리뷰트와 longdesc 애트리뷰트는 미리 정의된 URI 타입으로 되어 있고, alt 애트리뷰트 역시 Text 엔티티로 되어 있음을 볼 수 있다. 애트리뷰트에서 중요한 것은 디폴트 값으로 지정되는 네가지 값인데 다음과 같다.

    #REQUIRED : 반드시 정의해야 하는 애트리뷰트이다.
    #IMPLIED : 디폴드 값을 사용도구(웹 브라우저 등)가 지정하며, 경우에 따라 부모 엘리먼트로부터 상속 받는다. 반드시 정의하지 않아도 된다.
    #FIXED : 값이 일정하여 변경이 없는 애트리뷰트이다. HTML 4.01 의 경우에는 없으나 XHTML의 경우에는 xmlns 애트리뷰트와 xml:space 애트리뷰트가 'http://www.w3.org/1999/xhtml' 값으로 #FIXED 되어 있다.

    애트리뷰트 가운데에는 '참'과 '거짓'의 형태로 구분되는 불린(Boolean) 애트리뷰트가 존재하는데 'selected' ,'checked' 와 같은 것들이다.

    <!ATTLIST option
      %attrs;
      selected    (selected)     #IMPLIED
      disabled    (disabled)     #IMPLIED
      label       %Text;         #IMPLIED
      value       CDATA          #IMPLIED
      >


    위와 같이 이러한 불린 애트리뷰트는 자신의 이름을 값으로 가질 수 있도록 정의되어 있다. HTML 4.01에서는 불린 애트리뷰트의 약술을 허용하고 있기는 하지만 XHTML 에서는 옮은 표현이 아니기 때문에 가급적 사용하지 않은 것을 추천한다.

나는 예전에 DL 요소의 자식요소인 DT와 DD가 순서대로 나와야 하는가? 에 대한 의문을 가진 적이 있었다. 의미적으로 DT 요소가 나온 후 DD 요소가 나타나는 것이 맞겠지만 실제로는 둘을 바꿔도 오류를 내지 않았기 때문이었고, 레이아웃을 잡기 위해서 임의적으로 포지셔닝을 하다보니 DT 요소와 DD 요소를 서로 바꾸는 것이 더 편할 때가 있었다. 그런데 잘 기억이 나지는 않지만 어떤 서적인가 사이트에서 DT 요소와 DD 요소는 순서대로 나타나야 한다고 되어 있었던 것을 본 적이 있어 혼자 고민했던 적이 있었다. 그리고는 우연히 해당 DTD 문서를 열어보게 되었는데 다음과 같다.

HTML 4.01 : <!ELEMENT DL - - (DT|DD)+ -- definition list -->

XHTML 1.0 : <!ELEMENT dl (dt|dd)+>

위에서 설명했던 내용을 토대로 이해를 해보자. DL 이라는 이름으로 엘리먼트가 정의 되었고, 시작태그와 종료태그를 모두 가져야 하며, DT 요소 또는 DD 요소가 순서에 상관 없이 한 번 이상 나타날 수 있다고 되어 있다. 순서는 문제가 되지 않았다는 것이다.

이렇게 DTD는 불확실한 정보에 대한 확신을 심어줄 수 있는 최고의 레퍼런스이다. 온전하게는 아닐지라도 대략적으로 DTD를 읽고 이해할 수 있는 능력을 키운다면 새로운 마크업 언어를 익히는 일이 두렵지만은 않을 수 있지 않을까- 그런 생각을 끝으로 DTD를 읽는 방법을 정리해 보았다.


덧붙임.

정찬명님께서 제 글을 보신 후 보다 더 자세하고 친절하게 'HTML DTD 읽기' 방법을 정리해 주셨습니다. 꼭 읽어보시길 바라겠습니다.

2008년 4월 28일 월요일

반쪽짜리 웹표준, 눈가리고 어흥 하지 마세요

겨미겨미님의 미투글을 보고 국립국어원의 웹사이트를 방문하게 되었습니다. 접속하자마자 눈에 띄는 것이 우측 상단에 위치한 음성켜기 기능과 화면 확대/축소 기능이었습니다. 이것만 봐도 이 사이트가 시청각 장애인들을 위한 웹접근성을 고려했구나함을 알 수 있었습니다. 하지만 그런 기대는 수초가 채 지나기도 전에 무너지고 맙니다. 

사용자 삽입 이미지

음성지원 기능과 화면 확대/축소기능을 지원한다

국립국어원 웹사이트는 시청각 장애인을 위해서 음성지원 기능과 화면 확대/축소 기능을 제공하고 있습니다. 하지만 음성지원을 위해서는 별도의 플러그인을 설치해야 했고, Active-X 로 설치가 되기 때문에 비 윈도우(운영체제) 사용자는 활용할 수 없습니다. 이미 사용자가 스크린리더를 사용하고 있다면 음성이 두번씩 출력되는 문제가 생길수도 있겠습니다. 다행히 이에 대해서는 음성끄기 기능을 지원하고 있습니다. 특별히 아쉬운 점은 '드림보이스'나 '센스리더'와 같은 별도의 스크린리더 제품이 아닌 사이트 자체적으로 지원하는 프로그램임에도 불구하고 게시글등 웹 문서내 텍스트는 읽어주지 않는다는 점입니다. 단순히 링크 정보만 읽어주는 음성지원이라면 시각장애인이 소리를 지를수 없는 안내견을 끌고 다니는 것과 무엇이 다를까 하는 생각이 들었습니다.

또한, 화면 확대/축소 기능은 처음부터 IE용으로 제작되어서 인지 Firefox에서의 활용을 막고 있습니다. Firefox에서는 브라우저 내의 텍스트 확대/축소 기능을 사용할 수도 있지만 대부분의 사용자들이 브라우저의 이러한 기능을 잘 알지 못하고 있고, 기왕에 사이트 내에 확대/축소 기능을 구현했다면 모든 브라우저에서 사용할 수 있게 했다면 좀 더 나은 웹접근성과 사용성을 제공할 수 있었지 않나 하는 아쉬움이 드는 부분입니다.

사용자 삽입 이미지

네이버의 텍스트 확대/축소 기능은 Firefox에서도 제대로 지원된다


더군다나 CSS를 걷어내었을 때 화면은 아래와 같습니다. 헤드라인 제목부터 컨텐츠와, 바닥글 내용까지 다소 논리적이지 못하고, 선형적이지 못한 구성을 가지고 있습니다. 접근성을 제대로 살렸다고 보기 힘든 대목입니다.

사용자 삽입 이미지

마크업의 구조가 논리적으로 선형적이지 못하다.

하단의 '문화부 및 소속기관'의 풀다운메뉴는 과거의 방식대로 마우스 선택으로 옵션창을 열고, 선택과 동시에 사이트를 떠나는 방식을 택하고 있어 키보드를 사용하는 장애인과 일반인들을 위한 접근성 문제를 해결하지 못하고 있기도 합니다.

사용자 삽입 이미지

풀다운메뉴 옆에 [Go] 버튼을 누어 키보드에 대한 접근성을 살린 예

기획단계에서 어느정도 웹접근성에 대한 인식이 있었고 그로 인해 모범이 될만한 기능들을 추가했음에도 웹표준을 따르지 않은 마크업과 개발은 결국 반쪽짜리 사이트를 만들어 버린 예가 될 것 같습니다. 한국어에 대한 훌륭한 컨텐츠를 가지고 있는 이 사이트가 다음 리뉴얼때에는 보다 완벽하게 웹표준을 따라서 웹접근성을 보다 높게 지원하는 사이트가 되기를 희망해 봅니다.

2008년 4월 26일 토요일

테이블(Table Element)의 과거와 현재

웹표준이라는 커다란 화두가 던져 졌을때 많은 사람들이 Table 요소를 버리고, Div 요소를 사용할 것을 강조했습니다. 아직도 여러 커뮤니티 게시판의 예전 게시물을 살펴보면 그러한 흔적들을 살펴볼 수 있는데 다행스럽게도 지금은 그러한 논란의 소용돌이 속에서 Table 요소와 Div 요소를 분리하여 오해가 없이 사용하는 단계까지는 오게 된것 같습니다. Div 요소는 Table 요소가 레이아웃으로 오용되는 것을 확실히 대체해 가고 있고, Table 요소는 제자리를 찾아 데이터를 담는 표로써 올바르게 사용되기 시작한 것입니다. 그렇게 이 글에서는 Table 요소가 가진 진실과 오해를 풀어보고자 합니다.


* 가독성을 위해 요소(Element)의 첫 글자는 대문자로 표기하였고, 속성(Attribute)은 소문자로 표기했습니다.


1. Table for Layout

Table 요소와 관련된 가장 큰 이슈였습니다. 표준화 작업을 시작하면서 레이아웃을 위해 사용된 Table 요소를 포기시키는 일종의 운동(?) 내지는 유행이 번졌는데 우리들 스스로 Table 요소를 금지(descendant)해 버리는 실수를 범하기도 했습니다.

레이아웃(Layout)은 우리말로 배치 또는 판짜기 등의 의미를 가집니다. 집을 생각해 봅시다. 터를 닦고, 골격을 세운 뒤 방과 거실, 화장실과 테라스를 구분지어 짓습니다. 그리고 각종 가구를 들입니다. 침대와 옷장은 안방 벽면에 두고, 컴퓨터와 책장은 서재에 두고, TV와 쇼파는 거실에 두는 등 가구와 물건을 적당한 위치에 배치시킵니다. 여기서 가구와 물건은 요소(Element)가 될 것이고, 가구를 담은 집은 Table 요소가 될 것입니다. 집을 세운 땅은 브라우저와 운영체제가 되겠네요. 아마도 이것이 우리가 그동안 생각해 왔던 레이아웃이었을 것입니다. 그런 의미에서 Table 요소는 너무나 적절했습니다. Table 요소는 우리에게 틀어지지 않는 레이아웃을 제공하였고, 어떤 내용(요소)이든 자유자재로 담아낼 수 있다고 생각했습니다. 아마도 CSS가 만들어지지 않았다면 이러한 우리의 사고는 변함없었을 것이고, Table 요소는 최고의 설계도구가 되어 주었을 것입니다.

그런데 시간이 지나자 사람들은 거실을 넓히고, 테라스를 확장하기를 바랬습니다. 오래된 집을 리모델링 하기를 원하기 시작했습니다. TV와 세탁기, 냉장고는 점차로 커졌고, 새로 홈시어터를 들여놔야 했습니다. 하지만 우리의 집은 너무나 견고해서 벽을 허물고, 새로 설계를 하고 리모델링을 하기에는 너무나 많은 비용이 들었고, 시간과 인력이 낭비되는 일이었습니다. 아버지는 아내와 아들, 딸을 모아놓고 가족회의를 해야 했고, 아파트의 주민들은 투표를 해야 했습니다. 그리고 구청과 시청의 허락을 받아야 했습니다. 집을 본따 만든 수 많은 웹사이트들 역시 똑같은 시련을 겪는 순간이 왔습니다. 한번 만든 웹사이트는 디자인을 변경하기가 너무나 어려웠습니다. 결국 그들은 모든걸 허물고 새로 만들어야 했습니다.

이 문제를 풀기 위해서 우리는 홈페이지(Homepage)에 대한 고정관념부터 버려야 할 것 같습니다. 우리는 인터넷에 집(Home)을 짓는 것이 아니라, 정보(Content)를 설계(Design)하고, 제공(출판, Publishing)하는 공간(Site)을 만드는 것이라고 말입니다. 내용을 잘 담아내고, 어떻게 표현해서 보여줄 것인지를 고민해야 합니다. 여기서 우리는 내용과 표현의 분리를 생각합니다. 이는 CSS(Cascading Style Sheet)가 해결해 줄 수 있습니다.

CSS는 HTML과 XHTML, XML 등 마크업 언어를 어떻게 표시할 것인가? 하는 문제를 해결하기 위해 W3C에서 1996년에 발표한 언어입니다. Table for Layout에서도 이미 CSS는 사용되고 있었지만 대부분 글꼴과 링크를 다루는 정도로만 사용되었습니다. 그것 역시 HTML문서 내에 직접 작성되는 방식이 대부분이었습니다. 하지만 CSS 2.1 이후 우리는 거의 모든 요소에 대해서 표현을 독립적으로 처리할 수 있는 기술을 가지게 되었습니다. 현실공간에서 불가능하게 여겼던 배치가 웹에서는 CSS를 통해서 가능하게 되었습니다. 둘 이상의 요소를 얼마든지 하나의 영역안에 포함시키거나 겹쳐 보이게 할 수 있고, 숨기거나 보이게도 할 수 있습니다. 논리적으로 서술된 내용(CSS를 걷어 내었을 경우 내용이 선형적으로 제공되는 내용)를 고치지 않고도 사용자에게 다양한 표현양식으로 보여줄 수 있게 되었습니다.

우리는 여기서 Table for Layout의 대체자로서 Div 요소가 설명되지 않은 배경을 이해해야 합니다. Div 요소는 내용(Content)을 논리적으로 그루핑(Grouping)하는 요소입니다. 머릿글 영역과 본문, 바닥글을 구분짓고, 개별적인 섹션을 나누는 역활을 해 줍니다. 여기서 다시 Div 요소가 단순히 레이아웃을 위한(Div for Layout) 요소가 아님을 이해해야 합니다. Img 요소와 p 요소를 직접 배치할 수도 있고, Ul 요소와 Dl 요소를 가지고 표를 만들어 낼 수도 있습니다. 거의 모든 요소가 레이아웃을 가질 수 있습입니다. 단지 Table 요소가 '표'로써가 아닌 레이아웃을 만드는 목적으로 잘못 사용되었기 때문에 지양하는 것이며, Div 요소가 내용을 논리적으로 그루핑한다고 볼 때 레이아웃을 만드는 대체자로써 가장 적합하다고 판단되기 때문에 권장되는 것입니다. HTML 5나 XHTML 2 등 새롭게 준비되고 있는 마크업 언어에서는 또 다른 요소를 통해서 레이아웃을 설계할지도 모릅니다. 다시 말하지만 레이아웃은 요소가 아니라 CSS가 만들어 내는 것입니다.

우리는 위에서 HTML문서의 내용과 표현의 분리를 이야기 했고, 표현을 위한 도구로 CSS를 이야기 했습니다. 그리고 HTML을 순수하게 내용을 담아내는 도구로써 이해해야 함을 강조합니다. 논리적으로 잘 작성된 HTML문서는 CSS에 의해서 자유로운 레이아웃을 가질 수 있습니다. Table 요소나 Div 요소와 같이 어느 특정 요소 하나에 의해서 레이아웃이 결정된다면 우리는 여전히 경직되고, 멍청한 웹사이트를 만드는 일을 계속 하게 되는 것입니다.

* 'Table for Layout'이라는 표현은 정찬명씨의 글 '웹 표준 코딩의 장점. Table for Layout 과 CSS Layout의 비교 실험'에서 가져왔습니다.


2. Table 요소를 표로써 활용하자

위에서 Table 요소가 레이아웃을 위한 요소로써 적당하지 않음을 설명했습니다. 그럼  Table 요소를 어떻게 써야 잘 썼다고 소문이 날 수 있는지를 알아보겠습니다. W3C의 HTML 4.01 권고안을 살펴보면

The HTML table model allows authors to arrange data -- text, preformatted text, images, links, forms, form fields, other tables, etc. -- into rows and columns of cells.

라고 되어 있는데 저작자들(Authors)에게 데이터를 줄(rows)과 컬럼(columns)의 셀(cells)에 텍스트와 양식화된 텍스트, 이미지 등을 넣을 수 있는 것이라고 합니다. Table 요소를 데이터가 있는 표로써 활용하라는 것인데 성적표와 가계부, 각종 통계 자료를 담은 표 등이 적절한 예가 될 것입니다.

표는 열(column)과 행(row) 그리고 셀(cell)로 이루어져 있습니다. 개인적으로 열과 행을 자주 헷갈리곤 하는데 열을 분단(교실에서 1,2,3,4 분단으로 나누었던 것)으로 생각하고, 행을 줄로, 셀은 각각의 책상으로 생각하면 쉽습니다. 그리고 표와 각 셀에는 각자의 선(Border)이 있습니다. 표의 선은 교실 자체로 생각하고, 셀의 선은 바닥에 그어진 선(보통 바닥의 네모난 선 안에 책상 하나가 들어가죠)으로 연상하면 좋을것 같습니다. 여기에 Table 요소는 Caption 요소와 Thead 요소,  Tbody 요소, Tfoot 요소를 가지는데 Caption  요소는 교실의 팻말이라고 생각하시면 됩니다. 3-2반 이렇게 말이죠. 그리고 Tbody 요소는 책상 전체를 묶어놓은 단위로 생각하시면 됩니다. Thead 요소와 tfoot 요소는 표의 정보를 담고 있는 영역이라고 생각하시면 됩니다. 다음은  Table 요소에서 사용되는 요소입니다.

  • Table 요소 : Table을 정의
  • Caption 요소 : 표의 제목 정의
  • Thead 요소 , Tbody 요소, Tfoot 요소 : 행 그루핑 요소
  • Tr 요소 : 행을 정의
  • Td 요소 : 데이터 셀을 정의
  • Th 요소 : 제목 셀을 정의
  • Colgroup 요소 / Col 요소 : 열 그루핑 요소

하나의 예를 들어보겠습니다. K리그 2라운드에 수원 블루윙즈와 성남 일화가 경기를 갖게 되어 선발 출전 명단을 다음과 같이 공개했습니다.


수원 블루윙즈 VS 성남 일화 출전 선수 명단

포지션 배번 선수명 출전 득점 도움 실점 파울 경고 퇴장
※ 2008 삼성 하우젠 K리그 2라운드
수원 블루윙즈 GK 1 이운재 1 0 0 0 0 0 0
DF 2 마토 1 0 0 0 4 0 0
DF 29 곽희주 1 0 0 0 2 0 0
DF 14 이정수 1 0 0 0 1 0 0
DF 3 양상민 1 0 0 0 2 1 0
MF 6 조원희 1 0 0 0 3 1 0
MF 8 송종국 0 0 0 0 0 0 0
MF 5 박현범 0 0 0 0 0 0 0
FW 13 이관우 1 0 0 0 1 0 0
FW 9 에두 1 2 0 0 2 1 0
FW 27 서동현 0 0 0 0 0 0 0
성남 일화 GK 30 정성룡 1 0 0 1 0 0 0
DF 14 김상식 1 0 0 0 0 0 0
DF 5 조병국 1 0 0 0 2 0 0
DF 2 박진섭 1 0 0 0 2 0 0
DF 33 장학영 1 0 0 0 1 0 0
MF 6 손대호 1 0 0 0 4 0 0
MF 17 김철호 1 0 0 0 2 1 0
MF 10 두두 1 0 0 0 2 0 0
FW 15 한동원 1 0 0 0 1 0 0
FW 9 김동현 1 0 0 0 3 0 0
FW 11 모따 1 0 1 0 2 1 0

그리고 다음은 선수명과 득점, 경고를 시각적으로 표현하기 위한 스타일 정의입니다.

<style type="text/css">

  #tb_kleage { border-collapse: collapse; }
  .name { font-weight: bold; }
  .goal { color: blue; }
  .red_card { color: red; }
</style>

마크업을 살펴보면 Table 요소에는 summary 속성과 border 속성을 가지고 있고, Caption, Colgroup, Thead, Tfoot, Tbody 요소를 차례대로 가지고 있음을 알 수 있습니다. Table 요소내 요소 정의 순서는 Caption 요소, Colgroup / Col 요소, Thead 요소, Tfoot 요소, Tbody 요소 순인데 이는 프린터로 표를 출력했을 때 Tbody 요소 내의 컨텐츠가 길어져 두 페이지 이상으로 끊어질 때 Tfoot 요소가 페이지마다 출력될 수 있도록 하기 위함입니다. 아울러 HTML 4.01 에서는 Thead 요소와 Tfoot 요소는 종료태그의 생략이 가능하며, Tbody 요소의 경우 시작태그와 종료태그 모두 선택적으로 정의하지 않아도 됩니다.

summary 속성은 표의 요약 정보를 담아내는 것으로써 표의 제목과 각 열의 제목을 정확하고 간략하게 표기해 주는 것이 좋습니다. Caption 요소는 표의 제목을 정의하는데 사용하며 많은 브라우저에서 가운데 정렬을 기본값으로 하고 있습니다. CSS의 table-caption 속성으로 상/하,좌/우로의 배치가 가능하나 IE 에서는 지원하지 않습니다. rules 속성은 셀의 구분선 표시형식을 정의하는 것으로 행 사이의 구분선을 표시할 경우에 'rows', 열 사이에 구분선을 표시할 경우에 'cols', 그루핑 단위로 구분선을 표시할 경우에는 'groups'를 지정합니다. 이 때 그루핑의 단위는 Colgroup 요소와 Thead, Tfoot, Tbody 요소가 되며, 위와 같이 둘 이상의 Tbody 요소를 사용할 경우 Tbody 요소간에도 구분선이 표시됩니다.

border 속성의 경우 CSS를 통해서도 표현이 가능합니다. 하지만 CSS가 지원되지 않는 경우 border 속성이 없는 Table 요소는 구분선이 없는 형태의 표를 보여주게 되는데 이는 오히려 시각적인 가독성을 떨어뜨리는 문제를 갖게 됩니다. 때문에 Table 요소에 border 속성의 기본값을 1로 정의하고, CSS를 통해서 표시 방법을 재정의하는 것을 추천합니다.

Colgroup 요소는 열의 그루핑을 위한 요소로써 Col 요소를 포함할 수 있습니다. 둘 이상의 열을 그루핑 할 경우 span 속성을 통해서 갯수를 정의할 수 있습니다. Table 요소의 rule 속성에서 'groups'로 정의했다면 Colgroup 요소만큼 구분선이 표시됩니다.

Colgroup / Col 요소에서는 위와 같이 class를 지정함으로써 스타일을 공유할 수 있지만 현재 IE에서만 지원되고 있으며, Firefox와 Safari, Opera 등에서는 지원되지 않고 있습니다.

Thead 요소는 Colgroup 요소 다음으로 나오는 것으로 표의 제목 영역을 정의합니다. 제목 영역의 셀은 Th 요소로 논리적으로 제목임을 정의하며 많은 브라우저에서 가운데 정렬의 굵은체로 표시됩니다. 제목 셀에서는 특별히 abbr 속성을 통해서 표 안의 행과 열이 어떤 의미를 가지고 있는지를 간략하게 표시하는데 이용되는데 Abbr 요소가 약자의 전체 이름을 표시해주는 것과는 다릅니다. 위 예제에서도 소속명 '수원 블루윙즈'와 '성남 일화'를 각각 '수원'과 '성남'으로 약자 기술하였습니다. 이렇게 정의된 abbr 속성은 음성 장치(스크린리더)에서 '수원 블루윙즈'대신 '수원'으로 읽어주는 역활을 할 수 있습니다.

Table 요소에는 셀과 셀 사이의 관계를 설정하기 위해 scope와 headers 속성을 지원하고 있습니다. scope 속성은 Th 요소로 제목정보를 제공하는 Td 요소의 범위를 지정할 수 있는데 'col' 값은 현재 열의 모든 셀들을 의미합니다. 마찬가지로 'row' 값은 현재 행의 모든 셀들을 범위로 지정함을 의미합니다. headers 속성은 scope 속성과 달리 th 요소와 td 요소를 직접 연결하는 기능을 제공합니다. id 속성으로 정의된 th 요소를 td 요소가 headers 속성을 통해서 직접 접근할 수 있으며, 둘 이상의 th 요소를 지정할 수 있습니다. 따라서 일반적으로 규칙적이고 복잡도가 낮은 경우에는 scope 속성을 이용해서 열과 행의 범위를 지정해서 사용할 수 있고, 데이터의 위치가 불규칙하여 scope 속성으로 영역을 설정하기 곤란한 경우 headers 속성을 사용합니다.

잘 사용되지는 않지만 셀의 카테고리를 설정할 수 있는 axis 속성이 있습니다. axis 속성은 id 속성와 headers 속성으로 연결된 셀들을 카테고리화(categorizing) 할 수 있어서 사용자가 표로부터 원치 않는 정보(셀)를 제외한 보다 정확한 정보를 제공받을 수 있도록 처리하는데 도움을 줍니다.


3. Table 요소의 현재와 또 다른 이슈

간단하게 Table 요소에 대한 내용을 정리해 보았습니다. 위의 내용은 W3C의 HTML 4.01 Specification 에서 보다 상세하게 설명해 주고 있는데 실제로 프로젝트에 적용하기에는 어려움이 많은 것이 사실입니다. 

첫째로 Table 요소는 Div 요소 등 여타의 요소들에 비해서 비교적 브라우저간의 차이가 거의 없는 요소이기는 하지만 Firefox와 Safari, Opera 등 일부 브라우저에서는 여전히 Colgroup/Col 요소의 스타일 공유를 지원하지 않는 것(width 속성은 적용되지만 이 역시 값이 지정된 셀과 같은 열의 나머지 셀들이 함께 적용되었다기보다는 기준 셀의 너비 크기에 따라 강제로 적용된 것이라고 생각됨)과 IE에서 Body 요소 내 폰트 속성이 Table 요소에는 상속되지 않는 등의 문제를 가지고 있습니다.

둘째로 음성 도구(스크린리더 등)에서의 지원이 미비하여 높은 수준의 접근성을 확보하기 어렵습니다. 국내 스크린리더인 드림보이스(DreamVoice 6.21)의 경우 '곽희주'에 포커스가 위치해 있을 경우 "수원 블루윙즈 포지션 DF, 배번 29, 선수명 곽희주 ..."와 같이 읽지 않고 "DF, 29, 곽희주 ... "와 같이 마크업된 상태 그대로 읽어주고 있습니다. 또한, 논리적으로 Tfoot 요소를 마지막에 위치시켜 읽어주지 않고 Thead 요소 다음에 읽어 주는 것 또한 볼 수 있었습니다.

셋째로 현실세계에서 사용하는 복잡한 표를 HTML 문서로 그대로 재현하는데에는 어려움이 많습니다. 표가 복잡해질 수록 표 내에 표가 중첩되어 사용되거나 지나치게 많은 셀 결합(colspan, rowspan)을 하게 되는데 이는 웹접근성을 상당히 떨어뜨리는 문제가 되기도 합니다. 또한, 대중적인 디스플레이 장치인 17"/19" 모니터의 일반적인 해상도(1280*1024)에서도 표를 완벽하게 보여주기에는 부족함을 느끼는 경우가 많습니다. 더구나 핸드폰과 PDA 등 소형 디스플레이를 통한 인터넷 환경은 표의 표현이 만만치 않은 작업임을 예상케 합니다.

넷째로 시각적으로 표로 보이는 모든 컨텐츠에 대해서 Table 요소를 사용할 수 있는가? 하는 문제에 대한 고민이 생길 수 있습니다. 많은 경우 당연히 Table 요소로 작성되는 게시판의 목록은 한동안 Div 요소와 Ul 요소로도 수차례 테스트되고, 논의가 되기도 했습니다. 더불어 게시판의 보기와 쓰기 화면도 Table 요소로 가능한가에 대한 논의가 필요할 것이고, 가입 양식 등 폼 영역 역시 마찬가지일 것입니다.

다섯번째로 그림자와 같이 비주얼이 강한 표를 처리하는 문제입니다. 다음과 같이 Thead 요소가 서로 붙어(구분선의 두께가 다름) 있고, Tbody 요소와 Tfoot 요소가 시각적으로 분리되어 있으면서 그림자 효과를 포함할 경우 가변적인 표의 작성이 쉽지만은 않습니다.

이상과 같은 경우 현실세계의 표를 그대로 가져올 것이 아니라 HTML 문서에 최적화된 표를 새롭게 작성하는 것이 좋습니다. 즉, 복잡한 표를 논리적으로 분리하여 둘 이상의 표로 나누어 Table 요소의 중첩을 피하고, 셀간의 결합을 최소화 하는 것입니다. 분리된 표는 시각적 표현에 있어서도 좀 더 쉽고 유연한 방법을 찾을 수 있을 것입니다.


4. 끝맺음

Table 요소는 가장 많이, 그리고 가장 쉽게 사용하는 요소중 하나일 것입니다. 하지만 과거의 경우에 Table 요소를 'for Layout'으로 잘못 이해하여 사용하였던 것처럼 우리는 충분한 이해 없이 Table 요소를 사용해 온 것이 사실입니다. Table 요소를 표로써 제대로 사용하는 것. 쉬운 결정이지만 결코 만만치 않은 일이라고 생각합니다. 여전히 현실세계의 복잡한 표를 HTML 문서에 그대로 포함시키려 들거나, 때로는 복잡한 표를 이미지로 대체해 버리기도 합니다. 접근성을 살린 표를 마크업 하는 일이 시간과 노력이 많이 들기 때문입니다. 표는 표 자체로 많은 정보를 포함하고 있는 컨텐츠입니다. 하나의 표를 올바르게 마크업 하는 것은 웹 표준을 위한 큰 걸음 하나가 될 것입니다.

2008년 4월 21일 월요일

개발자님 제발 HTML을 깨트리지 말아주세요

이 글은 서버사이드 개발자님들께서 웹퍼블리셔로부터 받은 HTML문서를 작업하는데 있어서 최소한으로 알아주셨으면 하는 내용을 정리한 것입니다. 일부분 상세히 적지 않고(버전별 요소와 속성의 사용 유무 등) 최대한 쉽게 작성하는데 목적을 두었기 때문에 실 작업시에는 웹퍼블리셔와의 커뮤니케이션과 좀 더 정확한 스펙 문서를 참고해 주시기를 부탁드리겠습니다.

웹표준화와 관련하여 웹퍼블리셔는 정확한 Doctype 선언으로부터 마크업을 시작한다. 그리고 올바른 마크업(well-formed) 검증(validate)으로 작업을 마치게 된다. 하지만 많은 경우 사이트가 오픈했을 때 validate를 통과가 어렵다. 이는 서버사이드 개발자들이 웹퍼블리셔로부터 받은 (X)HTML 문서를 수정(개발을 입히는 작업)하면서 올바르지 않은 요소와 속성을 사용하기 때문인 경우가 많다.

서버사이드 언어인 ASP나 PHP, JSP 등은 문법오류에 대한 관용이 적기 때문에 즉각적으로 에러를 보여준다. 하지만 (X)HTML은 브라우저에 따라 관용적으로 처리되거나, 용납되는 경우가 많아 올바르지 않은 마크업을 하고도 화면이 정상적으로 보이는 경우가 많다. 하지만 이렇게 완성된 사이트는 결코 웹표준 사이트라고 볼 수 없거니와, 웹접근성 또한 보장받을 수 없게 된다.

XHTML 스펙을 살펴보면 잘못된 요소와 속성의 사용을 알 수 있지만 대부분의 경우 서버사이드 개발자들은 과거에 익혔던 HTML 문법만을 기억하고 있으며(그다마 올바르지 않은 문법) 새로운 XHTML에 대한 차이를 잘 알지 못한다.

다음은 W3C의 HTML / XHTML 스펙 문서 목록이다.

다음은 XHTML 기준으로 개발자 역시 함께 알아야 하는 내용들이다.

  • HTML 문서의 Doctype이 무엇인지 확인한다.

    HTML 4.01과 XHTML 1.0 에는 각각 'Strict(가장 엄격)', 'Transitional(전환형)', 'Frameset(프레임셋형)' 세가지 타입이 있다. XHTML 1.1은 'Strict'만을 지원하며, 표기는 XHTML 1.1로만 합니다.

    Doctype에 따라 사용 가능한 요소와 속성이 구분되며, CSS에도 영향을 미친다.

  • Doctype 선언 위에 출력되는 요소나 문자열이 없도록 한다.

    DTD는 HTML 문서의 최상단에 선언되어야 한다. 그렇지 않을 경우 일부 브라우저(IE 등)에서 비표준모드(Quirks mode)로 작동하게 된다. 일부 스타일이 제대로 적용되지 못하는 문제가 종종 발생한다.

  • XHTML일 경우 모든 요소와 속성은 소문자로 작성하며, alt와 title 속성을 제외하고 가능한 모든 속성에는 값을 넣어(대부분 넣지 않아도 에러가 나지는 않으나 alt와 title 속성을 제외하면 특별한 이유 없이 빈 값을 넣는 경우는 드믈다)준다. 또한, 모든 속성값은 반드시 인용부호로 둘러싼다.

    validate의 에러를 가장 많이 내는 주범이다.
  • XHTML일 경우 모든 요소는 반드시 닫아주어야 한다. 특히 <head>..</head>사이의 <meta> 요소 작성시 반드시 닫아주자! 또한, 요소의 위치관계를 정확하게 한다.
    <p>내용</p> , <br />, <img src="..." />, <meta ... />, <link rel=".." ... />

    (x) <a href="..."><span>링크</a></span>
    (o) <a href="..."><span>링크</span></a>

  • XHTML 1.1일 경우 <a>, <map>, <form>, <img> 요소에서 name 속성이 폐지되어 사용할 수 없다.

    id 속성만을 사용한다. 하지만 <form>내 <input> 등 요소에서는 name 속성을 사용할 수 있다.

  • MIME Type이 'application/xhtml+xml'일 경우 script와 style 요소는 '<!--'과 '-->'를 '<![CDATA['와 ']]>'로 대체한다. 단, 'text/html'일 경우는 과거처럼 주석 방식을 사용한다.

    CDATA는 script와 style 내 '<', '>', '&'와 같은 문자를 이스케이프 시키지 않고 그대로 사용할 수 있도록 한다. 또한, Doctype에 관계없이 script요소와 style요소를 </head>와 <body>사이에 삽입하는 경우는 없어야 한다. 되도록 script와 style은 외부 문서로 빼는 것이 좋다.

  • XHTML 1.1일 경우 다음의 요소들은 사용할 수 없다.

    <applet>, <basefont>, <center>, <dir>, <font>, <frame>, <frameset>, <iframe>, <isindex>, <menu>, <noframes>, <s>, <strike>, <u>

    특히 , <font>와 <center>, <iframe> 요소는 개발자들이 무분별하게 사용하는 대표 요소인데 Doctype에 따라 사용을 신중히 해야할 필요가 있다. <font>와 <center> 요소는 CSS로 정의할 수 있으며, <iframe>요소는 <object>요소로 대체된다.

  • XHTML 1.1일 경우 다음의 속성들은 사용할 수 없다. (일부 속성은 XHTML 1.0 Strict 에서도 지원되지 않기 때문에 주의 바랍니다.)

    <*> lnag
    <a> name, target
    <area> traget
    <body> background, bgcolor, text, link, vlink, alink
    <br> clear
    <caption> align
    <div> align
    <form> name, target
    <h1~h6> align
    <hr> align, noshade, size, width
    <img> align, border, hspace, vspace
    <input> align
    <legend>align
    <li> type, value
    <link> target
    <map> name
    <object> align, border, hsapce, vspace
    <ol> compact, start, type
    <p> align
    <pre> width
    <strict> language
    <table> align, bgcolor
    <td> bgcolor, height, nowrap, width
    <th> bgcolor, height, nowrap, width
    <tr> bgcolor
    <ul> compact, type

  • 가급적 요소에 직접 스타일(inline style)을 정의하지 않는다.

    <div style="...">
    단, <input>과 <img> 요소 등 개발시 변동이 잦은 요소들에 한해서 inline style로 width와 height를 지정하는 것은 괜찮다고 생각한다. 하지만 저속 인터넷 접속 환경에서는 느린 로딩으로 인해 이미지 요소들이 레이아웃을 잡지 못해 들쑥날쑥하게 전체레이아웃을 깨뜨리는 현상이 발생하기도 하므로 이에 대한 고려가 선행되어야 할 것이다.

  • 요소와 속성내 모든 문자열을 PCDATA(분석 처리된 문자데이터)로 작성한다.

    <p>LOVE & GHOST</p> ☞ <p>LOVE &amp;amp; GHOST</p>
    <a href="../../list.php?id=bomnun&val=2">링크</a> ☞ <a href="../../list.php?id=bomnun&amp;val=2">링크</a>

    * <style>과 <script>요소에서는 <![CDATA[ ... ]]>를 사용해서 문자열을 파싱하지 않고 그대로 사용할 수 있다.

  • XHTML일 경우 속성은 약술할 수 없다.

    <input type="radio" checked /> ☞ <input type="radio" checked="checked" />

  • Encoding Charset이 무엇인지 확인한다.

    HTML 문서는 utf-8인데, 파일 인코딩은 euc-kr인 경우가 종종 있고, 이 경우 한글이 깨져 보이는 가장 큰 이유가 된다. 또한, CSS나 JS 역시 인코딩이 다를 경우 제대로 작동되지 않기도 한다.

세세히 따지면 좀 더 있겠지만 대부분 위의 경우에 해당될 것 같다. 그리고 상위 4개 붉은색으로 표시한 것들이 validate를 통과하지 못하는 대부분의 이유가 된다. 서버사이드 개발자들이 위의 내용을 숙지만 하고 있다면(최소한 DTD의 차이만이라도 알고 있다면) 문법 오류를 최소한으로 줄일 수 있을것 같다.

이 글은 솔직히 서버사이드 개발자들을 '낚기' 위한 글입니다. 위의 내용은 이미 수차례 비슷한 주제의 블로그나 사이트를 통해서 널리 알려져 있는 내용입니다. 결국 복사된 내용의 재탕(웹표준교과서의 내용을 정리했음)이라는 것이지만 그럼에도 불구하고 서버사이드 개발자분들이 한번만이라도 관심 있게 읽어주기를 바라는 마음에 포스팅을 하게 되었습니다.

2008년 4월 11일 금요일

사용자들은 정말로 편하다고 생각할까?

웹퍼블리셔로 직업을 갖고 웹접근성과 웹표준화에 대한 연구를 하면서 CDK는 가장 좋은 토론의 장이 되고 있습니다. 업계의 많은 전문가들이 하나의 이슈를 가지고 서로 다른 의견을 내놓기도 하고, 쓸만한 결론이나 합의를 이끌기도 합니다. 논의의 깊이는 점 점 깊어지고, 내용의 범위는 점점 커집니다. 질적으로 정말 수준이 높아지고 있는 커뮤니티이고, 그 안에서 단 한줄의 댓글이라도 달 수 있는 영광이 내게도 있다는 사실이 가끔은 뿌듯하게 느껴지기도 합니다.

그런데 요즘 한가지 의심이 생기기 시작했습니다. 우리들(CDK에서 활동하는 웹 종사자들)의 토론과 결론이 과연 타당한가하는 것입니다. 최근 dece24님께서 올려주신 '셀렉트, 점프, 드롭다운, 풀다운 메뉴의 GO 버튼 이슈.' 글타래에서 dece24님은 마지막에

여기서 만약 go 버튼이 없다면(설사 숨어있다손 치더라도 디자인을 해치기 때문에 나타나서는 안된다고 가정하면) 사용자는 이것을 점프메뉴가 아니라 그냥 폼의 옵션중 하나라고 생각할 가능성이 크다는 점이 제가 우려하는 점

이라고 정리 댓글을 달아 주셨습니다.

일단 저 역시 dece24님 의견이 동감하는 입장임을 밝힙니다. 그리고 제 글이 dece24님의 글에 대한 딴지를 거는 것이 아니니 오해가 없으셨으면 좋겠습니다.

인용된 dece24님의 글만을 보면 언급된 사용자가 이 글타래의 이슈(웹접근성)가 되는 시각장애인을 지칭한다고 생각합니다. 따라서 '사용자는 이것을 점프메뉴가 아니라 그냥 폼의 옵션중 하나라고 생각할 가능성이 크다는 점'이라고 쓰신 것에는 사실 문제가 없는것 같습니다. 그런데 웹표준이 이슈화 되고 이런 문제에 대한 논의가 활발해진 것이 최근인 것을 보면 지금까지 시작장애인들은 Select 요소로 작성된 점프메뉴를 계속해서 사용했거나, 최소한 전후맥락(폼 양식이라면 최소한 전후에 관련된 다른 폼 양식도 함께 포함하거나 제목을 달고 있을 것이고, 바로바기 메뉴의 경우 대부분 본문의 상단이나 하단에 별도로 나타납니다.)을 짚어 그것이 양식 폼 안에서의 옵션이 아니라 점프되는 메뉴라는 것을 인식했을 가능성이 큽니다. 물론 이 경우가 나쁜 웹접근성을 가진 것이고 잘못 된 것이기는 합니다. 하지만 사용성이라는 것이 최고의 이론이나 옳다고 생각되는 기술에 의한 것이기 보다 사용자의 직접적인 경험에 의해 형성되는 경우가 많습니다. 항상 안으로 당겨야 하는 문이 있습니다. 사람들은 힘을 강하게 주어 안으로 당기는 이 문이 불편합니다. 하지만 어쩔수 없이 지속적으로 문을 당기며 출입을 했습니다. 그런데 어느날 사용자 편의성을 고려한 사장이 문을 밀고 나가도록 교체를 했습니다. 사람들은 당황해 할 겁니다. 당겼는데 열리지 않는 문을 보면서 문이 잠겼다고 생각할 수도 있습니다. 물론 시간이 지나면 밀고 나가는 방식을 더 편하게 생각하면서 바로 적응할 겁니다.

예로 든 출입문의 경우는 확실히 밀고 나가는 방식이 편하고, 처음에는 갑자기 바뀐 방식에 당황해 하지만 곧 변화를 받아들이고 더 편한 사용성을 확인합니다. dece24님의 이슈는 그동안 출입문을 당기는 방식에서 미는 방식으로 바꾸는 것이라고 생각합니다. 처음에는 혼동이 올 수 있겠지만  ul과 a로 바뀐 바로가기 메뉴에 더 친절함을 느끼고, 편리함을 느낄 것이라고 저 역시 기대합니다. 하지만 모든 경우가 이렇지는 않을 것이라는게 제 고민입니다.

요즘은 UX(사용자 경험)만을 전문으로 다루는 사람들이 있죠. 그들은 사용자들이 웹사이트에서 마우스를 어디에 두는지 시선을 어디에 두는지 몇번 클릭하고, 어떻게 드래그 하는지. 키보드는 조작하는지 등등을 조사하고 연구하는 사람들이라고 알고 있습니다. 하지만 모든 회사에 이런 UX관련 부서나 인원이 있는 것은 아니고, 이렇게 연구되고 조사된 UX 관련 자료가 항상 공개되는 것도 아닙니다. 대부분은 기업에서 자사의 웹사이트를 좀 더 효과적으로 개발하기 위한 자료로 이용되고 있을 겁니다.

문득 우리에게도 이런 자료가 절실히 필요하다는 생각을 해 봤습니다.

문제는 좁게는 웹퍼블리셔, 넓게는 개발자와 디자이너를 포함한 범위에서의 웹개발자들이 실제로 사용자들의 반응이나 패턴을 조사하거나 확인해 보지 않고, 회의실 안에 모인 개발자들끼리의 논의와 고민만 가지고 '그럴 수 있다'라고 생각하는 경우가 종종 있지는 않은가 하는 것입니다.
쉽게 말해서 개발자 입장에서의 사용사 편의성(사용성)을 고민한다는 것이죠. 개발자 역시 넓은 의미에서 한명의 사용자이기 때문에 내가 불편하면 다른 사용자도 불편하다는 논리와 개발자 스스로 고민한 사항이 대다수의 사용자들에게도 적용될 것이라는 기대 심리가 작용한다고 생각합니다.

정치와 비교할 수는 없겠지만 소수의 정치인들이 생각하는 정책의 논리가 대다수의 국민의 생각과 크게 다른경우를 종종 볼 수 있습니다. 책상머리에 앉아서 자기들끼리만 입씨름하고 고민한 까닭이지요.

우리 웹 종사자들 역시 그런 실수를 하고는 있지 않은가 하는 생각이 들었습니다. 네이버나 다음 정도의 포털에서는 그래도 사용자 테스트를 해볼 수 있는 기회를 가져볼 수도 있겠지만(정말 하고 있나요?) 대부분의 웹에이전시에서는 현실적으로 어려움이 많습니다. 때문에 포털의 기술을 '믿고' 가져오거나, 전문가의 의견을 적절성 여부를 깊이 있게 고민해 보지 않고 따르는 경향이 있는것 같습니다.

결론은 우리가 어떤 사용성 또는 접근성 이슈를 가지고 논의를 하고 결론을 도출해 내는 과정에서 섣불리 '사용자는 그럴 것이다'라고 판단해서는 안된다는 것입니다. 백 명의 웹퍼블리셔가 옳은 방법이라고 생각해도 백 명의 웹퍼블리셔를 제외한 거의 모든 사용자들은 그것이 더 불편하다고 느낄 수 있을지 모르는 겁니다. 이 넌센스를 극복하기 위해서는 지금까지와 같은 진지한 고민과 토론 의외에도 실질적이고도 객관적인 사용자경험(UX)에 대한 연구가 활발히 이루어지고, 공유가 되어져야 할 것 같습니다.

2008년 4월 8일 화요일

개발자들이여 당신의 상사가 바보같다고 느껴진다면 이 책을 선물하라

소프트웨어 누가 이렇게 개떡같이 만든 거야 상세보기
데이비드 S. 플랫 지음 | 인사이트 펴냄
소프트웨어 사용이 어려운 이유는? 『소프트웨어 누가 이렇게 개떡같이 만든 거야』는 왜 사용자가 소프트웨어를 사용하기가 어려운지에 대해 이야기한다. 소프트웨어를 어렵게 느끼는 이유는 무엇인지, 누구 때문에 이러한 일들이 발생하는지, 과연 잘 만들어진 소프트웨어는 어떠한 것인지에 대해 재미있고 직관적으로 풀이한다. 잘못된 소프트웨어를 만드는 개발자들의 방식과 사용자들이 생각하는 방법을 대조적으로 알기

저는 웹퍼블리셔입니다. XHTML으로 마크업을 하고 CSS를 가지고 웹디자이너가 건네준 디자인을 브라우저 화면에 재디자인합니다. 그리고 JavaScript로 약간의 재주를 부리기도 합니다.

최근에 웹2.0이라는 경제적 용어가 이슈가 되고, 뒤를 이어서 웹접근성과 웹표준화에 대한 이슈가 커지고 있습니다. 하지만 아직도 많은 수의 클라이언트(기업의 우두머리들)와 웹사이트를 대신해서 만들어주는(웹에이젼시) 기업 내의 거의 모든 사람들은 이를 외면하거나 애써 피하려고만 합니다. 오직 웹퍼블리셔들만이 쫑알쫑알 떠들어 대는 듯한 느낌이 강합니다. 그나마 그것도 소수의 웹퍼블리셔들만이 말입니다.

최근에 저는 사내에서 적극적(?)으로 웹표준 홍보를 하고 있습니다. 웹디자이너들에게 사용자들이 폰트를 크게 키워서 볼 수 있다는 것을 인식시키고, 유연한 레이아웃을 부탁합니다. 바로가기 셀렉트 박스 옆에 버튼을 달아두면 시각장애인도 이용할 수 있을것이다라는 이야기도 합니다. 플래셔에게는 플래시의 대체 텍스트 기능이 들어 있음을 알려줍니다.(저는 플래시를 전혀 모릅니다. 하지만 웹에서 검색을 통해서 알아냈고, 그 사실을 항상 플래시를 다루는 사람들에게 알려주고 있는 겁니다! 이게 뭡니까!) 기획자와는 아주 긴 시간 논쟁을 벌여야 합니다. 그들의 스토리보드를 뜯어고쳐야 하고, 개발 프로세스를 개선할 것을 요구합니다. 그들에게 장차법을 소개하고, 다양한 브라우저를 보여줍니다. 그리고 우리 회사가 만들었던 그 많은 사이트들을 하나씩 보여줍니다. 그들은 당황해 합니다. 그러나 어떻게 해야 할지 모릅니다. 그저 클라이언트가 좋아만 하면 그만이다 말합니다. 20대를 위한 사이트는 20대만 들어오면 되고, 비주얼이 강한 사이트는 시각 장애인이 와도 볼게 없으니 무시해도 된다라는 논리. 청각 장애인을 위해서 간단한 사이트를 하나 더 만들면 되지 않겠냐는 논리. 회원가입 양식에 온갖 항목을 집어놓고 단 하나의 에러도 표시해주지 않아서 다시 처음부터 가입하게 만드는 개발자의 센스. 우리에게 사용자란 무엇인지? 사용자를 위한 사용성이란 무엇인지? 한번 진지하게 고민해봐야 하지 않을까요.

웹표준과 웹접근성에 대한 이슈는 이 책이 지적하는 사용자에 대한 사용성과 아주 밀접한 관계를 가지고 있습니다. 바보같은 개발자들은 자신들의 관점으로 사용성을 판단한다. 맞는 말인것 같습니다. 저도 제가 코딩한 마크업 문서의 오류를 확실하게 찾아내지 못합니다. 제가 작업한 스크립트가 사용자에게 편리함을 준다고 착각할 때가 아주 많습니다. 저 역시 한 명의 사용자라고 생각하기 때문입니다. 하지만 개발자는 어디까지나 개발자입니다. 완벽하게 사용자일 수 없습니다. 온전하게 컴퓨터를 제대로 알지 못하는 사용자 말입니다. 시시때때로 경고창과 말도 안되는 에러 메세지를 띄워서 사용자에게 선택을 강요하는 것은 개발자가 생각하는 사용자에 대한 사용성일 뿐입니다. 사용자들은 그것들을 원하지도 않고, 오히려 불편해 한다는 사실을 이 책은 적나라하게 보여주고 있습니다.

제가 생각하는 한국의 웹은 아주 심각할 정도의 개발자들의 웹입니다. 온통 신기하고 제멋대로인 웹이 지천에 널려 있습니다. 사용자들은 이 불편한 웹을 매번 새롭게 교육받으며 몇번의 시행착오를 거치며 적응해 가고 있습니다.

UI/UX를 떠들면서 우리는 항상 사용자 입장에서 생각한다라는 말을 합니다. 하지만 진정 사용자가 누구였는지를 고민하지 않았습니다.

처음 이 책의 제목을 접했을때 나는 단지 윈도우(또는 맥)의 소프트웨어를 만드는 사람들에게 딴지를 거는 것이겠지 싶었습니다. 하지만 저자는 윈도우와 웹을 폭넓게 껴 안으며 사용자를 무시하는 모든 개발자들을 싸잡아 '바보'로 만들었습니다.

너무나 속이 후련하고 시원합니다. 만약에 당신의 상사가- 대리나 팀장, 과장이나 부장이나 심지어 실장이나 이사라고 할지라도- 정말 바보같다고 느껴진다면 이 책을 읽어보라고 말 하시기 바랍니다. 저는 이 삼품평으로 인해 출판사가 돈을 더 벌고 저자가 비싼 음식을 먹게 할 마음은 추호에도 없습니다. 가까운 도서관에 이 책이 있다면 공짜로라도 보시기를 바랄 뿐입니다. 지인중에 누군가 이미 이 책을 사서 보았다면 빌리거나 복사라도 해서 읽어보시길 바라는 겁니다.

개발자들은 너무나 소심해서 자신을 향해 '바보'라고 욕을 해대면 화를 낼지 모릅니다. 하지만 최소한 그렇게 부끄러워할 줄 아는 개발자라면 이 책을 읽고 사용자에 대한 생각을 고칠수 있을것이라고 생각합니다.

오늘 하루 옷 좀 벗겠습니다.

사이트가 망가진 것이 아닙니다.

제 블로그가 옷을 벗었습니다.

CSS Naked Day 2008


웹표준 홍보를 위한 CSS NAKED DAY가 3년째를 맞이했습니다. 작년에는 로고까지 분홍빛깔을 보이는 것이 'Naked'와 상당히 므흣한 분위기를 연출했는데 올해는 살짝 칙칙하군요^^;

1회와 2회가 4월 5일이었는데 3회째를 맞는 올해는 4월 9일이군요!
자세히 보지도 않고 4월 4일부터 서둘러 옷을 벗겼드랬습니다-_-우훗훗



2008년 4월 5일 토요일

웹 표준 개발 프로세스

웹표준화와 웹접근성 강화에 대한 이슈가 커지고 있다. 오는 4월 11일(차주 금요일) '장애인 차별금지 및 권리구제를 위한 법률'이 시행되고, MS의 Internet Explorer 8은 그동안 문제가 많았던 CSS 렌더링 엔진을 자사 제품중(IE 5.5, 6, 7) 가장 완성도 있는 표준 지원 엔진으로 바꿔놓았다. 애플은 자사의 'Safari' 웹브라우저를 윈도우용으로 출시하였고, 최근에는 웹표준기술 테스트인 Acid3를 통과했다는 소식을 전했다. 오페라 역시 'Safari'와 같은 날 Acid3를 통과했고, 모바일 시장(휴대폰, PDA 등에 탑재되는 미니 브라우저 시장)에서의 강세를 이어가고 있다.

바야흐로 2008년은 웹표준의 전환점이 될 것으로 보인다. 그동안 은비까비가 들려주는 옛날 옛적 이야기쯤으로 치부하던 웹 실무자들도 조금씩 관심을 보이기 시작했고, 해야겠다는 생각을 하기 시작했다. 며칠전 사내 웹표준 세미나 이후 계획되어 있던 프로젝트가 곧바로 웹표준 개발로 전환되는 쾌거(!)를 이룬 것이다. 적어도 두시간 가까이 목말라가며 떠들었던 내 작은 수고가 헛되지만은 않았던 것일까.

그런데 바로 고민거리가 생겼다. 해야한다고 이연사 목청 높여~ 외쳤으나 정작 'How?'에 대한 해답을 확실히 주지 못한것이다. 세미나 직후 웹표준 개발로 선회한 프로젝트를 담당하신 기획자분이 내게 왔고, 어떻게 해요... 라고 물으시는데 참 미안해지더라. 지금까지는 웹표준을 위해서 웹퍼블리셔들이나 개발자들이 표준기술을 익혀왔고, 디자이너나 플래셔들에게는 접근성에 대한 이해를 구해왔었다. 하지만 사실 기획자를 통한 개발 프로세스의 적절성 논의에서부터 필요하다면 새로운 개발 프로세스가 필요하지 않을까 하는 생각을 하게 되었다.


한국소프트웨어진흥원에서 발표한  '실전 웹 표준 가이드(2005)'에 보면 마지막 챕터에 표준 개발 프로세스를 자세히 설명하고 있는데 이를 먼저 소개해보고, 김철수님의 웹 표준 개발 후기를 통한 문제점과 개선점 등을 고민해 보겠다.

실전 웹 표준 가이드의 '실전 표준 개발 프로세스'

기존 웹 개발 프로세스는 일반적으로 Waterfall 방식이라고 불리우는 선형적이고 밀어내기식의 프로세르를 따르고 있다.

사용자 삽입 이미지

실전 웹 표준 가이드 p183

쉽게 말해 '기획 → 시안 → 스토리보드 → 디자인 → 코딩 → 프로그래밍/디버깅'으로 이어지는 방식인데 전문적인 지식이 없더라도, 또는 프로젝트가 진행중인 새로운 인력이 투입이 되더라도 별도의 교육이 필요하지 않는 비교적 쉽고 단순한 방법이다. 때문에 웹개발 초기부터 도입이 쉬웠고 아직까지도 크게 변하지 않고 적용되고 있다.

이 방법의 문제는 ① 업무의 병목현상 ② 의존적 스토리보드 ③ HTML문서구조화의 어려움 ④ 개별 역활 중심의 프로세스를 통한 업무 과중을 들 수 있습니다.

  1. 업무의 병목현상
    Waterfall 방식은 선행 프로세스가 지연될 경우 전체 프로세스의 지연으로 이어진다. 즉, 기획이 늦어지면 디자인과 코딩, 개발이 차례로 늦어지는 문제가 생긴다. 코딩까지 완료된 시점에서 기획이나 디자인이 변경되면 재코딩이 이루어지는 것도 병목현상에 한 몫 하게 된다. 아울러 프로세스상 뒤에 위치한 코딩이나 개발 인력의 프로젝트의 초기 참여율이 낮고, 둘 이상의 프로젝트에 참여하게 되면서 집중도를 낮춰 전체적인 생산성을 떨어뜨리는 경우가 생긴다.
  2. 의존적 스토리보드
    스토리보드는 웹개발의 시작이고, 밑그림입니다. 그만큼 중요하죠. 문제는 디자이너나 개발자들이 지나치게 스토리보드에 의존적이라는 것입니다.
  3. “스토리보드에는 그에 대한 지시사항이 없는 걸요” - 아주 기본적인 에러확인 로직을
    스토리보드에 없다는 이유만으로 개발하지 않은 프로그래머의 반문
    “저는 스토리보드에 그려진 대로 그린 것 뿐인데요...” – 디자인이 참신하지 못하다는
    지적을 받은 디자이너의 변명
    “어째서 스토리보드에 있는 그대로 하지 않았지?” – 발전적 창의성을 적용한
    프로그래머/디자이너를 인정하지 않는 기획자의 질책

    위의 예는 의존적 스토리보드의 문제점을 제대로 보여주고 있죠. 이로 인해서 기획자는 스토리보드를 수백장씩 상세하게 기술해야만 하는 업무적 과중을 느끼게 됩니다. 웹디자이너에게는 스토리보드를 그대로 Photoshop에 그려내는 '오퍼레이터'와 같은 수동적인 자세를 가지는 것도 문제가 됩니다. 또한, 전체 프로세스를 한 눈에 보여주지 못한 수백장의 스토리보드는 개발자에게 별로 도움이 되지 못합니다.

  4. HTML문서 구조화의 어려움
    HTML문서를 코딩하는 일은 관례적으로 웹디자이너의 역활로 지정되어 온 경우가 많습니다. 규모가 커지고, 웹디자이너의 부담을 줄이기 위해서 'HTML코더'라고 불리우는 직군이 생겼지만 상대적으로 낮은 대우와 평가를 받아왔습니다. 때문에 웹디자이너가 코딩을 하든, 웹개발자가 하든, 별도의 코더가 하든 HTML문서가 제대로 '구조화'되지 못하는 문제가 생기게 된 것입니다.

  5. 개별 역활 중심의 프로세스를 통한 업무 과중
    기획자나 디자이너, 개발중 어느 한 직군(역활)을 중심으로 프로세스를 개선하거나 정리할 수 있습니다.
    기획자 중심의 프로세스는
    사용자 삽입 이미지

    실전 웹 표준 가이드 p191

     
    이 될 것이고, 디자이너 중심의 프로세스는
    사용자 삽입 이미지

    실전 웹 표준 가이드 p189


    이 됩니다. 프로그래머 중심의 프로세스 역시
    사용자 삽입 이미지

    실전 웹 표준 가이드 p190


    의 절차를 갖게 됩니다. 어느경우라도 XHTML 구조화(마크업)와 CSS 디자인이라는 표준 기술 영역을 포함해야 하기 때문에 업무 과중이 문제가 됩니다. 특히 과거처럼 웹디자이너에게 마크업과 CSS디자인을 맡기게 되면, 시각적인 디자인과 논리적인 디자인의 차이로 인해 오히려 좋지 않은 영향을 끼칠 수 있을 것입니다.

웹 표준 가이드에서는 위와 같은 기존 프로세스의 문제점을 지적하고 '웹퍼블리셔 중심의 개선된 모델'을 제안하고 있습니다.

사용자 삽입 이미지

실전 웹 표준 가이드 p193


보기엔 상당히 복잡해 보이지만 단순히 HTML 코딩만을 위해서 'HTML 코더'를 두었던 것과 달리 웹 표준 기술에 대한 전문성을 가진 '웹퍼블리셔'라는 직군을 포함시키면서 기획자나 디자이너, 개발자가 가질 업무의 과중을 덜어냄과 동시에 전체 프로세스의 효율성을 높이고 있다고 볼 수 있습니다.

이제 여기서 실제로 위의 프로세스를 실무에 적용했던 김철수님의 후기를 살펴보겠습니다.

김철수님의 'Storyboard - 표준 스토리보드 구상기'

김철수님은 웹 2.0 에 따른 Ajax 사용등을 고려하면서 새로운 스토리보드의 필요성을 느끼셨다 합니다. 그리고 앞서 소개해 드린 '실천 웹 표준 가이드'의 '웹퍼블리셔 중심의 개발 프로세스'를 받아들여 프로젝트에 적용하는 노력을 해 주셨습니다. 특히 김철수님은 웹퍼블리셔에게 XHTML, CSS, JS와 같은 웹 표준 기술의 전문성과 더불어 프로젝트의 실무적인 조율 능력이 필요함을 지적하고 있습니다. 그리고 다음은 김철수님께서 실제로 적용한 방법이다.

방법은 이러했다. 우선 전체가 모여 프로세스 플로우를 짜기 시작했다. 이때 사실상 전반적인 기획과 분석과 설계가 같이 진행되어서 대략 2개월 정도가 걸렸다. 그 다음에는 컨텐츠 명세서를 간단히 작성하고 곧바로 퍼블리셔를 임명하여 HTML 코딩 작업에 들어갔다. 그 산출로 나온 CSS를 디자이너가 실시간으로 확인하면서 디자인 작업을 했고, 개발자는 DB 개발과 서버 프로그램 개발을 진행했다.

그리고 다음과 같은 문제점들을 나열했습니다.

첫째, 전체가 모여 프로세스 플로우를 맞추는 것이 매우 힘든 일이었다.

둘째, 컨텐츠 명세서를 작성하는 것이 쉽지 않았다.

셋째, 퍼블리셔의 작업을 충분히 해낼 사람이 없었다.

넷째, CSS를 잘 다루는 디자이너가 없었다.

아무래도 새로운 프로세스를 직군별로 설득하고 이해시키는 일이 쉽지 않았을 것이며, 새롭게 등장한 컨텐츠 명세서를 어떻게 해야하는지 기준도 없는 상태에서 진행하기란 쉽지 않았을 것이다. 그리고 웹 표준 기술을 제대로 숙지하고 적용할 수 있는 전문적인 웹퍼블리셔의 부재는 어제 오늘의 문제가 아니고, CSS 디자인과 같은 웹 표준 기술이 요구되는 작업을 디자이너가 하기에는 무리가 있었을 것이다. 이러한 문제가 있었지만 김철수님은 나름의 노하우를 익히셨고 다음과 같이 공개해 주셨다.

하나, 사이트맵 대신 모듈맵을 만든다.

둘, 모듈 단위로 HTML을 작성한다.

셋, 최종사용자의 UX를 먼저 확정한 뒤 서버 프로그램을 시작한다.

넷, 텍스트 기반으로 먼저 만들고 나중에 세세한 디자인 요소를 삽입한다.

다섯, 위키 방식으로 모두가 개발 소스에 접근하여 수정할 수 있도록 한다.

자세한 설명은 김철수님 블로그에서 직접 확인해 볼 수 있는데, 간단히 코멘트를 하자면 전체 프로세스를 모듈화 하는 것이 중요해 보인다. 과거처럼 거대한 프로젝트를 수백장의 스토리보드에 다 담아 내는 것이 아니라, 기능별로 모듈화된 페이지를 고려하고, 그에 맞는 명세서나 차트를 만들어 개발자와 디자이너에게 전달한다. 그리고 텍스트 기반(XHTML 마크업)의 프로토탑입 설계를 함께 진행하여 디자인 이후에 있을 오류를 최소회 시켜야 한다. 또한, 개발 팀원간의 소통을 위한 도구로 '위키(wiki, 누구나 접근하여 쓰고, 지우고, 수정할 수 있는 시스템)'를 제안하고 있다. 제 의견으로는 'Trac' 의 사용을 추천해 드립니다.'Trac'는 '위키'시스템과 '포럼' 형태를 모두 가지고 있고, 버전관리와 연동이 되기 때문에 프로젝트 게시판으로 사용하기 좋은것 같습니다.


개량형 '웹퍼블리셔 중심의 웹 표준 개발 프로세스'


위 표는 '실전 웹 표준 가이드'와 김철수님의 후기를 읽은 뒤에 살짝 고민을 덧붙여 변형을 가해 본 것이다. 가이드에서도 밝혔고, 나 역시 미리 밝혀두는 것이지만 이러한 웹 표준 프로세스라는 것이 아직은 정형화 되어 있지 못하고, 객관적인 장단점이 불분명한 상태이다. 따라서 프로젝트의 성공 여부를 보장해주지 못한다. 다만, 웹 표준을 준수하는 웹 개발을 할라치면 이러한 고민과 적용이 필요하지 않을까 해서 시작된 것이고, 이렇게 나의 의견까지 덧붙이게 된 것이다.

'개량형'이라고는 했지만 '실전 웹 표준 가이드'에서 소개하는 내용과 크게 다르지는 않다. 용어가 일부 변경('코딩' 보다는 '마크업'이라는 용어로, 일부는 김철수님의이 제안하신 것)되었고, 프로세스가 약간은 더 복잡해졌다고 볼 수 있다. (없던 화살표가 생겼다!) 풀어서 서술하자면 다음과 같다.

  • 기획자 : 기획자는 '실전 웹 표준 가이드'에서 제안하는 것과 같이 기획문서를 '프로세스 플로우'와 '컨텐츠 상세화'로 구분하여 작성한다. 차이가 있다면 '프로세스 플로우'와 함께 게시판이나 회원가입/로그인과 같이 모듈화가 가능한 것들에 대한 모듈 명세서 또는 모듈 맵이 함께 작성된다. 그리고 이것은 개발자에게 전달되어 프로젝트 전반에 대한 설계와 프레임 개별 모듈에 대한 설계를 할 수 있도록 한다.
  • 디자이너 : 디자이너는 기획/분석 단계에서 만들어진 아이디어를 통해 시안과 스타일 가이드(문서 또는 준하는 이미지 파일)를 만듭니다. 그리고 기획자의 컨텐츠 상세화 문서(기존의 스토리보드로 생각하면 쉬울것 같다)를 받아 화면 디자인을 시작한다. 여기서 완성된 스토리보드를 가지고 시안을 만들지 않는다는 것은 중요합니다. '실전 웹표준 가이드'나 김철수님이 지적했듯이 상세한 스토리보드는 디자이너의 창의력을 둘러싸는 장벽이 될 위험요소가 있습니다. 때문에 기획/분석 단계에서 나온 아이디어나 컨셉 등 필요한 만큼의 적은 정보만으로 시안을 잡아 디자이너로 하여금 충분히 창의력을 발휘할 수 있도록 해야 합니다.
  • 개발자 : 개발자는 기획/분석 단계에서 나온 아이디어와 컨셉을 통해 기술적 이슈(HTML문서의 DTD, 인코딩, 폼 영역의 ID값 등)에 대한 개발 가이드를 작성하여 퍼블리셔에게 전달합니다. 그리고 기획자로부터 '프로세스 플로우'와 '모듈 맵'을 전달받아 시스템 설계와 모듈 단위의 개발 준비를 시작합니다. 이후 퍼블리셔로부터 마크업이 완료된 XHTML문서를 받아 프로그래밍과 디버깅 작업을 진행합니다.
  • 퍼블리셔 : 퍼블리셔는 기획자로부터 '컨텐츠 상세화 문서' 또는 '페이지 명세서'를 받아 XHTML 마크업을 시작합니다. 이때 개발자로부터 받은 '개발 가이드'를 바탕으로 XHTML 문서의 Doctype 설정, 인코딩 설정, 공통  ID값 등을 결정하거나 적절치 않을시 재논의하여 적용하도록 합니다.(한 번 결정된 Doctype이나 인코딩은 개발 과정에 쉽게 바꾸기가 어려우므로 반드시 확실히 결정을 하고 넘어가도록 합니다.) XHTML 마크업이 완료되면 개발자에게 전달하여 프로그래밍이 진행될 수 있도록 합니다. 이후 디자이너로부터 받은 '스타일 가이드'와 '화면 디자인(PSD 파일)'을 통해 XHTML 문서에 CSS 디자인을 시작합니다. 다음으로 개발자와 소통하며 완료된 페이지를 '퍼블리싱'하면서 CSS 오류 등을 잡아내는 '디버깅' 작업을 진행합니다. 마지막으로 기획자와 함께 '표준화 준수 확인'작업을 하게 되는데 '실전 웹 표준 가이드'에서는 이를 퍼블리셔의 역활로 두었으나 제 경험상 '내가 작업한 것을 내가 테스트 하는 것은 실효성이 적다'였습니다. 다시말해 내 실수를 내가 찾아내는게 쉽지 않았다라는 겁니다. 프로세스대로 디자이너와 개발자가 표준에 맞춘 일정을 따라주었다면 최종적으로 퍼블리셔의 웹 표준 기술(XHTML, CSS, DOM, JS 등)에 의한 크로스 브라우징과 접근성 문제 등이 주요 이슈로 나타날 수 있는데 이를 퍼블리셔 스스로 검증하기란 쉽지 않습니다. 따라서 애초에 기획자에게 책임을 지우는 것이 좋다는 생각을 해봤습니다. 그리고 단계적으로는 최종 단계이긴 하나 기획자는 프로젝트가 진행되는 가운데 지속적으로 디자이너와 개발자, 퍼블리셔가 표준을 준수하고 있는지를 검증해야 합니다.

특별히 부연 설명을 드리고 싶은 것은 위 표에서도 나타나 있듯이 양쪽화살표로 되어 있는 굵은 선 프로세스들입니다. 퍼블리셔를 중심으로 기획자와 퍼블리셔, 디자이너와 퍼블리셔, 개발와 퍼블리셔가 지속적으로 커뮤니케이션을 이루도록 되어 있습니다. 또 한가지 기획자와 퍼블리셔가 같은 색 영역으로 묶여 있음을 보실 수 있습니다.

김철수님도 쓰셨듯이 웹 표준 개발 프로세스에서 기획자와 퍼블리셔의 협력은 굉장히 중요해 보입니다. 1차적으로 과거의 스토리보드가 세부화된 개별 문서와 XHTML 문서로 만들어집니다. 이렇게 만들어진 XHTML문서는 디자인이 입혀지기 전에 1차적으로 프로세스 테스팅을 가질 수 있다는 장점이 있습니다. 일종의 프로토타입을 만드는 것입니다. 버튼이 빠져 있거나 페이지가 잘못 연결되어 있거나 추가되는 페이지등을 사전에 고려하여 디자인 이후에 생길 수 있는 추가 작업을 줄일 수 있습니다.

디자이너가 CSS를 다루지 않는 것도 김철수님의 경우와 다릅니다. HTML이나 CSS도 모르면서 웹을 어떻게 하냐는 소리를 하곤 했지만 사실 웹디자이너에게 전문적인 수준의 XHTML과 CSS를 강요할수만은 없다고 생각합니다. (현실적으로 불가능에 가깝습니다.) 때문에 CSS 디자인 역시 퍼블리셔의 영역 안에서 해결해야 한다고 생각합니다. 실제로도 대부분의 퍼블리셔들이 시멘틱한 마크업과 CSS 작성은 자신들의 영역이라고 생각하면서 공부하고 있습니다.

아울러 개발자들이 텍스트로만 이루어진 XHTML 문서를 통한 개발에 적응할 수 있어야 한다고 봅니다. 개발 영역에서는 MVC모델이라는 것이 확실히 자리잡고 있지만 아직도 많은 경우에 XHTML문서 내에 직접 프로그래밍을 입히는 경우가 많습니다. 이 경우 XHTML문서와 서버측 스크립트 언어, CSS 등이 뒤섞여 유지보수가 매우 어려워질 수 있고, 위의 개발 프로세스도 적용하기 힘들 수 있습니다.

저는 가능하면 현재의 프로세스(Waterfall) 에서 크게 변형을 가하고 싶지는 않았습니다. 갑작스러운 변화는 오히려 효율성 측면에서 마이너스 효과를 가져올 수 있기 때문입니다. 따라서 위 표를 보면 초록색 프로세스를 중심으로 기획자는 기획문서를 만들어서 개발자와 디자이너에게 주고, 디자이너는 퍼블리셔에게 PSD를 주고, 퍼블리셔는 마크업이 완료된 XHTML문서를 건네게끔 되어 있습니다. 이는 기존의 프로세스와 크게 다르지 않습니다. 그러면서도 상호간의 커뮤니티를 강조하고 있고, 전문적인 웹퍼블리셔의 인력 확보에 포커스를 두고자 합니다.(이 부분은 구인이든 교육이든 사내에서 해결을 해야할 것으로 보임) 따라서 디자이너가 어렵게 CSS를 다루지 않아도 되고, 개발자 역시 초기 단계에서 문제가 될 만한 것들을 퍼블리셔와 미리 확실하게 집고 넘어가는 과정을 필수적으로 포함시킴으로써 개발 후에 생길 문제를 최소화 하는데 신경을 썼습니다.

지금까지 웹 표준화 프로젝트를 위한 '웹 표준 개발 프로세스'를 고민해 보았습니다. '실전 웹 표준 가이드'의 제안과 김철수님의 '표준 스토리보드 구상기'는 이미 충분히 좋은 자료가 되고 있습니다. 여기에 저의 부족한 경험과 고민을 덧붙여 약간 변형된 모습까지를 보여드렸습니다. 이미 더 좋은 방법으로 프로젝트를 진행하고 계실 분들도 계실 것이고, 더 나은 생각을 가지신 분들도 계실텐데 저에게 지적과 함께 좋은 의견을 주셨으면 감사하겠습니다.

2008년 4월 4일 금요일

온라인 플래시 광고가 사람을 죽일수 있다

이 글은 웹접근성에 대한 이야기입니다. 대상이 되었던 18대 총선에 출마한 모 후보를 비난하기 위한 글이 아님을 미리 밝혀둡니다.
 

다음주 수요일 4월 9일 18대 총선이 치뤄집니다. 그래서 시내 곳곳에서는 후보들의 지지부탁 행렬이 줄을 잇고 있습니다. 그리고 인터넷에서도 여기 저기 화려한 플래쉬 광고로 열을 올리고 있습니다.
 

자신을 뽑아달라고 호소하는 정치인들의 모습 좋습니다. 하지만 한가지 안타까운 것이 있어 적어봅니다.
 

오늘 우연히 네이버의 스포츠면 기사를 읽다가 우측 플래시 광고 영역에 모 호부의 광고를 보게 되었습니다. 유명 영화의 장면을 모티브로 따와 스피드하고 현란한 모션을 보여주고 있었습니다. 제가 봐도 정신이 몽롱할 정도더군요.
 
앞서 밝혔듯이 이 글은 정치적인 것이 아닙니다. 제가 지적하는 것은 광고를 만든 기법입니다. 네이버 등 포털을 통해서 보신 분들은 아시겠지만 계속적으로 바뀌는 화면에서 상당한 '깜박임' 모션이 사용되고 있습니다. 아무래도 모션의 '스피드'함을 드러내기 위한 것으로 생각됩니다.

그런데 웹접근성을 공부하면서 제가 알기로는 1초에 4회 이상의 점멸(4hz ~ 59hz)이 간질 증세를 보이는 환자들에게 상당히 위험한 것으로 알고 있습니다.(hz별 점멸 샘플) 해당 광고의 점멸이 4hz이상의 점멸을 보이고 있는지는 정확히 측정해 보지 않았지만 일반인인 제가 느끼기에 상당히 빠른 점멸을 보이고 있어 걱정이 되는 것입니다.

과거에 TV와 비디오게임에 장시간 노출되어 있던 어린이들이 비슷한 경우로 인해 발작증세를 일으켰던 사건들이 있었습니다. TV광고의 경우 15초 내외로 짧게 보여지고 넘어가기 때문에 크게 문제삼지 않고 넘어갈 수 있겠지만 웹사이트의 경우 사용자가 원하는 한 얼마든지 해당 광고를 지속적으로 바라볼 수 있습니다. (저도 흥미로은 영상이나 광고를 보게 되면 계속해서 주시하는 버릇이 있습니다.) 이경우 제가 우려하는 문제가 생기지 말라는 법도 없지 않을까 싶습니다.

과한 우려일수 있습니다. 하지만 웹개발에 참여하는 1인으로서 종종 이렇게 만들어진 모션 사이트나 광고를 보면 마냥 모른척하고 넘길수만은 없게 되었습니다. 포털의 경우 어느 사이트들보다도 더욱 만인에게 열려 있는 공간입니다. 간질 증세를 가진 사람들이 너무나 쉽게 들어올 수 있고, 해당 광고나 영상에 노출될 수 있습니다. 광고를 기획하신 분과, 제작자 분들 그리고 해당 광고가 걸린 포털이나 사이트의 책임자는 이러한 사실에 대해서 조금더 신경을 써 주었으면 하는 생각이 듭니다.

2008년 4월 2일 수요일

longdesc 시연 동영상


IMG 앨리먼트 속성 중에 alt와 title을 보완해줄 수 있는 longdesc 속성이 있습니다.
별도의 html문서를 통해서 이미지의 상세한 설명을 도와주는 기능을 합니다.

동영상에서도 알 수 있듯이 longdesc 속성이 지정한 html문서로 이동하여 내용을 읽어주는
스크린리더의 기능을 확인할 수 있습니다. 그리고 마지막에 본래의 html문서로 돌아가는 링크를
걸어주는 걸 잊어서는 안되겠군요. 전 처음에 자동으로 돌아오는건 아닌가? 하고 생각했더랍니다.