본문 바로가기

Architecture for Software/Java

JSF의 변환(Conversion)과 검증(Validation)이란 무었인가?

JavaServer Faces에서는 입력되는 값들을 변환(Conversion)하고 검증(Validation)할 수 있는 표준적인 방안을 제공하고 있습니다.

이 방안을 통하여 여러분들은 언제나 쉽고 빠르게, 그리고 가장 중요한 점은 동일한 형태의 변환이나 검증을 할 경우 미리 만들어 놓은 검증기나 변환기를 재사용(Reuse)하여 원하는 어플리케이션을 보다 쉽고 빠르게 구축하실 수 있습니다.

이에따라 간략하게 JSF의 변환과 검증에 대하여 살펴보고자 합니다. 본 문서는 IBM developersWors의 JSF for nonbelievers: JSF conversion and validation라는 자료를 바탕으로 작성하였으며, Apress의 Pro JSF and AJAX란 책도 일부 참고하여 작성하였습니다.

 

여기서 중요한 점은 변환이란 무었이고 검증이란 무었인가?라는 것입니다.

변환이란 다음과 같은 것을 의미합니다.

  • String 값을 java.util.Date 객체로 변환하는 것입니다.
    즉 "20090107"이란 String 객체를 Date("20090107") 객체로 변환하는 것을 객체변환이라고 합니다.
  • String 값을 double으로 변환하는 경우도 있습니다.
    예를들어 "3.14159"란 String을 double pi = 3.14159로 사용하고 싶다면 타입변환을 하여야 합니다.

이러한 예를 통하여 변환이란 결국 객체를 다른 객체로 변환하거나, 객체를 다른 타입으로 변환하거나, 타입을 객체로 변환하는 것을 의미합니다.

 

그렇다면 검증이란 무었을 의미할까요? 예를 통하여 확인하여 보면 다음과 같습니다.

  • java.util.Date가 "yyyy-MM-dd HH24"와 같은 형식(format)인가? 를 확인하는 작업이 검증하는 작업입니다.
  • float의 값이 3.0에서 4.0 사이인지 확인하여 한다면 검증하여야 합니다.

이와 같이 검증은 무었인가의 값의 형식(format)이나 범위 등을 확인하는 작업입니다.

만약 검증하여야 할 대상의 형식이 복잡하다면 정규식(Regular Expression)을 이용하여 검증하실 수 있으며, 각 조건에 맞는 검증기 클래스(Validator Class)를 작성하실 수 있습니다.

 

변환(Conversion)과 검증(Validation)을 이해하였다면 JSF의 생명주기(Lifecyle)에 대하여 살펴볼 필요가 있습니다.

이 단계를 살펴보면 "Apply request values" 단계 후에 "Process Validations" 단계를 거치게 되어 있습니다. 이는 JSF를 바탕으로 구현된 어플리케이션의 경우 기본적으로 입력받은 값들을 검증하는 단계를 거치도록 되어 있다는 것입니다.

변환과 검증의 가장 중요한 목적은 모델을 업데이트하기 전에 값들이 정확한지 보장하기 위한 것입니다.

따라서 여러분들이 JSF를 사용하여 검증 및 변환을 한다면, JSF는 여러분들이 정의한 변환 규칙에 맞게 변환되는지 확인하고 변환할 것이며, 여러분들이 만든 검증 규칙에 맞는지 확인할 것입니다. 뭐 다른 Web 관련 UI Framework도 이런 규칙을 따르고 있잖아? 라고 말한다면 그 지적은 맞습니다. 하지만 JSF의 검증 및 변환에 관련된 라이프사이클을 조금 더 자세히 살펴본다면 약간 더 진보적이라는 것을 확인할 수 있습니다.

 

상기 그림에서도 나와 있듯이 JSF의 생명주기에서 "Apply Request Values" 단계에서 기본적인 변환이 일어납니다. 아울러 사용자가 정의한 변환도 이 때 일어납니다. 이는 다른 UI 관련 프레임웍과 차별화된 부분입니다.

JSF에서는 기본적으로 요청된 값들을 적용할때 값들을 객체로 변환하거나 지정된 타입으로 변환합니다. 거의 모든 다른 UI 프레임웍에서는 그냥 String 값인 상태로 전달되지만 JSF는 비즈니스 로직에 맞는 모델에 맞는 객체나 타입으로 변환시켜줌으로써 모델의 들어가는 값의 안전성과 신뢰성을 높입니다.

이는 중요한 사항입니다. 여러분은 아직도 HttpServletRequest 객체에서 request.getParameter("XXX");를 통해서 View에서 전달된 값을 일일이 받아서 사용하거나, Spring MVC를 사용한다면 조금 더 향상은 되었겠지만 거의 비슷한 방법으로 View에서 전달된 값을들 Business Logic이 담긴 Controller와 같은 클래스로 넘기고 있을 것입니다.

Spring Framework을 사용한다고 하여 값의 변환을 자동으로 시켜주지는 않습니다. 이것이 다른 UI 프레임웍과 JSF의 가장 근본적인 차이점중에 하나입니다.

아울러 JSF는 변환 단계 후 검증 단계를 실시합니다.

이 검증 역시 표준적인 검증과 사용자 정의 검증을 통하여 값들을 형식이나 범위등을 확인합니다. 검증할 범위가 특이하거나 일반적이지 않은 형식을 검증하여야 할 경우에는 사용자 정의 검증을 할 수 있습니다.

한가지 주의하여야 할 점은 javax.faces.component.UIInput을 상속받은 javax.faces.component.html.HtmlInputText나 javax.faces.component.UISelectOne 컴포넌트의 경우 immediate라는 속성을 true라고 지정하면 아래 그림과 같이 JSF의 생명주기가 바뀝니다.

immediate 속성의 기본값은 false인데, true로 설정하면 상기 그림과 같이 "Apply Request Values"에서 변환과 검증을 합니다.

immediate 속성에 대한 자세한 내용은 다음에 다루겠습니다. 당근 값을 즉시 전달하는데 사용하는 옵션입니다.

 

다음에는 JSF의 변환에 대하여 자세하게 알아보겠습니다. 먼저 확인하고 싶으신 분은 IBM developersWors의 JSF for nonbelievers: JSF conversion and validation라는 자료를 보시기 바랍니다. 설명이 참 잘되어 있습니다.

감사합니다. ;-)