모듈에 라우터 사용하기
짧은주소 적용 대상을 글쓰기 페이지, 회원정보 보기 페이지 등으로 확대하고, 서드파티 모듈에서도 원하는 형태의 짧은주소를 정의하여 사용할 수 있도록 지원합니다. 일단 게시판 등 일부 모듈에만 적용했지만 앞으로 적용 대상을 더욱 늘려갈 예정입니다.
기본 사용법 #
라이믹스에서 지원하는 모든 짧은주소는 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을 사용하여 기존 방식보다 간결하고 안정적이며, 캐시도 활용하도록 변경하여 성능 향상 효과가 있을 것으로 보입니다.
참고문헌 #
개요
코어 개발 참여
확장 기능 제작
테마 제작
기타 정보