IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  Lotus | 웹 아키텍처 | XML  >

IBM Lotus Domino 애플리케이션에 어웨어니스(awareness) 추가하기 (한글)

인스턴트 메시징에 Ajax 사용하기

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

토론

샘플 코드


제안 및 의견
피드백

난이도 : 초급

Tomas Nielsen, Senior system architect, Strand Interconnect

2007 년 2 월 13 일

인트라넷이나 웹 애플리케이션에 누가 접속해있는지를 확인하고, 그 사람들에게 인스턴트 메시지를 보냅니다. 이 글에서는 IBM Lotus Domino와 AJAX(Asynchronous JavaScript and XML)을 사용하여 Domino 웹 애플리케이션이나 인트라넷 사이트에 어웨어니스(awareness)를 추가하는 방법에 대하여 설명합니다.

IBM Lotus Notes는 6.5 버전부터 표준 Notes 메일 템플릿을 비롯하여 통합 인스턴트 메시징과 상태 인식(presence awareness) 서비스를 제공하기 시작했고, 개발자들은 자신들의 커스텀 애플리케이션에 같은 기능을 추가할 수 있게 되었다. Asynchronous JavaScript and XML (Ajax)을 사용하여 Domino 웹 애플리케이션에도 같은 기능을 추가할 수 있다.

이 글에서는 웹 애플리케이션에 누가 온라인인지를 확인하고, 사용자들간 실시간 인터랙션(역주:상호작용)을 하는 기술을 설명한다. IBM Lotus Domino, JavaScript, DHTML을 이해하고 있다면 이 글을 읽는데 큰 도움이 될 것이다. Awareness.nsf 라고 하는 샘플 데이터베이스(다운로드)에는 이 글에서 설명할 어웨어니스 애플리케이션 예제가 포함되어 있다.

주: 어웨어니스 샘플 애플리케이션(Awareness.nsf)의 기본 기능은 몇 가지 디자인 객체들로 구성된다. 이 글에서는 가장 중요한 객체들만 설명할 것이므로, 상태 복원 같은 태스크를 수행하는 보조 객체들은 여러분 스스로 공부해야 한다.

온라인 사용자 리스트를 애플리케이션에 추가하기

연락처 리스트를 나타낼 JavaScript 코드를 삽입하여 어떤 애플리케이션 페이지에나 온라인 사용자 리스트를 추가할 수 있다. 그림 1은 온라인 사용자 모습이다.


그림 1. 페이지에 JavaScript 코드 삽입하기
Include some simple JavaScript code on your pages

사용자 사진이나 이름을 클릭하면 그림 2와 같은 인스턴트 메시징 창이 뜬다.


그림 2. 인스턴트 메시징 대화 시작하기
Initiating an instant messaging conversation

그림 3은 응답하는 모습이다.


그림 3. 인커밍 인스턴트 메시지에 응답하기
Response to an incoming instant message



위로


작동 방법

온라인 상태로 되어 있는 사용자 리스트를 관리하려면, 로그인 했던 각 사용자에 대한 에이전트를 지속적으로 실행하는 HTML과 JavaScript가 필요하다. 에이전트는 각 사용자의 최종 접속 시간을 표시한 타임스탬프를 기반으로 사용자 문서를 관리한다. 이 타임스탬프가 2분 미만일 경우 사용자가 온라인 상태에 있는 것으로 정의한다. 하나의 뷰에서 온라인 사용자 리스트를 관리할 때, @DbColumn 식을 사용하면 쉽게 디스플레이 할 수 있다.

이제, 온라인 상태로 되어 있는 사용자들과 통신하는 방법에 대해 알아보자. 에이전트는 각 사용자에 대해 지속적으로 실행되고 있기 때문에, 해당 사용자에게 전달될 메시지가 존재하는지의 여부를 감시할 수도 있다. 메시지가 있다면, 에이전트는 JavaScript 코드를 출력하여 메시지를 담고 있는 팝업 창을 연다.

