매뉴얼

모듈에 라우터 사용하기

짧은주소 적용 대상을 글쓰기 페이지, 회원정보 보기 페이지 등으로 확대하고, 서드파티 모듈에서도 원하는 형태의 짧은주소를 정의하여 사용할 수 있도록 지원합니다. 일단 게시판 등 일부 모듈에만 적용했지만 앞으로 적용 대상을 더욱 늘려갈 예정입니다.

기본 사용법 #

라이믹스에서 지원하는 모든 짧은주소는 http://example.com/mid/나머지/부분의 형태로 이루어집니다. 라이믹스는 모듈 구조로 이루어져 있으므로, mid가 있어야 어느 모듈에서 정의한 짧은주소를 사용할지 결정할 수 있습니다. (mid가 없는 경우에도 최상위 주소를 컨트롤할 수 있도록 하는 기능은 아래를 참고하세요.)

각 모듈은 module.xml에서 아래와 같이 route 속성을 사용하여 "나머지 부분"의 짧은주소 형태를 정의할 수 있습니다.

<action name="dispBoardDelete" type="view" route="$document_srl/delete" />

위의 예제에서 http://example.com/board/123/delete와 같은 주소를 요청하면 board에 해당하는 모듈의 dispBoardDelete 액션으로 전달되고, $document_srl 변수는 평소처럼 Context::get()으로 가져올 수 있으며 123이라는 값이 들어갑니다. 즉, http://example.com/index.php?mid=board&act=dispBoardDelete&document_srl=123 주소를 요청한 것과 동일한 효과입니다.

마찬가지로, 아래와 같은 코드를 사용하여 URL을 생성하면

getUrl('', 'mid', 'board', 'act', 'dispBoardDelete', 'document_srl', 123)

해당 액션의 짧은주소 규칙을 사용하여 http://example.com/board/123/delete라는 URL을 반환합니다.

짧은주소 형태는 정규식으로 취급되지만, 위와 같이 단순한 문법 외에 각종 특수기호를 활용하는 정규식은 사용할 수 없습니다. 요청한 주소를 정규식으로 분석하여 해당 액션으로 연결시켜 주는 것이 전부가 아니기 때문입니다. URL을 생성할 때에는 변수들을 짧은주소 형태에 끼워넣어 주는데, 복잡한 정규식 문법을 사용하면 이것이 정상 작동하지 않습니다.

고급 사용법 #

속성이 아닌 <route> 태그를 사용하면 하나의 액션에 2개 이상의 짧은주소를 정의할 수 있습니다. 예를 들면 게시판 모듈의 dispBoardWrite 액션은 새 글을 쓸 때는 $document_srl이 없고, 글을 수정할 때는 $document_srl이 있습니다. 따라서 아래와 같이 2개의 짧은주소를 각각 정의합니다.

<action name="dispBoardWrite" type="view">
    <route route="write" />
    <route route="$document_srl/edit" />
</action>

※ 이런 형태로 사용할 경우 XML 태그 닫는 위치에 주의하세요.

위의 예제처럼 하나의 액션에 2개 이상의 짧은주소가 정의된 경우, getUrl()을 사용할 때 $document_srl 변수를 넣으면 $document_srl/edit 형태의 URL을 반환하고, 넣지 않으면 write 형태의 URL을 반환합니다. 즉, 동일한 액션이라도 주어진 변수들과 가장 잘 매칭되는 것을 자동으로 선택합니다.

우선순위 #

여러 짧은주소가 사용하는 변수까지 모두 같아서 자동으로 선택하기 어려운 경우, priority 속성을 사용하여 우선순위를 지정해 주면 우선순위가 높은 것을 선택합니다.

<action name="dispBoardExample" type="view">
    <route route="downtown/$baby" priority="20" />
    <route route="hasta/la-vista/$baby" priority="10" />
</action>

남는 변수 처리법 #

변수가 많아서 짧은주소에 다 들어가지 않는 경우도 발생할 수 있습니다. 남는 변수는 쿼리스트링으로 붙습니다. 예를 들어 위의 예제에 $comment_srl까지 넣어서 URL을 생성하면 http://example.com/board/123/edit?comment_srl=456과 같은 결과가 나옵니다. 이런 주소로 접속하더라도 문제는 없습니다.

변수 타입 지정 #

각 변수에 들어갈 수 있는 값의 타입을 제한할 수 있습니다. 예를 들어 아래와 같이 쓰면

<action name="dispBoardMyAction" route="$name:alpha/$number:int" />

$name에는 영문 알파벳만 들어갈 수 있고, $number에는 (0보다 크거나 같은) 정수만 들어갈 수 있습니다. 사용할 수 있는 형태는 아래와 같습니다.

  • int: 정수 (0보다 크거나 같은)
  • float: 소수 (0보다 크거나 같은)
  • alpha: 영문 대소문자
  • alnum: 영문 대소문자 및 숫자
  • hex: 16진수 (0~9, a-f)
  • word: 변수명으로 사용할 수 있는 글자 (영문 대소문자, 숫자, 언더바)
  • any: 슬래시(/)를 제외한 모든 문자
  • delete: 아무 것도 매칭하지 않습니다. getUrl()을 했을 때 해당 변수는 삭제됩니다. 쿼리스트링으로도 노출시키고 싶지 않은 변수를 URL에서 삭제하려고 할 때 사용할 수 있습니다.

