Whiteship's Note


[봄싹] 모임 추가 시나리오 - web flow (구현)

모하니?/Coding : 2009.10.23 17:57


<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

    <secured attributes="ROLE_MEMBER" />
   
    <input name="studyId" required="true" type="java.lang.Integer" />
   
    <on-start>
        <evaluate expression="meetingService.createMeeting(studyId)" result="flowScope.meeting" />
    </on-start>
   
    <view-state id="addMeetingForm" model="meeting" view="add.jsp">
        <binder>
            <binding property="openDate" converter="shortDate" required="true" />
            <binding property="closeDate" converter="shortDate" required="true" />
            <binding property="openTime" converter="shortTime" required="true" />
            <binding property="closeTime" converter="shortTime" required="true" />
            <binding property="title" required="true" />
            <binding property="maximum" required="true" />
            <binding property="location" required="true" />
            <binding property="contents" required="true" />
        </binder>
        <transition on="proceed" to="addPresentationForm" />
        <transition on="submit" to="confrimMeetingDetail" />
        <transition on="cancel" to="cancel" bind="false" validate="false" />
    </view-state>
   
    <view-state id="addPresentationForm" model="presentation" view="presentation/add.jsp">
        <binder>
            <binding property="key" required="true" />
            <binding property="title" required="true"/>
            <binding property="topic" required="true"/>
            <binding property="summary" required="true"/>
            <binding property="presenter" converter="memberConverter"/>
        </binder>
        <on-render>
            <evaluate expression="meetingService.createPresentation(meeting)" result="viewScope.presentation"/>
        </on-render>
        <transition on="proceed" to="presentationList" history="discard">
            <evaluate expression="meetingService.addPresentation(meeting, presentation)"/>
        </transition>
        <transition on="cancel" to="cancel" bind="false" validate="false" />
    </view-state>

    <view-state id="presentationList" view="presentation/list.jsp">
        <transition on="delete" to="presentationList">
            <set name="requestScope.presentationKey" value="requestParameters.presentationKey" />
            <evaluate expression="meetingService.deletePresentation(meeting, presentationKey)" />
        </transition>
        <transition on="new" to="addPresentationForm" />
        <transition on="submit" to="confrimMeetingDetail" />
        <transition on="cancel" to="cancel" bind="false" validate="false" />
    </view-state>

    <view-state id="confrimMeetingDetail" view="confirmMeeting.jsp">
        <transition on="submit" to="submit" />
        <transition on="cancel" to="cancel" bind="false" validate="false" />
    </view-state>
   
    <end-state id="meetingEnd" view="externalRedirect:contextRelative:/study/view/${studyId}.do" />
   
    <end-state id="submit" commit="true" parent="#meetingEnd">
        <on-entry>
            <evaluate expression="meetingService.addMeeting(studyId, meeting)"/>       
        </on-entry>
    </end-state>

    <end-state id="cancel" parent="#meetingEnd" />

</flow>

일단, 이 플로우로 진입하면, addMeetingForm 뷰로 이동, 여기서 나온 transition에 따라 contirmMeetingDetail로 바로 가거나, addPresentationForm으로 이동.

addPresentationForm에서 presentationList로 이동하고, 여기서는 back할 수 없도록 history를 discard로 설정함.

대략 80 줄 정도의 XML 설정으로 아침에 구상한 플로우를 구현했습니다. 이 시나리오를 구현하는데 필요한 자바 코드는 서비스 메서드 몇 개 정도. 컨트롤러 코드는 하나도 없습니다. 만약 웹 플로우 없이, 스프링 MVC만을 이용해서 비슷한 플로우를 구현했다면 훨씬 복잡하고 코드도 길었을 텐데 다행입니다. 웹 플로우 사용법도 생각보다 간편하고 쉬웠던 것 같네요.

이제는 웹 플로우 테스트와 <persistent-context />에 대해 좀 알아봐야겠습니다.

top


[봄싹] 모임 추가 시나리오 - web flow

모하니?/Coding : 2009.10.23 11:49


모임을 추가할 때, 해당 모임에 있을 발표에 관한 정보도 추가하도록 웹 플로우를 구상했습니다. 단순 폼 처리보다 훨씬 복잡해질 수 있어서, 스프링 웹 플로우를 도입하기로 했죠. 그런데 막상 기본적인 사용법을 보고나니, 시나리오가 정해지지 않으면 개발을 진행하지 못하겠더군요. 그래서 구상에 들어갔습니다.

모임을 추가하고나서, 발표를 추가해야지.. 발표가 하나만 있는건 아니자나.. 그럼 한 화면에서 여러개를 추가할까?? 에이.. 뭔가 좀 거시기 하네.. 그럼 발표를 하나 추가하고, 발표 목록을 본 다음에 다시 하나 더 추가하고 이렇게 할까?


그래서 그린게 위와 같은 그림입니다. 그런데, 발표자가 확정되지 않았거나, 특정 발표 없이 진행되는 모임이라면 어찌할까? 그때도 무조건 발표 입력 폼을 들려야 하나.. 파란 부분을 서브 플로우로 묶었을 때, MeetingDetial에서 PresentationList로 back 할 수 있을까?  흠 뭐. 일단은 된다는 가정하에.

발표 정보가 한 개 있다면, MF -> PF -> PL -> MD
발표 정보가 두 개 있다면, MF -> PF -> PL -> PF -> PL -> MD
발표 정보가 없다면, MF -> PF -> PL -> MD

이상해.. @_@ 발표정보가 없는데 발표 폼이랑 발표 리스트를 들려야 하다니... 만약에 발표 폼 바인딩에 validation을 해야 하는 상황이면, 발표가 한 개있을 떄랑 발표가 없을 떄를 어떻게 구분한담... @_@ 안돼 안돼..

흠.. 그럼 PresentationList를 먼저 보여주면 어찌 될까나? 그려보지뭐..


발표 정보가 한 개 있다면, MF -> PL -> PF -> PL -> MD
발표 정보가 두 개 있다면, MF -> PL -> PF -> PL -> PF -> PL -> MD
발표 정보가 없다면, MF -> PL -> MD

아... 아닌데, 발표도 없는데 PL을 들릴 필요는 없자나..
그리고 발표를 추가할껀데, PL 부터 들리는 것도 불편하고.
이건 뭐.. 이전 보다 오히려 들려야 하는 폼 수가 늘어났자나.. @_@;;

0. 다시 PF가 진입점이 되도록 수정.
1. MF에서 MD로 바로 갈 수 있는 transition 추가.
2. MD에서 PL로 진입할 수 있는지 확인.(진입할 수 없다면, 서브 플로우 포기)


보자...

발표가 한 개 일 때, MF -> PF -> PL -> MD
발표가 두 개 일 때, MF -> PF -> PL -> PF -> PL -> MD
발표가 없을 때, MF -> MD

오퀘.. 이렇게 가야겠군!!!

top