실제 작업을 수행하는 네 개의 주요 디자인 엘리먼트들이 있다.

  • Awareness.js 스크립트
  • refreshUserMsg 에이전트
  • Refresh_Logged_in_user_list 에이전트
  • e-msg 폼

온라인 상태에 있는 사용자 보여주기: Awareness.js

이 페이지에는 웹 페이지 상의 온라인 사용자를 보여주는 JavaScript 코드가 포함된다. 실제 디자인은 그림 4와 같다. 웹 페이지에 어웨어니스를 추가하려면, 페이지에 JavaScript 레퍼런스를 추가하면 된다.

주: Awareness 데이터베이스에 예제를 포함시켰다. 포함(inclusion)의 예제의 시작 페이지를 보자.

그림 4는 IBM Lotus Domino Designer에서 캡쳐한 Awareness.js 페이지이다. 첫 번째 라인을 보면, document.write() 메소드를 사용하여 웹 페이지에 0*0 픽셀의 숨은(hidden) iFrame을 놓는다. 이 iFrame의 콘텐트는 refreshUserMsg 에이전트이다. 물론, iFrame을 사용자는 볼 수 없다. 대신, Ajax 호출을 호스팅하는데 사용된다.


그림 4. Lotus Domino Designer의 Awareness.js 페이지
The Awareness.js page in Lotus Domino Designer

주: 이 페이지의 하단에 있는 <Computed Value> 엘리먼트는 이름 앞에 사진이 있는 사용자 리스트를 디스플레이 하는 코드이다. 이 기능은 포토 리스트가 있는 경우에 사용한다.

마지막 라인은 에이전트가 관리하는 온라인 사용자들을 검색하고 @Implode 함수를 사용하여 그 리스트와 HTML 코드를 결합하여 사용자가 또 다른 사용자의 이름이나 사진을 클릭할 때 메시지 창을 띄운다.

에이전트를 통해서 온라인 사용자 리스트 관리하기: refreshUserMsg

refreshUserMsg 에이전트는 Awareness.js 스크립트가 만들었던 iFrame에 의해서 로딩된다. 이 에이전트는 다음 세 가지 태스크를 수행한다.

  • 사용자의 온라인 상태를 업데이트 한다.
  • 전달할 메시지가 있는지 여부를 검사하고, 있을 경우 전달한다.
  • 일정 시간 후에, 에이전트를 재 로딩하는 타이머를 설정한다. (이 기능을 통해서 에이전트가 새로운 메시지를 계속해서 등록한다. 만일 이 태스크가 수행되지 않으면, 사용자가 웹 애플리케이션에서 페이지를 재 로드 하거나 변경할 때만 전달될 수 있다.)

Listing 1은 이 에이전트의 Initialize 섹션 모습니다.


Listing 1. refreshUserMsg 에이전트의 Initialize 섹션 모습
				

Sub Initialize

	Dim session As New notessession

	Dim doc As notesDocument

	Dim db As NotesDatabase

	Set db = session.CurrentDatabase

	Set doc = session.documentContext

	Print "Content-type:text/html" 

' Format a nice header telling the content type.

	Print ""

	Print |<SCRIPT Language="JavaScript">|

	Print |<!--|

	' Check if user is registered. Set status.

	Call RefreshUser(db, doc)

	' Check for messages.

	Call Check_Messages(db, doc)

	' Check for messages regularly. 

' Specify your polling time here in milliseconds.

	Print |timerID = setTimeout("document.location.reload()",1000);|

	Print |//-->|

	Print |</script>|

End Sub


첫 번째와 두 번째 Print 라인은 객체의 콘텐트 유형을 Web 브라우저로 설정한다. 이러한 방식으로 Lotus Domino는 기본 HTML 헤딩을 삽입하지 않기 때문에 요청을 몇 바이트 정도 줄일 수 있다.

Text/html 대 text/javascript
일부 독자들은 우리가 text/javascript 콘텐트 유형을 사용하지 않는 것에 대해 유감을 표시하겠지만, 이는 대부분의 웹 브라우저에서 보안 경고를 만들어냈다. iFrame 내에 JavaScript 코드를 두는 것은 안전하지 않지만, HTML 페이지와 JavaScript 코드는 안전하다.

