레이블이 concurrency인 게시물을 표시합니다. 모든 게시물 표시
레이블이 concurrency인 게시물을 표시합니다. 모든 게시물 표시

2009년 12월 22일 화요일

동일한 요청의 다중전송 방지

골치 아픈 문제 때문에 고민하다가 너무나 간단한 해결책을 찾아냈다.
보통 웹이 아닌 클라이언트/서버 프로그램에서 클라이언트의 화면에서 '조회' 등의 버튼을 한번만 클릭하고 결과를 기다려야 하는데 사용자가 조회시간이 좀 걸린다고 여러번 클릭하는 경우가 있다. 이걸 막아야 하는 일이 생겨서 고민했는데 의외로 간단하다.

보통 서버로 요청을 보내기 위해서는 RemoteObject를 통해서 서버의 메소드를 호출하는데, 이 RemoteObjectconcurrency라는 속성이 있다. 이 속성의 디폴트값은 multiple이라서 같은 메소드의 호출응답을 받기 전에 호출해도 계속 요청이 날아가게 되어 있다. 그런데, 속성의 값을 single로 하면, 서버 메소드 호출에 대한 응답을 받기 전에 또 화면에서 호출하면 에러를 발생시킨다.
이때 발생하는 에러이벤트는 FaultEvent이고 event.fault.faultCode == "ConcurrencyError" 조건을 만족하면 조회중이니 잠시 기다려 달라는 메시지를 뿌려 주면 된다. 물론 이러는 동안에도 처음 요청은 잘 갔다가 응답까지 잘 받는다.

보니까 RemoteObject 뿐만 아니라, method 태그에도 이 속성을 사용할 수 있는 것 같다. RemoteObject에 사용하면 그 안에 포함된 메소드 전부에 적용이 되고, method 태그에 사용하면 메소드 단위로 제어가 가능한 것 같다. 테스트해 보질 않아서 더이상의 설명은 패쓰~