본문 바로가기
업무 자동화 매크로

이벤트 중복(버블링) 방지 팁과 실전 스크립트 패턴

by 오토픽 2025. 9. 16.
반응형

안녕하세요. 엔지엠소프트웨어입니다.
엔지엠 에디터 6.2.1.1 버전부터 마우스·키보드·시간 관련 다양한 이벤트 액션이 추가되었습니다.
이벤트를 활용하면 원하는 타이밍에 스크립트를 정확히 실행할 수 있어 자동화의 가능성이 크게 넓어집니다.
하지만 한 번 등록한 이벤트는 계속 동작(감지)하기 때문에 의도치 않은 중복 호출(버블링) 문제가 발생할 수 있습니다.
이번 글에서는 그 원인과 실무에서 안전하게 쓰는 방법을 단계별로 설명드립니다.


문제 상황(요약)

  • 예: 마우스 왼쪽 다운 이벤트를 등록해 두고, 이벤트가 트리거되면 이동한 위치에서 마우스 클릭 액션을 수행한다면?
    • 클릭 액션 자체가 또다시 마우스 다운 이벤트를 발생시켜 이벤트가 중복 실행됩니다.
  • 마우스 down ↔ up이 한 쌍으로 동작하는데, 너무 빠르게 처리되면 이벤트 감지 타이밍과 겹쳐서 더블클릭 현상도 발생합니다.

 

 

해결 전략 — 기본 원칙

  1. 이벤트를 삭제(Delete) → 필요한 작업 수행 → 이벤트를 다시 등록(Register)
    개발자들이 이벤트 중복(버블링)을 막기 위해 흔히 쓰는 패턴입니다.
  2. 가능하면 클릭(Click) 대신 이동(Move) 을 사용해 이벤트 트리거 조건을 피합니다.
  3. 이벤트 삭제는 특정 ID만 삭제하도록 하거나(권장), 모든 이벤트 삭제 시에는 반드시 초기 상태로 복구(재등록) 합니다.

 

 

권장 스크립트 흐름(실전 패턴)

아래는 실무에서 안전하게 쓰는 패턴 예시(의사 코드)입니다.

  • 초기(시작) :
    • RegisterEvent(id="evt_left", type=MouseLeftDown, target=루틴B)
    • RegisterEvent(id="evt_right", type=MouseRightDown, target=루틴C)
  • 메인 루틴(루틴A) : 계속 동작(예: 작업 루프)
  • 이벤트 루틴(루틴B, 루틴C) 흐름(루틴B 예) :
    1. DeleteEvent("evt_left") ← 중요: 먼저 자신이 트리거한 이벤트를 삭제
    2. DeleteEvent("evt_right") ← 필요한 경우 다른 관련 이벤트도 삭제(또는 delete all)
    3. 실제 작업 수행
      • 클릭을 꼭 써야 하면 여기서 클릭 (또는 연타) 수행
      • 또는 클릭 대신 Move 사용(가능한 경우)
      • 클릭 연타 등은 내부에서 처리 (딜레이를 적절히 줌)
    4. 작업 완료 후 이벤트 재등록
      • RegisterEvent("evt_left", ...)
      • RegisterEvent("evt_right", ...)
    5. 루틴 종료 → 메인 루틴 복귀

포인트: 이벤트를 삭제하면 두번째부터는 해당 이벤트가 더 이상 실행되지 않으므로 작업이 끝난 직후 반드시 원상복구해야 합니다.

 

 

실무 팁 & 주의사항

  • 타겟 삭제 권장: 모든 이벤트를 삭제(delete all)하면 편하나, 나중에 재등록할 때 누락하면 해당 이벤트는 영구 비활성화됩니다. 가능하면 아이디로 타겟 삭제하세요.
  • 재등록 시 이벤트 수/아이디 동일하게: 처음엔 2개 등록했는데 재등록을 1개만 하면 나머지 이벤트는 동작하지 않습니다. 항상 원래 상태와 동일하게 복원하세요.
  • 클릭 속도(딜레이): 너무 빠른 down/up은 이벤트와 충돌합니다. 클릭이 필요하면 down → wait(짧게) → up 과 같이 적절한 지연을 넣어주세요.
  • Move로 대체 가능한지 검토: 이동만으로 충분하면 클릭(물리 이벤트)을 발생시키지 않아서 문제 자체가 없어집니다.
  • 이벤트 ID 규칙: 유니크하고 직관적인 ID(예: evt_mouse_left_main, evt_mouse_right_menu)를 사용하면 관리가 편합니다.
  • 로깅: 이벤트 삭제/등록 시 로그를 남겨두면 디버깅에 큰 도움이 됩니다.

 

 

자주 발생하는 실수 사례

  • 이벤트를 삭제한 뒤 재등록을 잊어버림 → 특정 클릭이 더 이상 동작하지 않음
  • 재등록을 한 개만 해버림 → 다른 이벤트(우클릭 등)는 동작 멈춤
  • 클릭을 사용하면서 딜레이 없이 처리 → 더블클릭/중복 이벤트 발생

마무리

이벤트는 강력한 도구지만, **'계속 감지한다'**는 특성 때문에 설계가 조금 더 까다롭습니다.
안전한 패턴은 삭제 → 작업 → 재등록이며, 가능하면 클릭 대신 이동으로 물리적 이벤트를 발생시키지 않는 쪽이 더 안정적입니다.
첨부하신 샘플 스크립트(원본/수정본)를 기반으로 직접 예제 파일(.nms 등)로 정리해드릴 수도 있으니, 원하시면 보내주세요.


✅ 추천 태그
#엔지엠소프트웨어 #오토픽 #AutoPeak #RPA #매크로 #이벤트매크로 #마우스이벤트 #버블링방지

 

반응형