'개발/SPRING'에 해당되는 글 3건

  1. 2008.09.04 View Resolver
  2. 2008.09.04 Spring Exception
  3. 2008.09.01 SimpleFormController

View Resolver

개발/SPRING 2008. 9. 4. 16:10 |

View Resolver

핸들러(controller)는 요청을 처리 한 뒤 ModelAndView 객체를 넘겨준다. 이 때 이 객체에 view의 이름을 같이 넘겨 주는데 이 이름으로 실제 view를 찾아 주는 역할을 하는 것이 View Resolver이다.
Spring이 제공하는 View Resolver들은 다음과 같다.

ViewResolver 설명
AbstractCachingViewResolver View 들을 cashing하는 기능 제공
XmlViewResolver ViewResolver 의 구현체로 XML파일 사용(/WEB-INF/views.xml 을 기본 설정파일로 사용)
ResourceBundleViewResolver ViewResolver 의 구현체로 리소스 파일 사용(views.properties 를 기본 리소스 파일로 사용)
UrlBasedViewResolver ViewResolver 의 구현체로 특별한 맵핑 정보 없이 의미상 view 이름을 URL로 사용(View 이름과 실제 view 자원과의 이름이 같을 때 사용)
InternalResourceViewResolver UrlBasedViewResolver 를 상속 받았으며 InternalResourceView(Servlet, JSP)를 사용
VelocityViewResolver/FreeMarkerViewResolver UrlBasedViewResolver 를 상속 받았으며 VelocityView 와 FreeMarkerView를 사용

사용하려는 기술에 따라 위와같은 View Resolver를 적절히 선택하여야한다.


  • JSP 사용

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


    viewResolver는 action 요청 처리 후 사용자에게 보여줄 view를 찾는 역할을 하고 prefix와 suffix를 지정해 줄수 있다. 만약 controller에서 넘겨준 modelAndView 값이 index이고 prefix를 "/jsp/", suffix를 ".jsp"라고 정의 했다면 이 viewResolver는 "/jsp/index.jsp"를 찾게 된다. 이러한 viewResolver 정보를 변경함으로써 Velocity, Excel, PDF등을 View로 이용하는 것이 가능하다.

  • JSTL 사용

    <bean id="jspViewResolver" 
       class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
      <property name="prefix" value="/WEB-INF/jsp/"/>
      <property name="suffix" value=".jsp"/>
    </bean>

    만약 JSTL 태그를 사용한다면 viewClass 특성을 설정함으로써 InternalResourceView를 JstlView로 대체해야 한다. JstlView도 요청을 JSP에 전달한다.

Posted by 무리미
:

Spring Exception

개발/SPRING 2008. 9. 4. 16:05 |

Spring이 제공하는 예외 클래스 계층도


그리고 아래는 간단한 설명
예외 클래스 설명
CannotAcquireLockException update 과정에서 lock에 실패
CannotSerializeTransactionException update 충돌로 serialized 모드의 트랜젝션 실패
CleanupFailureDataAccessException CRUD 오퍼레이션은 성공했으나, DB 리소스 회수에 실패한 경우(예: Connection close 실패)
ConcurrencyFailureException 동시 접근 제어 실패
DataAccessResourceFailureException DB 연결 불능과 같은 DB 리소스 문제
DataIntegrityViolationException 데이터 무결성 규칙에 위배되는 insert/update를 시도
DataRetrievalFailureException 아무 데이터도 추출하지 못함
DeadlockLoserDataAccessException Dead-lock 문제로 트랜젝션 무효화
EmptyResultDataAccessException 하나 이상의 결과가 나와야 하는 상황에서 결과가 없음
IncorrectResultSizeDataAccessException 예상되는 결과와 다른 수의 데이터가 반환
IncorrectUpdateSemanticsDataAccessException update 과정에서 예기치 못한 일 발생. 잘못된 트랜젝션 Roll-back 안됨.
InvalidDataAccessApiUsageException 기반 API를 잘못 사용
InvalidDataAccessResourceUsageException SQL 문법 오류와 같은 DB 리소스 오용
OptimisticLockingFailureException optimistic locking 위반. DBMS가 아닌 ORM이나 DAO 구현에서 throw
PermissionDeniedDataAccessException 접근 권한 오류
PessimisticLockingFailureException DBMS에서 포착한 pessimistic locking 위반.
TypeMismatchDataAccessException 자바 타입과 데이터 타입 불일치
UncategorizedDataAccessException 미분류

Posted by 무리미
:

SimpleFormController

개발/SPRING 2008. 9. 1. 13:18 |
org.springframework.web.servlet.mvc
Class AbstractFormController
 
