행복한 아빠

[Grails1.0 사용자 가이드] 6. 웹 계층 - 6 본문

Grails

[Grails1.0 사용자 가이드] 6. 웹 계층 - 6

행복한아빠 2008. 3. 9. 22:47


6. 웹 계층 - 6

6.6 필터
비록 Grails 컨트롤러가 정교한 인터셉터를 지원한다 하더라도 그것은 몇 개의 컨트롤러에 적용할 때만 유용하고 대규모 애플리케이션에서는 관리하기 어려워진다. 반면 필터는 전체 컨트롤러 그룹, URL 공간 또는 특정 액션을 가로질러 적용할 수 있다. 나아가 필터는 끼워넣기(plug-in)가 아주 쉬우며 당신의 주된 컨트롤러 로직과 완벽하게 분리되어 유지된다. 그리고 이것은 보안, 로깅 등과 같이 중간에 끼워넣는(cross cutting) 종류의 개념을 적용하는데 유용하다.

6.6.1 필터 적용하기
필터를 만들기 위해서는 grails-app/conf 디렉토리에 약속에 따라 Filters로 끝나는 클래스를 만든다. 이 클래스 안에 필터를 정의한 filters라는 코드 블럭을 정의한다.

class ExampleFilters {
    def filters = {
        // 여기에 필터를
    }
}

filters 블럭안에 정의한 각 필터는 이름과 범위를 가져야 한다. 이름은 메소드 이름이고 범위는 named 아규먼트를 이용하여 정의한다. 예를 들면 만일 모든 컨트롤러와 모든 액션들에 적용할 필터를 정의한다면 와일드카드를 사용할 수 있다.

sampleFilter(controller:'*', action:'*') {
    // 인터셉터 정의들
}

필터의 범위는 다음 중 하나가 될 수 있다.

  • 컨트롤러 그리고(또는) 액션 이름 쌍, 선택적으로 와일드카드 사용
  • URI, Ant 패스 매칭 문법

몇개의 필터 예제를 보자

  • 모든 컨트롤러와 액션
all(controller:'*', action:'*') {
}
  • 오직 BookController에만
justBook(controller:'book', action:'*'( {
}
  • URI 공간에 적용
someURIs(uri:'/book/**') {
}
  • 모든 URI에 적용
allURIs(uri:'/**') {
}


6.6.2 필터 종류
필터의 몸체 안에 필터에 대해 아래의 가로채기 종류 중 하나를 정의할 수 있다.

  • before: 액션 전 실행. 다음의 모든 필터들과 액션이 실행되지 않게 false를 반환할 수 있다.
  • after: 액션 뒤 실행. 첫번째 아규먼트로 뷰 모델을 가진다.
  • afterView: 뷰 렌더린 후 실행

예를 들어 일반적인 인증 사용 예를 실행하기 위해서 다음과 같이 필터를 정의할 수 있다.

class SecurityFilters {
    def filters = {
        loginCheck(controller:'*', action:'*' {
            before = {
                if(!session.user && !actionName.equals('login')) {
                    redirect(action:'login')
                    return false
                }
            }
        }
    }
}

여기에서 loginCheck 필터는 사용자가 세션에 있는지 검사하여 없으면 로그인 액션으로 리다이렉트하는 블럭 코드를 실행하기 위해 before 인터셉터를 사용했다.

6.6.3 필터가 할 수 있는 것들
필터는 컨트롤러태그 라이브러리에서 가능한 공통의 속성들과 거기에 애플리케이션 context까지 지원한다.

  • request: HttpServletRequest 객체
  • response: HttpServletResponse 객체
  • session: HttpSession 객체
  • servletContext: ServletContext 객체
  • flash: flash 객체
  • params: request 파라메터 객체
  • actionName: 다음 실행할(dispatch) 액션 이름
  • controllerName: 다음 실행할(dispatch) 컨트롤러 이름
  • grailsApplication: 현재 실행 중인 Grails 애플리케이션
  • applicationContext: ApplicationContext 객체

하지만 필터는 단지 컨트롤러와 태그 라이브러리의 일부 메소드만을 지원한다. 이것들은 다음과 같다.

  • redirect: 다른 컨트롤러와 액션으로 리다이렉트하려구...
  • render: 사용자 정의 응답을 표현하기 위해 사용

---
원문: 6.6 Filters
0 Comments
댓글쓰기 폼