๐ก WebView Bridge ํต์ ์ด๋?React Native ←→ WebView (์น ํ์ด์ง)๋ ํ๊ฒฝ์ด ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํต์ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค. ์ง์ ์ ์ผ๋ก ํจ์ ํธ์ถ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก,์ค๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ "๋ฉ์์ง ๋ธ๋ฆฟ์ง(message bridge)"๋ฅผ ๋ง๋ค์ด์ ์๋ก ์ํตํ๋ค. ๐ค ์ ๋ธ๋ฆฟ์ง๊ฐ ํ์ํ๋ฐ?โ
๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ์น์์ ์ฌ์ฉํ๊ณ ์ถ์ ๋โ WebView ์์์ ์ฌ์ง ์
๋ก๋ ๋ฒํผ →๋ค์ดํฐ๋ธ ์นด๋ฉ๋ผ ์คํ์น๋ง์ผ๋ก๋ ์นด๋ฉ๋ผ๋ฅผ ์ผค ์ ์์ผ๋ฏ๋ก, ๋ค์ดํฐ๋ธ ์ฝ๋๊ฐ ๋์ ์คํํด์ผํ๋ค. โ
์น์์ ํ ํฐ / ์ฌ์ฉ์ ์ ๋ณด ๊ณต์ โ ์น๋ทฐ ๋ก๊ทธ์ธ ์ฑ๊ณต → RN ์ฑ์ accessToken ์ ๋ฌ์ฑ์ ํด๋น ํ ํฐ์ ์ ์ฅํ๊ณ API ์์ฒญ์ ์ฌ์ฉ.(๋จ, ๋ค์ดํฐ๋ธ์์ ํ ํฐ์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ฐ๋ก ์ ์ฅ์..
์ ์ฒด ๊ธ
๊ฐ๋ฐ์ผ์ง ๋ฐ ์ ๋ณด ๊ณต์์ค์๊ฐ ๊ธฐ๋ฅ (์ฑํ
, ์๋ฆผ, ์ผ์ ๋ฐ์ดํฐ, ๋์๋ณด๋ ์
๋ฐ์ดํธ ๋ฑ)์ ๊ตฌํํ๋ ค๋ฉด ์น์์ผ (WebSocket) ๊ธฐ์ ์ด ํ์ํ๋ค.NestJS๋ ์ด๋ฅผ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก Gateway(๊ฒ์ดํธ์จ์ด)๋ผ๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค. ๐ก WebSocketWebSocket์ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ๊ฐ ์ง์์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ก ์์ ๋กญ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ์๋ฐฉํฅ ํต์ ๊ธฐ์ ์ด๋ค. ๊ธฐ์กด HTTP API ์์ฒญ-์๋ต ๊ตฌ์กฐ๊ฐ ์๋๋ผ ์ฐ๊ฒฐ์ด ์ ์ง๋ ์ํ์์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ฆ์ Push๋ฅผ ๋ณด๋ผ ์ ์๋ค. ๐งฑ GatewayWebSocket ์๋ฒ๋ฅผ ๊ด๋ฆฌํ๋ NestJS์ Controller ๊ฐ์ ์ญํ ์ ํ๋ค.NestJS๋ ์น์์ผ์ ํธํ๊ฒ ์ฌ์ฉํ๋๋ก Gateway๋ผ๋ ์ถ์ํ ๋ ์ด์ด๋ฅผ ์ ๊ณตํ๋ค. โ
ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ/ํด์ ๊ฐ์งโ
ํด..
NestJS์์ ๊ฐ๋จํ API๋ฅผ ์์ฑํด๋ณด์.์ ์ผ ๋ง์ด ์ฌ์ฉํ๋ ToDo ๊ธฐ๋ฅ์ API๋ฅผ ์์ฑํด๋ณด์. ๐ TODO๐น๏ธ*.controller.tsAPI์ ์ง์
์ .์ฆ, ์์ฒญ์ ๋ฐ๋ ๊ณณ์ ์ ์ํ๋ค. โ
URL ๋ผ์ฐํ
์ ์ (@Get(), @Post ๋ฑ)โ
์์ฒญ Parameter, Body ๋ฐ๋๋ค.โ
๋น์ฆ๋์ค ๋ก์ง์ ์์ฑํ์ง ์๋๋ค.โ
๋๋ถ๋ถ service์ ์ผ์ "์์" "/todos" ๊ฒฝ๋ก๋ก ์์ฒญ์ ๋ณด๋์ ๋ CRUD๋ฅผ ์์ฑ.import { Controller, Get, Post, Body, Param, Patch, Delete } from '@nestjs/common';import { TodosService } from './todos.service';@Controller('todos')export cl..
ํ์ฌ์์ Undo, Redo๋ฅผ ๋ง๋ค์ด์ผํด์ ์์ฑํด๋ณธ๋ค.๐ซต๐ป ์ปค๋งจ๋ ํจํด์ด๋?์ปค๋งจ๋ ํจํด์ ์์ฒญ(๋ช
๋ น)์ ๊ฐ์ฒด๋ก ์บก์ํํ์ฌ, ์คํผ์(Invoker)์ ์ค์ ์ํ์(Receiver)๋ฅผ ๋ถ๋ฆฌํ๋ ํจํด์ด๋ค. ์ฝ๊ฒ ๋งํ์๋ฉด, "ํ๊ณ ์ถ์ ์ผ์ ํ๋์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ ํ์ํ ๋ ์คํํ๋ ๋ฐฉ์"์ด๋ค. ์ญํ ์ค๋ช
Command์คํํ ๋์์ ๊ฐ์ง ์ธํฐํ์ด์ค ํน์ ์ถ์ ํด๋์คConcreteCommand์ค์ ์คํ ๋ก์ง(Receiver๋ฅผ ์ด์ฉํ์ฌ ์์
์ํ)Receiver์ค์ ์์
์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒดInvoker๋ช
๋ น์ ๋ณด๊ด/์คํํ๋ ๊ฐ์ฒด (Button, Scheduelr ๋ฑ) ๐ค ์ ํ์ํ๋ฐ?๐ญ ์คํ์์ ์์
๋ด์ฉ์ ๋ถ๋ฆฌํ ์ ์๋ค.๋ฒํผ ํด๋ฆญ → ๊ตฌ์ฒด์ ์ธ ๋ก์ง ์คํ์ด๋ ๊ฒ ๋ฐ์ฐฉ๋์ด ์์ผ๋ฉด ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค.์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๋ฉด..
๋ค์ค ์ ์ ํธ์ง ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ํด ์์ผ์ ์ฌ์ฉํด๋ณด๊ณ ์๊ฐ๋จํ ์ฑํ
์ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํ๋ค. ๋ก๊ทธ์ธ ํ, ์ฌ์ฉ์๊ฐ ์ฑํ
๋ฐฉ์ ์
๋ ฅํ๋ฉด ์๋ก์ด ์๋์ฐ์ ์ฑํ
๋ฐฉ์ ์ด์ด์ค๋ค. ์ฒซ ๋ฒ์งธ ๋ฉ์ธ ์๋์ฐ๋ฅผ ๋ซ์ผ๋ฉด ๋ชจ๋ ์๋์ฐ๋ฅผ ๋ซ์๋ฒ๋ฆด์ง ๊ณ ๋ฏผํ๋ค๊ฐ.๋ ํผ๋ฐ์ค๋ ์นด์นด์คํก์ผ๋ก ์ก์์ผ๋ฉฐ, ์ฑํ
์ฐฝ์ด ์ด๋ฆฐ ์ํ์์ ๋ฉ์ธ ์๋์ฐ(์ฑํ
์ฐฝ ๊ด๋ฆฌ ์๋์ฐ)๊ฐ ๊บผ์ ธ๋ ์ฑํ
์ฐฝ์ ์ด์์๋ค. ์ ๋ด์ฉ์ ๋ณด๋ฉดโ์์ผ๋ง ํ
์คํธํ์ง ์?์ง๋ฌธ์ ํ ์ ์์ง๋ง, ๋๋ ๋ญ๊ฐ ์๋ฒฝํจ(?)์ ์ถ๊ตฌํ์ฌ์ ํ๋๋ฅผ ๋ง๋ค๋๋ผ๋ ์ ๋๋ก ๋ง์ ธ๋ณด๊ณ ์ถ๋ค. ๐๏ธ WindowManager์ฐ์ ์๋์ฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด์ ๋งค๋์ ๋ฅผ ๋ง๋ค์ด์ค๋ค. ๋ด๊ฐ ๋ง๋ ๋งค๋์ ์ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.๊ธ์ ์ ๋ณด๊ณ ์ง์ ๊ตฌํํด๋ณด๊ณ ์ถ์ ์ฌ๋์ ์ธํฐํ์ด์ค๋ฅผ ๋ณด๊ณ ์ง์ ๊ตฌํํด๋ณด์๋ ์ข๋ค.export ..
๐๏ธ QueryKey๋?React Query์์ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋ณํ๋ ๊ณ ์ ํ ํค์ด๋ค.JavaScript ๋ฐฐ์ด ํํ๋ก ์ ์๋๋ฉฐ, ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์กฐํํ๋๋ฐ ์ฌ์ฉํ๋ค.// ๊ฐ๋จํ ํํ['todos']// ๊ตฌ์ฒด์ ์ธ ํํ['todos', 'list']['todos', 'detail', 1]['todos', 'list', {status: 'done', page: 1}] ๐ท๐ป QueryKey ์ญํ โ
์บ์ ์๋ณ์๊ฐ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์์ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ ํค์ด๋ค.๋์ผํ QueryKey๋ฅผ ๊ฐ์ง ์ฟผ๋ฆฌ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค. โ
์์กด์ฑ ๊ด๋ฆฌQueryKey๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ fetch ํ๋ค.ํ๋ผ๋ฏธํฐ๊ฐ ํฌํจ๋ QueryKey๋ ์์กด์ฑ์ฒ๋ผ ๋์ํ๋ค.// userId๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋..
๐ @๋ฐ์ฝ๋ ์ดํฐ๋?NestJS์์ ๋ฐ์ฝ๋ ์ดํฐ๋ ํด๋์ค, ๋ฉ์๋, ํ๋กํผํฐ, ํ๋ผ๋ฏธํฐ์ ์ถ๊ฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฌํ๊ฑฐ๋ ๋์์ ๋ฐ๊พธ๋ ์ญํ ์ ํ๋ค.TypeScript์ ๋ฐ์ฝ๋ ์ดํฐ ๋ฌธ๋ฒ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, NestJS์ ํต์ฌ ์ฒ ํ์ธ ๋ฉํํ๋ก๊ทธ๋๋ฐ + ์์กด์ฑ ์ฃผ์
(DI)์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํต์ฌ ์์์ด๋ค. ์ฝ๊ฒ ๋งํด,"Nest๊ฐ ์ด ์ฝ๋๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์ดํดํ๋๋ก ์๋ ค์ฃผ๋ ํ๊ทธ" ๐ค ์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํ์ํ๋ฐ?NestJS๋ Angular ์ํฅ์ ํฌ๊ฒ ๋ฐ์ ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.Nest๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด ํด๋์ค๋ฅผ ์ค์บ(scanning)ํ๊ณ ์ญํ ์ ํ์
ํด ๋ธ๋ถ IoC/DI ์ปจํ
์ด๋์ ๋ฑ๋กํ๋ค. ์ฆ, ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์์ด์ผ Nest๋ ๋ค์ ๋ด์ฉ๋ค์ ์ดํดํ ์ ์๋ค.โ
์ด๋ค ํด๋์ค๊ฐ ์ปจํธ๋กค๋ฌ์ธ์งโ
์ด๋ค ํด๋..
๋๋ง์ ๋ฐ์คํฌ ์ฑ์ ๋ง๋๋ ค๋๋ฐ ๊ณ ์ ์ ์ธ ์คํ์ผ์ ์๋จ ํ์ดํ ๋ฐ๊ฐ ๋ง์์ ๋ค์ง ์๋๋ค. Youtube Music์ ๋ฐ์คํฌํ ์ฑ๋ง ๋ณด๋๋ผ๋ ๋ญ๊ฐ ๋ค์ํ๋ค. ( ์ ํ๋ธ ๋๊ธฐ์
์น๊ณ ๋ ๋ชป ์๊ธด ๊ฑฐ ๊ฐ๋ค...) ์ฐ๋ฆฌ๋ ์ปค์คํ
ํด๋ณด์. ๐๏ธ ํ์ดํ๋ฐ ํ๋ ์ ์ ๊ฑฐ ์ฐ์ ๊ธฐ์กด TitleBar๋ ์ฌ๋ผ์ง๋๋ก ๐electron/main.ts ์์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฑ๋ ๋ ํ์ดํ๋ฐ์ ๋ฉ๋ด๋ฐ๊ฐ ์๋ ์ํ๋ก ๋ณ๊ฒฝํ๋ค.unction createWindow() { win = new BrowserWindow({ icon: path.join(process.env.VITE_PUBLIC, "electron-vite.svg"), webPreferences: { preload: path.join(__dirname, ..