요청으로부터 폼 빈을 자동으로 채워주는 폼 컨트롤러이다. 요청마다 새로운 빈 인스턴스를 사용하거나, sessionForm 프로퍼티가 true로 설정되어 있을 경우, 동일한 빈 인스턴스를 사용한다.
이 클래스는 SimpleFormController와 AbstractWizardFormController와 같은 프레임워크의 하위 클래스들과 사용자가 제공하는 사용자 정의 폼 컨트롤러를 위한 기본 클래스이다.
폼 입력 뷰와 전송 후 뷰 모두 프로그램에서 제공되어야 한다. 환경 설정 프로퍼티를 사용해 이러한 뷰들을 제공하려면 SimpleFormController를 참조하여라.
하위 클래스들에서는, 폼 뷰를 마련하고 show   Form과 전송 요청 처리를 위해 processFormSubmission을 재정의할 필요가 있다. 후자의 경우, 타입 불일치와 같은 바인딩 에러들은 제공된 "errors" 홀더를 통해 보고될 것이다. 추가적인 사용자 정의 폼 유효성 검사의 경우, BaseCommandController로부터 상속된 validator 프로퍼티를 사용해 동일한 "errors" 인스턴스를 통해 보고될 수 있다.
이 컨트롤러를 Struts의 Action과 비교해보면, Spring의 경우, Struts의 'ActionForm' 처럼 프레임워크에 종속되는 클래스를 구현하지 않고도 일반적인 JavaBeans나 데이터베이스 백엔드 JavaBeans를 사용할 수 있다. Date, Locale, 어플리케이션만의 고유 타입이나 복합 타입과 같이 JavaBeans의 보다 복잡한 프로퍼티들도, java.beans.PropertyEditor를 통해 표현 및 컨트롤러로의 전송이 가능하다.
 
작업 흐름
1. 컨트롤러는 새로운 폼에 대한 요청을 받는다 (대개 GET 방식이다).
2. formBackingObject()를 호출한다. 이 메소드는 디폴트로 commandClass 프로퍼티에 지정된 인스턴스를 반환한다. 그러나, 이것 역시 데이터베이스로부터 추출된 객체를 받는 것처럼 재정의 될 수 있다 (이는 대개 폼을 사용하여 수정될 필요가 있는 정보일 것이다).
3. initBinder()를 호출한다. 이 메소드를 통해 사용자는 커맨드 클래스의 특정 필드에 대한 사용자 정의 editor를 등록할 수 있다. 예를 들면, 이 과정을 통해 특정 로케일의 날짜 정보를 String 타입으로 보여줄 것이다.
4. bindOnNewForm이 true로  설정되어 있을 경우, 초기 요청 파라미터들을 가지고 새로운 폼 객체에 값을 채우는데 ServletRequestDataBinder가 적용되며, onBindOnNewForm(HttpServletRequest, Object, BindException) 콜백 메소드가 호출된다.
주: 이 시점에서는 부분적인 바인딩을 허용하기 위한 정의된 어떠한 Validator들도 적용되지 않는다.  그러나, (DataBinder.setRequiredFileds(String[]) 처럼) initBinder()를 통해 적용되는 사용자 정의 Binder는 여전히 적용된다. 그러므로, 만약 bindOnNewForm=true와 initBinder()를 정의해, Validator 대신 필드 유효성 검사를 수행하게 되면, 새로운 폼에 몇몇 필드들만이 채워지게 되어, 잠재적인 바인딩 에러를 발생시켜 errors 객체들을 채우게 될 경우가 있다. 바인딩 에러를 보여주는 뷰에서는 초기 폼 뷰를 보여주는지 일련의 결과를 보여주는지를 판단하는 기능을 갖출 필요가 있다. 이리하면, 전자의 경우에 대한 에러를 보여주는 사태를 방지할 수 있다.
5. showForm()을 호출한다. 이 메소드는 보여질 View를 반환한다 (대개 이 뷰는 폼을 보여주는 뷰일 것이다). 이 메소드는 하위 클래스에서 반드시 구현되어야 한다.
6. showForm()을 구현한 곳에서는 referenceData()를 호출한다. 메소드를 구현하여 폼 편집 시 필요한 관련 레퍼런스 데이터를 제공할 수 있다 (즉, Locale 객체 List를 제공해 사용자가 폼에서 이들 중 하나를 선택하도록 할 수 있다).
7. Model이 노출되고 뷰가 보여진다. 사용자는 폼에서 값을 채워나갈 수 있게 된다.
8. 컨트롤러는 폼 전송 요청을 받는다 (대개 POST 방식). 폼 전송을 감지하는데 있어 서로 다른 방법을 사용하려면 isFormSubmission() 메소드를 재정의 한다.
9. 만약 sessionForm이 설정되지 않았다면, formBackingObject()가 호출되어 폼 객체가 추출된다. sessionForm이 설정되어 있다면, 컨트롤러는 세션에 이미 바인딩 된 커맨드 객체를 찾으려 시도한다. 만약 어떠한 객체도 발견하지 못할 경우, 컨트롤러는 handleInvalidSubmit()을 호출한다. 이 메소드는 디폴트로 새로운 폼 객체를 생성하고 폼 재전송을 시도한다.
10. 현재 요청 파라미터들로 폼 객체를 채우는데 ServletRequestDataBinder가 적용된다.
11. onBind(HttpServletRequest, Object, Errors) 메소드를 호출한다. 이 메소드를 사용하면 바인딩 후, 유효성 검사 전에 사용자가 정의한 작업들을 수행할 수 있다 (예를 들면, 직접 요청 파라미터들을 빈 프로퍼티에 설정하는 것을 들 수 있다).
12. 만약 validateOnBinding이 설정되어 있다면, 등록된 Validator가 호출된다. Validator는 폼 객체 프로퍼티들을 검사하고 전달받은 Errors 객체를 통해 대응되는 에러들을 등록한다.
13. onBindAndValidate() 메소드를 호출한다. 이를 통해 사용자는 바인딩과 유효성 검사 이후 사용자 정의 작업을 수행할 수 있다 (예를 들면, 직접 요청 파라미터들을 바인딩 하여 Validator를 통해서가 아니라 직접 검사한다).
14. processFormSubmission() 메소드를 호출하여 전송을 처리한다. 이 메소드는 하위 클래스에서 구현되어야 한다.
 
