Chapter 6. 스트럿츠 구조
스트럿츠 컨트롤러 : Action Servlet, RequestProcessor, Action, ActionForm
1. ActionServlet에 사용자의 요청 전달 후 처리 절차
- 웹 애플리케이션 구동
- ActionServlet : 초기화되면서 각종 설정파일들 로드, Config class, requestProcessor 초기화
요청을 처리해줄 RequestProcessor를 찾아 요청 전달
- RequestProcessor : 요청URL에 따라 ActionForm을 생성후 요청 파라미터 전달
- Action : 비지니스 로직 수행 -> 수행 결과값을 ACtoinForm이나 스코프에 저장 -> RequestProcessor에 ActionForward 리턴
- RequestProcessor에서는 ActonForwrad에 따라 뷰 영역의 리소스(주로 JSP) 호출
- 뷰 영역 : 프레젠테이션 로직 수행 --> 수행결과(주로 HTML)를 사용자에게 전달
2. 컨트롤러 영역에서 개발자가 할 일
- Action 클래스, ActionForm 클래스 생성
- 스트럿츠 설정 파일에 어떤 요청 URL에 대해 어떤 ACtion과 ActionForm을 사용할지, 어떤 뷰를 호출할지 등록
3. MVC 계층간의 의존성
의존성
↓ |
뷰(View) |
↑
데이터 |
컨트롤러(Controller) |
모델(Model) |
- 사용자의 요청이 컨트롤러에 전달 - 컨트롤러는 모델 영역의 비지니스 로직 수행 - 결과 데이터를 뷰로 전달
- 뷰에서 모델로의 의존성, 데이터는 모델에서 뷰로 전달
3. MVC 계층간의 데이터 교환
3-1. Action
- Action에서의 비지니스 로직을 수행하는 것은 좋지 않다.
- Action 에서는 사용자의 요청 파라미터로부터 서비스 호출에 필요한 데이터를 모아 서비스를 호출하는 역할만 수행하도록 구현한다.
3-2. ActionForm
- ActionForm을 그대로 모델 영역에 전달하는 것은 좋지 않다.
- 모델 영역은 컨트롤러나 뷰 영역과 독립적이어야 한다.
- Action에서는 서비스를 호출할 때 ActionForm자체를 파라미터로 전달하는 것이 아니라
서비스 호출에 필요한 파라미터를 ActionForm에서 추출하여 파라미터로 전달.
- 비지니스 로직의 수행 결과는 DTO를 통해 전달되며, 이를 AcfionForm이나 요청스코프, 세션 스코프에 담아 뷰에 전달
4. ActionForward 에 의한 프리젠테이션 로직의 선택
- 어떤 비지니스 서비스를 호출할지는 개발자가 Action 소스 코드 안에 직접 구현 but, 로직 수행결과에 따라 어떤 뷰를 호출할 지는 설정파일로 정의.
- Action이 호출될 때 ActionMapping 객체를 통해 전달
- RequestProcessor는 Action 에서 리턴한 ActioForward의 정의에 따라 웹 리소스를 호출
5. 스트럿츠 태그 라이브러리
- 요청 스코프나 세션스코프에 저장되어있는 ActionForm 이나 개발자가 따로 저장한 데이터에 쉽게 접근할 수 있다.
- 자바 코드를 대신하는 태그를 제공, 소스가 깨끗해짐.
6. 스코프
- ActionForm도 결국 하나의 자바빈즈 --> ActionForm을 JSP에 전달하기 위해 스코프를 사용
- 페이지 스코프 : 해당 JSP에서만 유용하므로 사용 불가
- 애플리케이션 스코프 : 애플리케이션 전체에 공유되므로 스트럿츠의 각종 설정사항을 저장하는 용도로만 사용
- 요청 스코프 / 세션 스코프 : ActionForm 을 어디에 저장할 지는 스트럿츠 설정파일(struts-config.xml)에서 설정한다.
Capter 7. 간단한 어플리케이션
* 예제 중 SSG(Simple struts based Groupware) 중 비밀번호 변경 부분을 대상으로 분석해봄.
1. 요청의 수행
passwordModifiy.do
--> PasswordModify.jsp --> PasswordForm --> PasswordSaveAction
--> EmployeeService --> EmployeeDAO
1) PasswordForm
: org.apache.struts.action.ActionForm 클래스를 상속, 요청 파라미터로 전달되는 값들은 getter, setter 메소드를 정의해서 가져옴.
: 입력 파라미터의 무결성 검사를 수행하려면 validate() 메소드 호출하면 되나, 이 예제에서는 직접 구현했음.
2) PasswordSaveAction
: org.apache.struts.action.Action 클래스 상속
: execute() 메소드를 재정의하여 수행하고자 하는 작업을 구현
2. 모델 만들기
1) 퍼시스턴스 계층
: DAO(Data Access Object) 패턴을 구현한 것
: 데이터베이스 테이블에 대한 CRUD(Create, Read, Update Delete)를 전담
2) 서비스 계층
: 업무 단위별로 여러개의 DAO 관리, 이들간의 관계를 정의하는 비지니스 룰과 트랜잭션 관리
3. struts-config.xml 파일 설정과 Messager 정의
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<data-sources />
<form-beans>
<form-bean name="ApprovalPathListForm" type="com.eoffice.ui.approval.mgmt.ApprovalPathListForm"/>
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings>
<action path="/approval/mgmt/ApprovalPathList" scope="request" parameter="method"
input="/approval/mgmt/ApprovalPathList.jsp" name="ApprovalPathListForm"
type="com.eoffice.ui.approval.mgmt.ApprovalPathListAction">
<forward name="treeList" path="/approval/mgmt/ApprovalPathTreeList.jsp" redirect="false"/>
<forward name="body" path="/approval/mgmt/ApprovalPath.do"/>
</action>
</action-mappings>
<controller contentType = "txt/html; charset=utf-8" />
<message-resuorces parameter="resourse/messages"/>
</struts-config> |
1) config 파일
: "passwordModify.do" 정의 : 아무런 로직 없이 단순히 /hr/PasswordModify.jsp를 포워드한다.
: "passwordSave.do" 정의 : passwordForm을 사용하며 PasswordSaveAcion 클래스를 등록
: input 속성 : validate() 메서드 호출시 Actionerrors가 하나 이상 있는 경우 요청의 처리를 중단하고 호출할 페이지
: <foward> 요소 : Action의 수행결과에 따라 포워드할 뷰를 지정(여러개 지정 가능)
2) message 정의
: 리소스 번들의 위치를 지정하고, 해당 언어 파일을 읽어들인다.
: 사용자가 선호하는 언어별로 저장된 리소스 번들에서 "button.change"로 정의된 문장을 출력 <bean:message key-"buttion.change"/> |