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