위의 예제들과 같이 타입을 지정하지 않고 변수명만 넣어서 짧은주소를 정의한 경우, _srl로 끝나는 변수는 int가 기본값이며 그 밖의 변수는 any가 기본값입니다. 코어에서도 _srl로 끝나는 변수에는 숫자 이외의 값을 허용하지 않고 있습니다.

404 에러 처리 #

mid는 맞는데 나머지 주소가 어떤 짧은주소 형태와도 매칭되지 않는 경우 404 Not Found 에러가 표시되어야 합니다. 코어에서 일괄적으로 처리한다면 각 모듈의 특성에 맞는 에러 화면을 커스터마이징하기 어려우므로, 각 모듈에서 404 에러 핸들러를 지정할 수 있도록 되어 있습니다.

<action name="dispBoardNotFound" type="view" error-handlers="404" />

이렇게 하면 유효하지 않은 짧은주소를 요청한 경우 dispBoardNotFound 메소드가 호출됩니다. 여기에서 에러 메시지를 표시하거나 다른 곳으로 리다이렉트하는 등 상황에 맞는 처리를 하면 됩니다. 현재는 404 에러 핸들러만 지정할 수 있지만, 앞으로는 403 에러 핸들러도 지정할 수 있도록 할 예정입니다.

404 에러 핸들러를 잘 활용하면 일종의 catch-all 함수로 활용할 수도 있습니다.

모듈에서 에러 핸들러를 지정하지 않았거나, mid 정보가 없어서 어느 모듈을 호출해야 할지 찾을 수조차 없는 경우에는 코어의 404 에러 페이지가 표시됩니다.

전역 짧은주소 정의 #

통합검색처럼 mid가 없어도 작동하는 액션의 경우, global route로 지정하면 http://example.com/search와 같이 mid가 없는 주소에서도 연결되도록 할 수 있습니다.

<action name="IS" type="view" global-route="true">
    <route route="search" />
</action>

이 기능을 활용하면 http://example.com/@아이디처럼 간단한 주소를 만들 수 있습니다.

전역 짧은주소를 남용하게 되면 다른 모듈들이 사용하는 mid와 충돌하여 난감한 상황이 발생할 수 있습니다. 코어에서는 rss 등 기존에 지원하던 것 외에는 전역 짧은주소를 사용하지 않을 예정이며, 서드파티 자료에서도 가급적 mid를 생성하고 그 뒷부분만 컨트롤하는 짧은주소를 사용하시기를 적극 권장합니다.

기타 #

  1. 아파치 사용자는 .htaccess 파일을 업데이트하면 새로운 형태의 짧은주소를 사용할 수 있습니다. nginx 사용자는 서버 설정 파일을 교체해야 합니다. 설정 파일을 교체하기 전에는 새 짧은주소가 모두 오류를 뿜게 되므로, 호환성 유지를 위해 짧은주소 사용 옵션을 3단계로 구분했습니다. 현재 1이 기본값이며 2는 사용자가 직접 선택해야 활성화됩니다.
    • 사용하지 않음 (0)
    • XE와 호환되는 주소 형태만 사용 (1)
    • 모든 주소 형태를 사용 (2)
  2. 짧은주소를 정의하지 않은 경우 mid/act 형태의 짧은주소가 임의로 생성됩니다. 예를 들어 게시판 설정화면에 해당하는index.php?mid=board&act=dispBoardAdminBoardInfo라는 주소는 board/dispBoardAdminBoardInfo로 줄어들고, 남는 변수들은 쿼리스트링으로 붙습니다.
  3. 다른 모듈에서 정의한 짧은주소도 적용이 가능합니다. 예를 들어 index.php?mid=board&act=dispMemberLoginFormboard/login으로 변환됩니다. 게시판 모듈에는 해당 짧은주소가 없지만, 회원 모듈에서 dispMemberLoginForm 액션의 짧은주소를 login으로 정의했기 때문입니다. 단, 다른 모듈에서 끌어다 쓰도록 허용된 (즉, standalonefalse가 아닌) 액션만 이렇게 사용할 수 있습니다.
    • 기존에 거의 사용되지 않던 action forward 기능을 재활용하여, 이런 식으로 끌어다 쓸 수 있는 함수들 중 짧은주소를 정의한 것은 모두 action forward에 자동 등록되도록 변경했습니다. 모듈 업데이트를 클릭하면 됩니다.
    • 이 기능을 구현하기 위해 각 모듈의 module.xml을 파싱하는 기능을 완전히 다시 구현했습니다. SimpleXML을 사용하여 기존 방식보다 간결하고 안정적이며, 캐시도 활용하도록 변경하여 성능 향상 효과가 있을 것으로 보입니다.

참고문헌 #