Listing 2는 사용자가 시스템에 액세스 하면 각 사용자에 대한 문서를 만드는 모습이다. 그 이후에, 코드는 각 요청에 대해 사용자 문서를 업데이트 한다. 사용자 상태 문서가 2분 안에 수정된다면, 사용자가 온라인인 것으로 간주된다.

온라인 사용자 리스트를 관리하는 RefreshUser에 대한 호출과 Check_Messages sub에 대한 호출 방법에 주목하라. 이 에이전트는 1000 밀리초가 지난 후에 iFrame을 재 로드 하는 setTimeout 타이머를 설정하면서 끝난다.


Listing 2. RefreshUser sub
				

Sub RefreshUser(db As NotesDataBase, doc As NotesDocument)

	Dim uDoc As NotesDocument

	Dim view As NotesView

	Set view = db.GetView("Users")

	' Find the users status document.

	Set uDoc = view.GetDocumentByKey(doc.Remote_User(0), True)

	If Not uDoc Is Nothing Then ' Set the users status to logged in.

		uDoc.status = "Online"

	Else ' Create a status document for first timers.

		Set uDoc = db.CreateDocument

		uDoc.Form = "user"

		Dim userName As New NotesName(doc.Remote_User(0))

		uDoc.userCN = userName.Common

		uDoc.user   = userName.Canonical

		uDoc.status = "Online"

	End If

	Call uDoc.Save(True, True)

End Sub


Listing 3에 있는, 에이전트의 마지막 Sub은 현재 처리해야 하는 e-msg 폼에 대해 사용자 이름을 체크한다. 매치가 되면, 에이전트는 메시지를 포함하고 있는 팝업 창을 연다. 메시지를 여는 JavaScript 코드를 설정하는 Print 라인을 주목하라.


Listing 3. Check_Messages sub
				

Sub Check_Messages(db As NotesDatabase, doc As NotesDocument)

	Dim view As NotesView

	Set view = db.GetView("e-msg (not delivered)") 

' Check for messages.

	Dim mDoc As NotesDocument

	Set mDoc = view.GetDocumentByKey(doc.Remote_User(0), True)

	If Not mDoc Is Nothing Then ' User got messages!

		mDoc.delivered = "1" ' Flag as delivered.

		Call mDoc.Save(False, False)

		' Bring up the pop-up.

		doc.thisDb = Evaluate(|@WebDbName|)

		thisDb = doc.thisDb(0)

		Print |iMsg = window.open('/| + thisDb + 

|/e-msg?openForm&to=| + mDoc.fromEncoded(0) + |&unid=| 

+ mDoc.UniversalID + |', 

'','height=220,width=250,resizable=yes,left=500,top=60');|

	End If

End Sub


에이전트를 통해서 사용자 로그 오프 확인하기: Refresh_Logged_in_user_list

refreshUserMsg 에이전트는 각 사용자에 대한 문서를 업데이트 하면서, 문서에 새롭게 수정된 날짜를 부여한다. 사용자가 어웨어니스 실행 페이지들 중에 남아있다면, 그 사용자는 증가하는 타임스탬프가 있는 사용자 문서를 갖게 된다. 사용자가 브라우저를 닫거나 애플리케이션을 남겨놓으면, 타임스탬프는 중지한다. 예정된 에이전트가 타임스탬프를 체크하여 어떤 사용자가 온라인 상태가 아닌지를 파악하고 사용자 상태를 리셋한다.

사용자가 오프라인 상태가 되는 시간을 2분으로 설정했다. 에이전트는 Listing 4를 참조하라.


Listing 4. Refresh_Logged_in_user_list 에이전트
				

SELECT Form = "user" & status != "not logged in" 

& @Adjust(@Now;0;0;0;0;-2;0) > @Modified;

@Do(

@SetField("status" ; "not logged in")

)


하나의 뷰에서 이 태스크를 수행할 수 있었지만, 코딩 가이드라인을 무시하고 뷰에서 @Now를 사용할 때 어떤 문제가 생기는지는 여러분도 알 것이다. 에이전트는 Lotus Domino에서 허용한 빈도수 대로 실행되고(5분 간격으로), 사용자가 로그오프 한 후에도 2분 이상 사용자는 온라인 상태로 남아있게 된다.

폼을 통해서 메시지 송수신 하기: e-msg

그림 5의 e-msg 폼은 송신 메시지를 정의한다. 메시지 교환을 시작하고 읽고 답장하는 데에도 사용된다. 폼은 언제나 ?OpenForm URL 명령어를 사용하여 열린다. 이 폼은 보내진 메시지를 읽는 데에도 사용된다. 이 명령어를 사용하여 같은 페이지에서 직접 응답을 만들 수 있다. 문서의 고유 아이디가 매개변수로서 보내지고, @GetDocField 명령어를 사용하여 메시지의 내용을 쉽게 얻을 수 있다.


그림 5. e-msg 폼
The e-msg form

폼이 처음 실행되면, openForm&to=Tomas%20Nielsen 같은 매개변수를 취한다. 폼의 To 필드는 이 매개변수를 취해서, 메시지를 올바른 사용자에게 전달하는데 사용된다. 수신자가 응답을 해야 할 경우, 두 개의 매개변수들이 보내진다. to와unid 이다. unid는 디스플레이 될 메시지를 저장하고 있는 문서를 설명한다. 매개변수는 @GetDocField 식을 사용하여 메시지 바디를 검색한다.

사용자가 팝업 차단을 실행했다면, 여러분 도메인에 대해 팝업을 허용하도록 해야 한다. 그렇지 않을 경우, 메시지를 받을 수 없다. 차단을 방지하려면 DHTML을 사용한다. 메시지가 전달되기 전에 사용자가 브라우저를 닫으면, 메시지는 사용자가 로그인 할 때까지 기다렸다가, 첫 번째 페이지 로딩 시 전달된다.




위로


인스턴트 메시지에 이모티콘 추가하기

이것은 인스턴트 메시징 솔루션에서 가장 중요한 기능은 아니지만, 사용자들이 좋아하는 기능이다. happy.gif라고 하는 공유 리소스 이미지로서 웃는 얼굴 모양의 이미지(smiley face)를 추가했다.

그림 5를 보면, fromMessage 필드를 볼 수 있다. 이 필드에는 다음과 같은 코드가 들어있다.


Listing 5. fromMessage 필드
				

Tmp := @GetDocField( responseUNID; "message");

@ReplaceSubstring(@If(@IsError(Tmp) ; "" ; Tmp) ; 

@NewLine:":-)" ; "<br />":"<img src=\"/"+@WebDbName 

+ "/happy.gif\">")


새로운 라인이 라인 브레이크(line break)로 변환되고, 모든 :-) 조합을 스마일리(smiley) 이미지로 어떻게 바뀌는지에 주목하라. 물론, 이 기능을 더 많은 이모티콘에 확장할 수 있지만, 그 부분은 여러분에게 맡기겠다. 단어들을 변경할 수도 있다.

이 기능을 더 확장하여 움직이는 GIF 무비를 추가할 수 있다. 인트라넷에서 로그인 할 때 마다 모든 온라인 친구들에게 보낼 환호하는 군중 소리가 담긴 사운드 클립을 삽입할 수도 있다. (안타깝게도, 내 동료는 여기에 동의하지 않았다.)




위로


성능 고려 사항들

refreshUserMsg 에이전트의 경우, 에이전트로 보내는 요청에 시간 간격을 설정했다. 우리가 사용했던 값은 1000밀리초(1초)이다. 이 값은 테스팅을 목적으로 한다거나 사용자가 적을 경우에는 충분하다. 15,000 밀리초의 간격은 중소 기업에 알맞다.

