바라기의 이야기

다중 웹서버 구성시 리프레쉬 문제 본문

Develop/Domino

다중 웹서버 구성시 리프레쉬 문제

baragi76 2010. 3. 16. 09:54

예를들어...
시스템 구성이 아래와 같이 되어있다고 가정을 할때.
----------------------------------------------------
어플리케이션(결재) 서버 : app.company.com
메일서버 : mail.company.com
----------------------------------------------------

시스템에서의 처리는 당연 결재서버 또는 메일서버를 Primary Server로 구성하고 나머지 서버는 Secondary Server로 구성하여 프로그램상으로 개발하는데는 문제점이 없도록 하고 있습니다.
하지만 웹브라우저상에서 처리되어야 하는 코드중에 이런것이 있습니다.

1) 결재 처리요청 메일 발송
2) 결재자 결재요청 메일 수신
3) 결재할 문서 목록에서 문서를 클릭 (app.company.com)
4) 승인버튼 클릭하여 결재처리 (app.company.com)
5) 결재자에게 발송된 결재요청메일 삭제 (mail.company.com)
6) 결재할 문서 목록 갱신 (app.company.com)

위와같은 순서로 처리되는 경우,
5) -> 6) 항목으로 넘어가는 과정에서 웹브라우저상 권한없음 오류가 발생할 수 있습니다.
이는 DB ACL 문제가 아니며 브라우저상 도메인이 다른 페이지에 대한 자바스크립트 접근권한이 없다는 경고입니다.

물론 5)번 항목 처리시 새창을 오픈해서 처리하고 닫아버리면 될수도 있는 문제겠지만, 창이 열리고 닫히고 그러면 싫어할 사람들이 많죠.
아니면 document.domain = "company.com"; 코드를 화면에 보여지는 모든 페이지에 추가하면 되는 문제일 수도 있습니다.  하지만 연동되는 타시스템이 있다면 이걸 맞춰주는것도 쉬운 문제는 아닐듯 합니다.

다른 방법에 대해서 설명을 하겠습니다.
5) 번 항목에서 결재 요청메일을 삭제하고 나서는 화면이 어떻게 되어야할지 보통적으로 에이전트에서 자바스크립트 형식으로 프린트를 합니다.

print |<script>
        try
        {
                opener.window.location.reload();
                window.close();
        }
        catch( e )
        {
                var actionURL = "http://app.company.com/refresh.nsf/Refresh?CreateDocument";
                var _form = document.createElement("form");
                _form.action = actionURL;
                _form.method = "post";
                // saveoptions 필드를 0으로 두어야 필요없는 문서가 DB에 저장되지 않습니다.
                var _saveoption = document.createElement( "<input type=hidden name='saveoptions'>" );
                _form.appendChild(_saveoption);
                document.body.appendChild(_form);
                _form.saveoptions.value = "0";
                _form.submit();
        }
</script>|

마지막에 처리될 코드이죠...

그럼 이것으로 끝나냐? 아니죠?
위의 코드에 보면 var actionURL = "http://app.company.com/refresh.nsf/Refresh?CreateDocument";
이라는 코드가 있습니다. 이는 refresh.nsf 라는 DB가 있어야 하며 그 DB에는 Refresh라는 양식이 있어야 합니다.
또한 var _saveoption = document.createElement( "<input type=hidden name='saveoptions'>" ); 이라는 부분이 있는데 이는 Refresh 양식에 saveoptions 필드가 있어야 존재해야 한다는 얘기가 됩니다.

그리고 또 중요한건...
Refresh 양식에 $$Return 필드를 두어 필요한 코드가 들어갈 수 있도록 합니다.
예를들어 "<script>opener.window.location.reload();window.close();</script>"라고 두면 상위 opener를 reload하고 창이 닫힙니다.


-------------------------------------
위와 같이 처리하는 이유는...
CreateDocument는 URL 호출이기 때문에 도메인과 상관없이 호출할 수 있으며, createdocument로 호출된 이후에는 opener와 같은 도메인인 app.company.com으로 변경되므로 opener를 자바스크립트로 접근하여 처리할 수 있게 됩니다.

다른 방법도 있겠지만, 여러가지로 응용하여 사용할 수 있는 코드입니다.