세션 폼 모드의 경우, 세션에 존재하는 폼 객체 없이 전송하는 것은 유효하지 않으며 이는 브라우저에 의해 재전송/새로 고침하는 경우와 같다. 그런 후, handleInvalidSubmit() 메소드가 호출되는데, 이는 디폴트로 재 전송을 시도한다. 하위 클래스에서는 대응되는 메시지를 보여주거나 새로운 폼으로 리다이렉트 시켜 데이터 전송이 중복되는 것을 방지하기 위해 이 메소드를 재 저으이할 수 있다. 그 경우, 세션에 있는 폼 객체는 트랜잭션 토큰으로 생각될 수 있다.

뷰에서는 세션으로부터 폼 빈을 절대 추출해서는 안된다. 폼 컨트롤러에 의해 폼 빈이 마련될 때, 뷰는 항상 요청으로부터 폼 빈을 추출해야 한다. Velocity와 같은 몇몇 기술에서는 HTTP 세션에조차 접근할 수 없다는 사실을 명심하여라.

 - referenceData(): 커맨드 객체 이외의 데이터가 필요할 때. showForm() 이 호출 될때 호출 된다.
- initBinder(): 바인터에 Custome property editor 등록하는데 사용.
- onBind(): 고유의 바인딩 방안을 적용하려고 할 때 사용. 자바 스크립트나 hidden 필드를 없앨 수 있다.
- onBindAndValidate(): Validator 없이 혹은 Validator로는 불가능한 validation을 수행하고자 할 때.
- ModelAndView onSubmit(), void doSubmitAction(): 데이터바인딩과 validation이 성공한 이후에 호출
- isFormChangeRequest(): 폼 제출 이전에 화면 변화가 필요한 경우. 가령, 국가를 선택한 이후에 관련 도시가 나타나는 폼을 처리하는 경우가 예가 된다.- formView, successView: 폼(form)을 포함하는 뷰와 폼 제출 및 처리 이후에 보여질 뷰의 이름. 더블 서밋 문제 해결을 위해서 successView 이름 앞에 redirect: 접두어를 붙이면, POST 이후에 연이어 GET 요청을 발생시켜서 form이 재전송 되는것을 방지해준다.
- sessionForm: 폼이 처음 보여질 때 새로운 객체를 생성할 것인지와 세션에 객체를 저장할지 여부를 결정. 커맨드 객체가 DB오퍼레이션을 요구하는 경우처럼 성능 이슈가 있는 경우는 true를 고려해봐야 한다. 디폴트는 false
bindOnNewForm: true로 설정하여 새로운 폼이 보여지는 시점에서 바인딩이 이뤄지게 할 수 있다. 디폴트는 false.validators: 데이터 바인딩 이후의 validation 작업을 수행할 객체 지정
validateOnBinding: 디폴트는 true이며, false 지정시 validation이 일어나지 않음
commandName: 디폴트인 command를 다른 이름으로 변경하고자 할 때
commandClass: 설정한 클래스의 인스턴스를 기본 form-backing 객체로 사용함. 부모 클래스의 formBackingObject() 구현에 의하면 디폴트 생성자로 commandClass 인스턴스를 생성한다.

Posted by 무리미
: