Study 50

NestJS <-> MySQL 트랜잭션 데드락

정말 오랜만에 js에서 db deadlock을 마주했다.QueryFailedError: Lock wait timeout exceeded; try restarting transaction 트랜잭션을 끊지 않은 상태에서 DB커넥션을 연결하니 발생한, 실수였다.async refundCharge(charge_idx: number, mem_idx: number, point: number): Promise { const qr = this.dataSource.createQueryRunner(); await qr.connect(); await qr.startTransaction(); try { await qr.manager.update( ... ); await ..

Study/에러 정리 2025.03.28

C++ std::cout 로그로 인한 지연처리

C++ 콘솔앱에서 std::cout으로 로그를 출력하는데, 리소스를 많이 잡아먹기 때문에 별도의 로깅용 스레드를 사용한다는 이야기를 들은 기억이 있다. 그리고 이번에 로깅으로 인한 레이턴시를 경험했다.udp 서버를 만들었다.총 13개의 스레드를 사용하고 작업 내용은 아래와 같다.- 메인스레드초기화 로직을 거친 후 대기에 들어간다.- udp 서버 클래스 (3개의 스레드)1. 임의의 피어로부터 데이터를 수신하고, 정해진 소켓에게 해당 데이터를 다이렉트로 전송한다.2. 메모리에 저장된 데이터를 틱마다 특정 피어에게 송신한다.3. 임의의 피어로부터 데이터를 수신하고 메모리에 저장된 데이터를 업데이트한다.-> 멀티스레드 특성상 lock을 사용하여 동기화를 해줘야하나, 정확한 동기화보다는 속도가 중요한 이벤트라 정..

Study/에러 정리 2025.03.21

NestJS) 함수 사용에서 일관되지 않은 this 참조

하나의 서비스에서 this의 잘못된 참조를 발견했다.결론부터 이야기하면, 일반 함수가 아닌 화살표 함수로 해결했다.testFunction(){}testFunction = () => {} net 라이브러리를 사용해서 tcp통신을 한다.main.ts 파일의 bootstrap 함수에서 tcp함수를 시작한다.// main.ts// Start tcp Server try { const tcpService = app.get(TcpService); tcpService.startServer( process.env.TCP_SERVER_HOST, Number(process.env.TCP_SERVER_PORT), ); } catch (error) { console.log( ..

Study/에러 정리 2025.02.19

NestJS) useGlobalFilters, APP_FILTER

HttpExceptionFilter 커스텀 익셉션을 만들었는데 작동하지 않았다.main.ts에 useGlobalFilters() 함수를 작성하고, app.module.ts 파일에 APP_FILTER로 동시에 작성해두었다. 결론은 커스텀 필터 사용시, 동시에 작성하면 안된다.의존성 주입이 필요하다면 APP_FILTER를,의존성 주입이 필요 없다면 useGlobalFilters()를 사용해야한다. // main.tsapp.useGlobalFilters(new HttpExceptionFilter()); 의존성 주입을 거치지 않는다.의존성 주입을 받지 못한다.직접 인스턴스를 생성해 필터 클래스로 동작한다. // app.module.tsproviders: [ { provide: APP_FILTER,..

Study/에러 정리 2025.02.18

NestJS) circular-dependency, forwardRef, undefined

forwardRef로 순환참조를 작성했지만, 참조된 클래스에서 순환참조할 클래스를 찾지 못하는 에러가 발생했다.udpService에서 packet-handler 참조(호출)packet-handler에서 udpService 참조(순환참조 = 호출) -> 에러 발생 TypeError: Cannot read properties of undefined (reading 'udpService') 결론을 미리 말하자면,순환참조시 순환참조에 대한 참조값을 초기화 한 후 작업을 진행해야한다.의존성 단방향 주입// udp.module.ts@Module({ controllers: [UdpController], providers: [UdpService], exports: [UdpService, PacketHandlerS..

Study/에러 정리 2025.02.17

NestJS) EC2 -> crypto is not defined

crypto is not definedec2에서 nestjs 프로젝트를 pm2로 실행하면 에러가 발생했다.나의 경우는 nestjs-scheduler를 사용해서 크론잡 실행시 에러가 발생했다.로컬에서 pm2를 실행했을 때는 발생하지 않았다.비슷한 사례를 찾아 여러 시도를 해보았다.https://github.com/typeorm/typeorm/issues/11270 ReferenceError: crypto is not defined when using TypeORM in Nest.js · Issue #11270 · typeorm/typeormIssue description I'm using @nestjs/typeorm with TypeOrmModule.forRootAsync() in a NestJS proj..

Study/에러 정리 2025.02.07

Powershell) Server ping check with timestamp

IOCP 클라이언트가 recv 과정에서 10053 에러로 접속이 끊겼다.https://learn.microsoft.com/ko-kr/windows/win32/winsock/windows-sockets-error-codes-2 Windows 소켓 오류 코드(Winsock2.h) - Win32 appsWSAGetLastError 함수에서 반환된 Windows 소켓(Winsock) 오류 코드입니다.learn.microsoft.com 서버는 계속 살아있는데 클라이언트만 끊겼다.여러 원인 중 하나로, 내부 인터넷 연결이 끊겼을 상황을 체크해보았다.서버 IP로 핑테스트를 보냈다.Ping 테스트가 실패했을 때, 동일하게 서버는 살아있는데 연결되어있는 클라이언트 모두 접속이 종료됐다. while ($true) { ..

Study/에러 정리 2025.01.15

mfc140ud.dll, afxwin1.inl Assertion 에러

afxwin1.inl 파일은 ASSERT를 계속 걸어 핸들 혹은 다이아로그를 확인한다고 한다.// afxwin1.inl...#ifdef _AFXWIN_INLINE// Global helper functions_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp() { return afxCurrentWinApp; }_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle() { ASSERT(afxCurrentInstanceHandle != NULL); return afxCurrentInstanceHandle; }_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle() { ASSER..

Study/에러 정리 2025.01.06

node.js <-> MySQL <-> AWS RDS Deadlock

node.js를 사용하면서 데드락을 경험한 일이 딱 한 번 있었다.최근 면접에서 받은 질문으로, 복기해보려 한다.읽기 일관성과 트랜잭션 격리 수준 배경node.jsMySQL ConnectionPoolAWS RDSREAD 커넥션과 WRITE 커넥션의 분리 전제 조건[WRITE 커넥션] -> INSERT, UPDATE ... / [READ 커넥션] -> SELECTINSERT 쿼리는 데이터가 실제로 커밋되기 전까지 다른 트랜잭션에서 보이지 않을 수 있다.SELECT 쿼리는 트랜잭션 수준에 따라 최신 데이터를 읽지 못하거나, 아직 커밋되지 않은 데이터를 읽지 못할 수 있다.INSERT와 SELECT을 별도의 트랜잭션으로 실행하고, 두 쿼리가 다른 커넥션에서 실행된다.WRITE 커넥션에서 INSERT 작업이 끝..

Study/에러 정리 2025.01.02

mfc - iocp 통신 메모리 누수

상황0. iocp 서버와 iocp 클라이언트는 각각 mfc 프로그램이다.1.  iocp 서버는 tcp로 연결된 클라이언트가 존재하면 보유한 데이터를 브로드캐스팅한다.2. iocp 서버에 연결된 클라이언트는 다음과 같다.UE5iocp clientnest.js server3. iocp client에서는 데이터를 수신할 필요가 없다.4. iocp client에는 iocp server에 필요한 데이터를 계속 송신한다.5. 위와 같은 상황에서 iocp server의 메모리는 계속해서 증가하고, 정상 종료가 되지 않아 작업관리자에서 강제로 종료해야했다.서버 프로그램이 정상 종료 되지 않는 상황은 다음과 같은 경우에도 발생했다.1. 스레드가 정상 종료 되지 않은 경우2. 동적 할당 메모리가 해제되지 않은 경우3. 공..

Study/에러 정리 2024.12.23