-
[2024.08.13] electron IPC 통신할 때공부/TIL 2024. 8. 16. 22:43
둘다 뭔가를 보내는 건 같은데 왜 이건 안돼?
회사에서 갑자기 데스크탑 앱을 개발할 일이 생겨서 배우면서 개발하는 중이라 GPT랑 공식문서 사이를 오가며 허덕이는 중에 배열을 redner 프로세스에서 main 프로세스가 받고 DB에 등록 후 처리 결과를 다시 render 프로세스가 받을 일이 생겼어요.
처음에 gpt한테 배열인지는 안말하고 물어보니 ipcRader.send()를 추천해 줬다가 send()로는 main()에서도, 브라우저 conosle에서도 아무 반응이 없었죠. 안된다고 gpt한테 다시 물으니 ipcRender.invoke() 바꾼데다가 send()로 했을 때는 아래에 callback 함수가 따로 있었는데 invoke()로 바꾸니 그 조차도 없어도 되었죠. 둘이 무슨 차이일까 궁금해져서 조금 찾아본 내용을 정리해봤습니다.
- send : https://www.electronjs.org/docs/latest/api/ipc-renderer#ipcrenderersendchannel-args
- invoke : https://www.electronjs.org/docs/latest/api/ipc-renderer#ipcrendererinvokechannel-args
궁금증을 해결하기 위해 공식 문서를 훑어봤습니다.
send()와 inovoke() 둘다 render 프로세스세에서 main 프로세서로 채널이름을 지정하여 한번에 여러 값을 같이 넘길 수 있음은 같습니다. invoke()는 send()와 달리 반환값을 받도록 되어 있었습니다. send()로 보낸 메세지는 on()메서드를 통해서 다시 받을 수 있었고요.
이렇게만 보니 그냥 invoke() 쓰지 귀찮게 send()를 왜 쓸까 하고 문서를 조금 더 들여다 봤습니다.
send()와 invoke()는 보낼수 있는 값의 타입에서 차이가 생겼죠.
send()는 function, Promise, Symbols, Weakmaps, WeakSets을 제외하면 다 예외 처리를 한다고 해요. 직렬화 알고리즘으로는 https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm 요 친구를 쓴다고 하는데 좀 깊이 알아보는 것은 다음 기회로 미뤄야겠습니다아.
조금 더 고민하고 번역기로 두 메서드 이름을 비교해보니 send()는 '보내다'라는 뜻으로서 main에 특정 값을 보내두고 main에서 언젠가 on()을 통해 수신할 일이 생길 때 즉 비동기식으로 쓰고,
invoke()는 '부르다'라는 뜻으로 main에서 뭔가를 부르거나 render에서 값을 보내주더라도 바로 값을 받거나 결과를 확인해야하는 상황에서 사용하게 될것 같습니다.
라는게 제 뇌피셜이고 실제 사용사례를 좀더 찾아보게 된다면 위의 알고리즘이랑 같이 정리해오겠습니다ㅎㅎ
https://github.com/presiti/TIL
최근 들어 github에서 TIL을 작성하는데 좀 더 정리되고 간결한 내용으로 담고 싶어서 작성하기 시작했습니다. 지나가시면서 별 한번 꾹 눌러 주시고 생각날 때 얼만큼 썼나아 하고 관심 한방울 주시면 감사하겠습니다!
'공부 > TIL' 카테고리의 다른 글
[2024.08.23] 정적 라이브러리와 동적 라이브러리의 차이 (0) 2024.08.24 [2024.08.14] 컴파일 과정 파헤치지 01 (0) 2024.08.18 [2023.09.19]git과 Legacy spring (0) 2023.09.19 [2023.08.30]제 1회 서울대학교 AI빅데이터 캠프 후기 (0) 2023.08.30 [2023.01.31] 빅데이터 분석 및 실무 활용 수강 - 1일차 (0) 2023.02.01