사용자가 새로운 이메일 메시지 유무 여부를 검사하는 등을 체크하기 위해 이 기술을 사용하려면, 에이전트의 시간을 조정하여 너무 많은 CPU와 디스크 시간을 소비하지 않도록 해야 한다. 여러분은 다음 폴링이 발생할 시기에 대해서 완벽한 제어권을 갖고 있기 때문에, 이 값을 조절할 수 있다. 예를 들어, 온라인 상태로 되어 있는 사용자 수에 따라서 폴링 간 시간을 늘릴 수 있다.

첫 번째 어웨어니스 솔루션은 Lotus Domino 5에서 잘 실행되었다. Lotus Domino는 에이전트를 시작하고, HTTP 요청을 처리하는데 있어 더욱 빨라졌다. 이 기술은 Lotus Domino와 사용하는데 적합하다고 감히 말할 수 있다.




위로


기타 향상점

인스턴트 메시징 기술을 설명하기 위해, 우리 회사에서 사용하는 어웨어니스 버전을 분석해 보았다. 우리가 사용하는 것 중에는 채팅 세션을 저장하는 옵션도 있다. 이 외에다 다음과 같은 부분을 추가할 수 있겠다.

  • 팝업 창과 현재 창에 열려있는 DHTML 레어어를 교환한다. 이 기능은 팝업 블로커(blocker)와 관련된 문제들도 해결할 수 있다.
  • 온라인 사용자들의 리스트는 실시간으로 업데이트 되지 않는다. 같은 DHTML 방식을 사용하여 이러한 기능을 추가할 수 있다.
  • 승인 태스크를 실시간으로 보냄으로써, 워크플로우 속도를 높이는 메시징 기능을 사용할 수 있다.
  • 사용자가 온라인 상태에 있을 때 에이전트를 실행하면서, 사용자가 온라인 상태로 있었던 시간을 쉽게 트래킹 할 수 있다. 가장 오랜 시간 온라인 상태로 있었던 사용자 리스트가 담긴 페이지도 얻을 수 있다.
  • 오프라인으로 되어있는 사용자에게 메시지를 보낼 수 있다. 사용자가 다음에 로그인 하면 그 메시지를 받는다.
  • 메시지를 모든 사람들에게 보내는 메시징 기능이 있다. Public Question은 한 가지 질문을 모든 사람들에게 보내는 기능을 한다. 이러한 특정 주제를 다루는 채팅 세션에 원하는 사람들 모두 참여할 수 있다.




위로


맺음말

Ajax는 서버에서 콘텐트를 푸시(push)하는 기능을 통해 새로운 차원의 웹 사이트를 개척했다. 콘텐트를 풀링(pulling)하면서 이것을 숨기기 때문에 푸시(push)라고 한다.

Microsoft ActiveX 컨트롤을 로딩하지 않고, Java Virtual Machine (JVM) 인스턴스를 초기화 하지 않으며, 플래시 애니메이션 플레이어가 필요 없다. 바로 이것 때문에 우리가 이 기술을 좋아한다. 대부분의 사용자들도 이 방법을 쉽게 사용할 수 있다.

기사의 원문보기





위로


다운로드 하십시오

설명이름크기다운로드 방식
Sample databaseAwareness.zip51 KBHTTP
다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기

토론


필자소개

Tomas Nielsen은 Strand Interconnect (publ)의 시스템 아키텍트이다. 여러 기업들에 IBM 포탈을 제공하고 있다. Tromb의 창립자이며, 현재 Strand Interconnect에서 근무하고 있다. (tomas@tuned.se)




기사에 대한 평가


보다 나은 서비스를 제공하기 위함이오니 잠시 짬을 내어 이 양식을 제출하여 주십시오.



아니오잘 모르겠음
 


 


12345
 



위로


developerWorks 콘텐트를 다른 사이트에 전재하기:
developerWorks 콘텐트에 대한 저작권은 IBM에 있습니다. IBM의 서면 허가나 원본 저자의 허락이 없이는 전재를 금합니다. 저희 콘텐트를 전재하시려면 IBM developerWorks 담당자 에게 문의하십시오.

    IBM 소개개인정보 보호정책문의