나만의 작은 도서관
[TIL][C++] 250808 MMO 서버 개발 76일차: [언리얼] 이벤트 디스패처란?, SQL Server(MSSQL) 이것저것 알게된 것 본문
Today I Learn
[TIL][C++] 250808 MMO 서버 개발 76일차: [언리얼] 이벤트 디스패처란?, SQL Server(MSSQL) 이것저것 알게된 것
pledge24 2025. 8. 9. 01:35주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다.
[언리얼] 이벤트 디스패처란?
- 언리얼에서 이벤트 디스패처란 이벤트 발생 시, 등록해 둔 모든 요소들에게 이벤트 발생 사실을 알리는 기능을 수행하는 장치이다.
- 이벤트 디스패처는 다양한 상황에서 유용하게 사용할 수 있지만, 작자가 유용하게 쓴 경우는 위젯끼리의 통신이었다.
문제의 상황: 캐릭터 슬롯 버튼을 눌렀을 때 몇 번 슬롯이 눌렸는지 알고 싶다!
- 캐릭터 선택 창 위젯(이하 CS_)이 있고, 캐릭터 슬롯 위젯(이하 Slot)이 있을 때, 이 둘은 서로 다른 위젯 클래스로 만들어져 있다.
- CS_는 여러 개의 Slot들을 포함하고 있었고, Slot의 버튼이 클릭될 때마다 CS_가 눌린 버튼이 무엇인지 기록해두고 싶었다. 예를 들어, 1번 버튼이 눌렸으면 1을 저장하고, 2번 버튼이 눌렸으면 2를 CS_에 저장하고 싶었다는 것이다.
- 하지만 각 위젯은 어떤 위젯이 본인을 사용할지 미리 알 수 없기 때문에 이에 대한 정의를 할 수 없으며, 따라서 Slot버튼 클릭에 따른 CS_ 정보 저장 기능을 Slot에서 정의할 수 없다.
이벤트 디스패처를 활용한 해결법
- 이럴 때 이벤트 디스패처를 사용하면 좋다. Slot에 이벤트 디스패처를 만들어두고, Slot에 버튼이 클릭될 때마다 이벤트 디스패처를 호출하여, 등록한 이벤트가 실행되도록 한다. 즉, CS_가 디스패처에 이벤트를 등록해 두면 Slot이 클릭될 때마다 해당 이벤트가 발동한다는 것이다!
이벤트 디스패처 적용법
- C++로도 할 수 있을 것으로 보이지만 BP로 해결했으니 BP 기준으로 설명한다.
과정 1. 이벤트 디스패처 추가
- 등록된 이벤트를 발동(trigger)시킬 이벤트 디스패처를 추가한다. 블루프린트 그래프 탭에서 왼쪽 사이드바에 VARIABLES, FUNCTIONS 등이 있는 목록의 가장 아래에 이벤트 디스패처가 있다. +를 눌러 추가하면 된다.
과정 2. 디스패처 호출 노드 추가
- 추가한 이벤트 디스패처를 이벤트 그래프에 드래그하면 목록이 하나 생기는데, 여기서 call을 선택하면 Call “이벤트 디스패처 이름”으로 된 노드가 하나 생성된다. 해당 노드를 발동시키고 싶은 시점의 노드와 연결시켜 주면 된다.
- (참고로, 디스패처 호출 시 인자를 넘겨줄 수 있는데, 이는 디테일 패널의 Inputs에서 추가할 수 있다)

과정 3. 이벤트 디스패처에 이벤트 등록(Bind)
- 디스패처를 호출해 봤자 등록된 이벤트가 없으면 아무것도 안 한다. 따라서 이벤트를 등록해야 한다.
- 등록할 이벤트는 다른 블루프린트 클래스에서도 등록할 수 있다. 다른 블루프린트의 이벤트 그래프에서 Bind Event to “이벤트 디스패처 이름”으로 노드를 검색하면 해당 이벤트 디스패처에 이벤트를 등록할 수 있는 노드가 나온다.
- Add custom Event를 검색해서 커스텀 이벤트를 만든 다음, 해당 노드에 이벤트를 연결하면(빨간색 줄) 등록은 완료된다. 이제 만든 이벤트 커스텀의 실행핀을 이용해 이벤트를 정의하면 된다.

cerr과 cout의 차이점
- 가끔 c++을 자료를 보다 보면 cerr방식으로 로그를 출력하는 방식이 있는데, 이 방식이 오류 전용 방식이라는 것을 알지만, 어떤 이점이 있는지는 잘 몰라서 이번에 알아봤다.
- 알아보니 별 차이는 없었고, 그냥 cerr은 버퍼링을 하지 않는다는 것 같다. 일반적인 cout 방식은 어느 정도 버퍼가 차야 터미널에 로그를 출력해 주는 “버퍼링” 방식을 사용한다. 그냥 모았다가 보낸다고 보면 된다.
- 하지만 cerr은 이러한 버퍼링을 사용하지 않고 그대로 출력 장치로 전송한다고 한다. 정말 별 차이가 없다.
SQL Server(MSSQL) 이것저것 알게 된 것
UPDLOCK
- UpdateLock의 의미. 읽기는 허용하지만 쓰기 락(업데이트 락)과 배타 락을 차단한다. 이는 “나중에 이 데이터를 수정하겠다”라는 의도롤 표현한다.
락은 행 단위로 잠긴다.
- 특정 테이블에 데이터를 삽입하는 경우에도 테이블 전체가 잠기진 않는다. 대신, 추가하는 행이 다른 SELECT문에 걸릴 가능성이 있다면, 해당 SELECT문은 잠깐 잠길 수 있다.
WHERE character_name = "Hero123"
WHERE character_name LIKE ...
WHERE user_id = 123
‘@’는 변수를 의미한다.
- 하나의 쿼리문에서 여러 SQL문이 묶여서 들어가는 경우가 있을 수 있는데, 이때 같은 데이터를 여러 군데에서 사용할 수 있다. 이때 ‘@’를 사용해서 변수를 선언하여 해당 값을 집어넣고 SQL에서 변수를 집어넣으면 보다 편리하게 사용할 수 있다.
-- 변수 선언
DECLARE @UserID INT;
DECLARE @UserName NVARCHAR(50);
-- 변수에 값 할당
SET @UserID = (?);
SELECT @UserName = (?);
-- 변수 사용
SELECT @UserID AS '사용자ID', @UserName AS '사용자이름';
