언리얼 오브젝트 처리 자동 프로퍼티 초기화 UObject는 생성자 호출 전 초기화시 자동으로 0으로 채워진다. 클래스, UProperty, 네이티브 멤버 모두에게 적용된다. 이후 멤버는 클래스 생성자의 커스텀 값으로 초기화 가능하다. 레퍼런스 자동 업데이트 AActor 또는 UActorComponent가 소멸되거나 플레이에서 제거되면, 리플렉션 시스템에 보여지고 있던 모든 레퍼런스는 자동으로 null이 된다. 허상 참조를 예방하여 문제의 소지를 줄인다는 장점이 있지만, 다른 코드부분에서 AActor와 UActorComponent 포인터를 소멸시키는 경우 null 이 된다는 것을 뜻한다. null 검사 안정성이 높다. 자동 업데이트 기능은 UPROPERTY로 마킹되어 있거나 언리얼 엔진 컨테이너 클래스에 ..
IntelliJ IDEA 단축키 1. 시작하며 window 기준으로 자주 사용하는 단축키 정리 intellij keymap cheatsheet 출력해서 책상에 붙여두자. 2. 자주 쓰는 단축키 필수 Alt + Enter : Context actions & 퀵 픽스 Shift Shift : search everywhere Ctrl + Space : 기본 코드 자동 완성 Ctrl + Shift + Space : 스마트 자동 완성 추천 Alt + Ins : Generate code Ctrl + P : Parameter info Ctrl + W : Extend selection (입력할 수록 범위 커짐) Ctrl + Shift + W : Shrink selection Ctrl + E : 최근 사용 파일 라인 C..
JDBC connector 생성 시 No suitable driver found 에러 발생 1. 시작하며 Kafka Connect JDBC Connector 를 사용하여 sink connector를 생성하려고 하였으나 java.sql.SQLException: No suitable driver found 에러가 발생하였다. kafka docker image는 wurstmeister를 사용하였다. 2. 이슈 kafka JDBC connector 생성 불가: No suitable driver found Caused by: org.apache.kafka.connect.errors.ConnectException: java.sql.SQLException: No suitable driver found for jdbc..
Kafka 에서 Mysql 로 Sink Connector 구축하기 이미지출처 : confluent 1. 시작하며 Kafka connect로 Kafka Topic 저장된 레코드를 Mysql로 데이터 마이그레이션 하고자한다. 이 과정은 Confluent 사의 JDBC Sink Connector 통해 구축한다. Source Connector: MySQL -> kafka Connect(Source Connector, Debezium) -> Kafka Sink Connector : Kafka -> kafka Connect(JDBC Sink Connector) -> Mysql 2. docker-compose.yml 작성 Source Connector 를 만들었던 예제에서 sink용 Mysql 하나 더 추가하였다. ..
MySQL 에서 Kafka 로 Source Connector 구축하기 이미지출처 : confluent 1. 시작하며 Kafka connect는 카프카용 데이터 통합 프레임워크이다. 이 때 Kafka connect는 Kafka connector가 동작하도록 실행해주는 프로세스이다. Kafka connector에는 Source connector와 Sink connector가 있다. 간단히 말하면 Source Connector는 Producer의 역할, Sink connector는 Consumer 역할을 한다. Source Connector : 외부시스템 -> 커넥트 -> 카프카 Sink Connector : 카프카 -> 커넥트 -> 외부 시스템 Debezium은 카프카 커넥트(Kafka Connect) 기반..
UMG 사용 UMG 코드를 사용하기 위해서는 UMG 모듈을 프로젝트에 포함하도록 해야한다. 에러 UMG 모듈을 포함하지 않을 경우 UMG 클래스를 코드에서 작성하게 되었을때 다음과 같이 빌드 에러가 발생한다. UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Collision) class UWidgetComponent* HPBarWidget; error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class UClass * __cdecl UWidgetComponent::StaticClass(void)"... 후략 UMG 모듈 등록 프로젝트명.build.cs 파일에서..
Docker로 MySQL 설치하기 1. 시작하며 로컬환경에서 docker-compose.xml 을 작성하여 MySQL 8 을 설치하고 user 계정을 생성해보자. docker 에서 image pull 을 하여 설치할 수도 있지만 docker-compose 를 쓰면 훨씬 편하게 설치할 수 있다. 참고로 docker로 mariaDB 설치 방법 은 링크를 확인하면 된다. 2. docker-compose.yml 작성 version: '3' services: mysql: image: mysql:8.0 container_name: mysql ports: - 3306:3306 # HOST:CONTAINER environment: MYSQL_ROOT_PASSWORD: admin command: - --character..
TSubclassOf TSubclassOf는 UClass 유형의 안전성을 보장해주는 템플릿 클래스이다. 특정(UDamageType) 파생 클래스만 할당하기를 바랄 때 사용한다. 그러면 에디터의 프로퍼티 창에 해당 클래스의 파생 클래스만 선택되도록 한다. /** type of damage */ UPROPERTY(EditDefaultsOnly, Category=Damage) TSubclassOf DamageType; 이러한 UPROPERTY 안전성의 추가로, C++ 수준에서의 유형 안전성도 확보할 수 있다. 비호환 TSubclassOf 유형을 할당하려는 순간 컴파일 오류가 발생한다. 범용적인 UClass를 할당하려고 할 때, 할당이 가능한지 검증을 실행시간에 검사를 한다. 검사에 실패하면 nullptr를 반..
@PostConstruct와 @PreDestroy Annotation 사용하기 1. 언제 쓰는가 최근에 개발하다가 딱 한번만 받아오면 되는 값을 사용 시 마다 요청을 새로 호출하는 실수를 했다. 아니 누가 이따위로 개발했는가 하고 git history를 뒤져보았더니 범인은 다름아닌 과거의 나였다. 따라서 잊지 않기 위해 @PostConstruct 에 대해 기록해두고자 한다. @PostConstruct 를 사용하면 WAS 가 뜰 때 한번만 기본값을 세팅해두고 두고두고 쓸 수 있다. @PostConstruct 는 WAS 가 뜰 때 bean이 생성된 다음 딱 한번만 실행된다. @PreDestroy 는 컨테이너에서 객체를 제거하기 전에 실행된다. 2. @PostConstruct Spring은 bean을 초기화 ..
TSet TSet는 순서가 중요하지 않은 상황에서 고유 엘리먼트를 저장하는데 사용되는 고속 컨테이너 클래스이다. TSet는 TMap, TMultiMap과 비슷하지만 차이접이 있다. 독립된 키로 데이터를 연결하기 보다 데이터값 자체를 키로 사용하며 엘리먼트 값을 평가하는 오버라이드 가능 함수를 사용한다. TSet는 엘리먼트 추가,검색,제거가 매우 빠르다. TSet는 중복키를 지원하지 않지만, 템플릿 파라미터로 사용할 수 있다. DefaultKeyFuncs에서 파생된 구조체는 해시 함수 기능을 제공하도록 지정 가능하다. 또한 한 Set에 값이 같은 키가 중복이 가능하도록 할 수도 있다. 데이터 저장을 위한 커스텀 메모리 얼로케이터를 제공할 수 있다. TArray와 비슷하게 TSet는 동질성 컨테이너, 즉 모..
Docker 로 Kafka 를 local 에 세팅하자 1. docker-compose.yml 작성 version: '2' services: zookeeper: container_name: zookeeper image: wurstmeister/zookeeper ports: - "2181:2181" kafka: container_name: kafka image: wurstmeister/kafka depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1 KAFKA_ADVERTISED_PORT: 9092 KAFKA_CREATE_TOPICS: "test-topic:1:1" KAFKA_ZOOKEEPER..
게임 플레이 타이머 설정된 주기마다 동작을 수행하는 타이머 구조체 타이머를 통해 딜레이 이후 또는 일정 시간에 걸쳐 동작을 수행하도록 스케쥴을 잡을 수 있다. 타이머 관리 타이머는 글로벌 TimerManager 에서 관리한다. 글로벌 타이머 매니저는 GameInstance 오브젝트와 각 World에 존재한다. 타임 매니저와 함께 타이머를 셋업하는데 사용되는 주 함수는 SetTimer와 SetTimerForNextTick 이 있다. 자세한 내용은 TimerManagerAPI Page 참조 타이머를 호출한 Actor같은 오브젝트가 시간이 다 되기전 소멸되면 타이머는 자동으로 취소된다. 타이머 매니저 접근은 AActor 함수의 GetWorldTimerManager를 통해 이루어진다. UWorld의 GetTim..