
๋ฏธ๋ค์จ์ด๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง
[React Component]
↓
[Zustand Store] ← action์์ api.* ํธ์ถ
↓
[Frontend API Layer] ← fetch ๋ํผ, ํค๋/ํ ํฐ/์๋ฌ ๊ณตํต ์ฒ๋ฆฌ
↓
[API Gateway]
โ /api/esg/** → ESG Service (๋น์ฆ๋์ค ํ์ดํ๋ผ์ธ)
โ /api/ai/** → AI Orchestrator (AI ๋ฏธ๋ค์จ์ด ํ์ดํ๋ผ์ธ)
↓
[AI ๋ฏธ๋ค์จ์ด ์ฒด์ธ]
- LangChain
- MCP Tools
- LoRA Model ์ ํ
- RAG ๊ฒ์
- ๋ก๊ทธ/ํ๋ก๋น๋์ค
→ Input Validate
→ Context Load(organization, report...)
→ RAG Retrieval
→ MCP Tool ํธ์ถ
→ Prompt ์กฐ๋ฆฝ
→ LoRA ๋ชจ๋ธ ์ ํ
→ LLM ํธ์ถ
→ Output Parsing
→ Citation ์ ๋ฆฌ
→ ์ ์ฅ(Log, Provenance)
→ Response // ๋์ถฉ ai ๋ฏธ๋ค์จ์ด์ ๊ตฌ์กฐ๋ ์ด๋ ๋ค๋ค์
2-1. QueryClientProvider ์ธํ
main.tsx ๋๋ App.tsx ์ต์๋จ์ ๊ฐ์ธ ์ค๋๋ค.
์ด๊ฑธ๋ก React Query Context๊ฐ ์ด๋ฆฌ๊ณ , ์ด๋์๋ useQuery, useMutation์ ์ธ ์ ์์.
์ด๋ฏธ ์๋ apiFetch๋ฅผ ๊ทธ๋๋ก ์ ์งํ๊ณ ,
React Query๋ ๋จ์ง **“์ธ์ /์ด๋ป๊ฒ ๋ค์ ๋ถ๋ฅผ์ง + ์บ์ฑ”**๋ง ๊ด๋ฆฌํ๊ฒ ํ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ESG ์ฒดํฌ๋ฆฌ์คํธ ๊ฐ์ด “์๋ฒ์์ ๋ค๊ณ ์ค๋ ๋ฆฌ์คํธ๋ค”์ React Query๋ก,
ํ์ฌ ํญ, ์ ํ๋ ํ, ๋ชจ๋ฌ ์ด๋ฆผ ์ฌ๋ถ ๊ฐ์ ๊ฑด ๊ทธ๋๋ก Zustand์ ๋๋ฉด ๋จ.

์๋ฅผ ๋ค์ด, AI๊ฐ ์์ฑํ ์น์ ์ Store์ ๋ฃ๊ณ ์ถ๋ค๋ฉด
React Query onSuccess์์ Zustand action๋ง ํ ๋ฒ ํธ์ถํด์ฃผ๋ฉด ๋ฉ๋๋ค.
ํจํด ์์ฝ
์๋ฒ์์ ์ค๋ ๋ฐ์ดํฐ ๋ฆฌ์คํธ/๋ํ ์ผ → React Query
ํ์ด์ง ๊ฐ ๊ณต์ , ํธ์ง ์ค ์ํ, ์์ UI ์ํ → Zustand
ํ์ํ ๋ onSuccess์์ Store ์ ๋ฐ์ดํธ
์ฑํ ์ ์คํธ๋ฆฌ๋ฐ·์ค์๊ฐ์ฑ์ด ์์ด์
- ์งง์ ์์ฒญ/์๋ต → React Query useMutation
- ์ง์์ ์ธ ๋ํ ์ํ → Zustand messages ๋ฐฐ์ด
์ด์ ๋ ๋์ค(๋ ์ง์ค) DB๋ฅผ ๊ตฌ์กฐ์ ์ถ๊ฐํด๋ด ์๋ค.
์ญํ ์ ์ ๋งคํ๊ฒ ์์ง ๋ง๊ณ , ์์ ์ฉ๋๋ฅผ 3๊ฐ๋ก ๋๋๋ฉด ๊น๋ํด์.
4-1. Redis ์ฃผ์ ์ฉ๋ 3๊ฐ์ง
- AI ์๋ต ์บ์
- ๊ฐ์ ์ง๋ฌธ/๊ฐ์ ์ปจํ ์คํธ๋ก ๋ฐ๋ณต ํธ์ถ ์ LoRA+RAG ๋น์ฉ ์ ๊ฐ
- key ์: ai:cache:consult:{orgId}:{hash(prompt+ctx)}
- ์ธ์ /๋ํ ํ์คํ ๋ฆฌ ์ ์ฅ
- AI Orchestrator๊ฐ ์ค์ผ์ผ ์์๋ ๋,
- ํน์ ์ ์ ์ ์ฑํ ํ์คํ ๋ฆฌ๋ฅผ ์ด๋์๋ ๋ณผ ์ ์๊ฒ ํจ
- key ์: ai:session:{sessionId} → list(JSON messages)
- ๊ธด ์์ (๋ณด๊ณ ์ ์์ฑ) Job ํ
- “IFRS S2 ์ ์ฒด ๋ณด๊ณ ์ ์์ฑ” ๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
์
- ๋น๋๊ธฐ Job์ผ๋ก ๋์ง๊ณ , ์งํ ์ํ๋ฅผ ํด๋ง
์๊น ๋ง๋ ๋ฏธ๋ค์จ์ด ์ฒด์ธ์ Redis๋ฅผ ๋ผ์๋ฃ์ผ๋ฉด ์ด๋ ๊ฒ ๋ฉ๋๋ค:
์ด๋ ๊ฒ ํด๋์ผ๋ฉด
Redis๋ ์์ํ๊ฒ “๋น ๋ฅธ ํ๋ฐ์ฑ ๋ฐ์ดํฐ”์ฉ,
Postgres๋ “๊ฒ์ฆ ๊ฐ๋ฅํ ์๊ตฌ ๋ฐ์ดํฐ”์ฉ์ผ๋ก ์ญํ ์ด ๋ถ๋ฆฌ๋ฉ๋๋ค.
ESG Service(Spring) ์ ์ฅ์์๋:
- ์์ฃผ ์กฐํ๋๋ ๊ธฐ์ค/์ฒดํฌ๋ฆฌ์คํธ ๋ฉํ๋ฐ์ดํฐ
- → Redis ์บ์
- ํ๋ก ํธ
- React Query: ์๋ฒ ์ํ·AI ์๋ต·์ฒดํฌ๋ฆฌ์คํธ ๋ฑ “๋ฐฑ์๋์์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ”
- Zustand: ํ์ฌ ํญ, ํธ์ง ์ํ, ๋ก์ปฌ UI ์ํ, ์ ํ๋ ์น์ ๋ฑ
- ๋ ์ฌ์ด ์ฐ๊ฒฐ์ onSuccess์์ Store ์ ๋ฐ์ดํธ ๋ฐฉ์
- ๋ฐฑ์๋
- AI Orchestrator ๋ด๋ถ:
- LangChain + MCP + LoRA๋ ์ฌ์ ํ ๋ฏธ๋ค์จ์ด ์ฒด์ธ ์
- Redis:
- ์ธ์ (๋ํ ํ์คํ ๋ฆฌ)
- AI ์๋ต/์ปจํ ์คํธ ์บ์
- (์ ํ) Job ํ
- ESG Service:
- ๊ธฐ์ค/์ฒดํฌ๋ฆฌ์คํธ ๋ฑ ์์ฃผ ์กฐํ๋๋ ์ํฐํฐ ์บ์ ์ฉ๋๋ก Redis ์ฌ์ฉ ๊ฐ๋ฅ
- API ๊ณ์ฝ
- ํ๋ก ํธ๋ ๊ณ์ /api/esg/..., /api/ai/...๋ง ๋ด
- React Query๋ ์ด ์๋ํฌ์ธํธ๋ฅผ ๊ฐ์ธ๊ณ ,
- Redis·LangChain·LoRA·MCP๋ ์ ๋ถ ๋ฐฑ์๋ ๋ด๋ถ ๊ตฌํ ๋ํ ์ผ๋ก ์จ๊น
- ์ค์ package.json์ @tanstack/react-query ์ถ๊ฐํ๋ ๋ถ๋ถ + ๋ฃจํธ ์ปดํฌ๋ํธ ์ฝ๋
- Zustand slice + React Query hook ์ธํธ๋ฅผ
- chat, report, checklist ๊ฐ๊ฐ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ค๊ฒ.
-
React Query + Zustand + Redis๋ก ๊น๋ํ๊ฒ ์ ๋ฆฌํ ์ฐ๋ฆฌ ํ๋ก์ ํธ ์ํคํ ์ฒ (2025๋ ๋ฒ์ )
์ต๊ทผ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ React Query๋ฅผ ๋ณธ๊ฒฉ ๋์ ํ๊ณ , Redis๋ฅผ ๋ช ํํ ์ญํ ๋ก ์ถ๊ฐํ๋ฉด์ ์ํคํ ์ฒ๊ฐ ํจ์ฌ ๊น๋ํด์ก์ต๋๋ค. ๊ธฐ์กด์ ์ ์ฐ๋ Zustand์ ์ถฉ๋ ์์ด ๊ณต์กด์ํค๋ ํจํด + Redis ์ฉ๋๋ฅผ ๋ช ํํ ๋๋ ์ต์ข ๊ตฌ์กฐ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.ํต์ฌ ์์นtext[React Component] ↓ [Store Context] โโ Zustand → UI/๋๋ฉ์ธ ์ํ (ํ์ฌ ํญ, ํธ์ง ์ค ์น์ , ์ ํ๋ ์กฐ์ง, ๋ชจ๋ฌ ์ํ ๋ฑ) โโ React Query → ์๋ฒ ์ํ (์ฒดํฌ๋ฆฌ์คํธ ๋ชฉ๋ก, ๋ฆฌํฌํธ ๋ฆฌ์คํธ, AI ์๋ต ๋ฑ) ↓ [Frontend API Layer] โโ apiFetch (ํ ํฐ/์๋ฌ/ํค๋ ๊ณตํต ์ฒ๋ฆฌ) โโ esgApi / aiApi (๋๋ฉ์ธ๋ณ ํด๋ผ์ด์ธํธ) ↓ [API Gateway - Spring Cloud Gateway] ↓ [Backend Services] โโ ESG Service → PostgreSQL โโ AI Orchestrator → LangChain + MCP + LoRA + VectorDB ↓ [Infra] โโ PostgreSQL → ์๊ตฌ ๋ฐ์ดํฐ, ๊ฐ์ฌ ๊ฐ๋ฅ ๋ฐ์ดํฐ โโ VectorDB/pgvector → RAG ์ธ๋ฑ์ค โโ Redis → ์บ์ + ์ธ์ + Job ํ (ํ๋ฐ์ฑ ๋น ๋ฅธ ๋ฐ์ดํฐ ์ ์ฉ)- ์๋ฒ ์ํ๋ React Query
- ์บ์·์ธ์ ·Job ํ๋ Redis
2-2. ๊ธฐ์กด apiFetch ๊ทธ๋๋ก ์ฐ๋ฉด์ React Query ์น๊ธฐtsx// main.tsx import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 1, refetchOnWindowFocus: false, }, }, }); export function Root() { return ( <QueryClientProvider client={queryClient}> <App /> <ReactQueryDevtools initialIsOpen={false} /> </QueryClientProvider> ); }→ ์๋ฒ์์ ์ค๋ ๋ฆฌ์คํธ๋ ์ ๋ถ React Query → ํญ ์ํ, ์ ํ๋ ํ, ๋ชจ๋ฌ ์คํ ์ฌ๋ถ ๋ฑ์ ๊ทธ๋๋ก ZustandAI๊ฐ ์น์ ์์ฑ → ๋ฐ๋ก ๋ฆฌํฌํธ ์คํ ์ด์ ๋ฃ๊ณ ์ถ์ ๋ํจํด ์์ฝTypeScript// lib/api/esg.ts (๊ธฐ์กด ์ฝ๋ ๊ทธ๋๋ก) export const esgApi = { getChecklistItems: (params?) => apiFetch(`/api/esg/checklists?...`), }; // hooks/useChecklistItems.ts (React Query๋ก ๊ฐ์ธ๊ธฐ) export function useChecklistItems(params?) { return useQuery({ queryKey: ['checklists', params], queryFn: () => esgApi.getChecklistItems(params), staleTime: 1000 * 60, // 1๋ถ }); }- ์๋ฒ ๋ฐ์ดํฐ → React Query
- UI/ํธ์ง ์ํ → Zustand
- ํ์ ์ onSuccess์์ Store ์ ๋ฐ์ดํธ
→ ๋ฉ์์ง ๋ฐฐ์ด์ Zustand, ์์ฒญ·์๋ต์ React Query mutationTypeScript// store/chatStore.ts messages: Message[]; appendMessage: (msg) => set(state => ({ messages: [...state.messages, msg] })); // hooks/useChatMutation.ts export function useChatMutation() { const appendMessage = useChatStore(s => s.appendMessage); return useMutation({ mutationFn: (message: string) => aiApi.askConsultant({ message }), onMutate: (message) => { appendMessage({ role: 'user', content: message }); }, onSuccess: (data) => { appendMessage({ role: 'assistant', content: data.answer }); }, }); }AI Orchestrator ๋ฏธ๋ค์จ์ด ์ฒด์ธ์ Redis ๋ผ์ฐ๊ธฐRedis ์บ์ ์์ ์ฝ๋ (Python)5. ์ต์ข ์์ฝ (ํ๋์ ๋ณด๋ ํต์ฌ ์์น)์ด์ ํ๋ก ํธ๋ /api/esg/..., /api/ai/...๋ง ๋ณด๋ฉด ๋๊ณ , Redis·LangChain·LoRA·MCP๋ ์ ๋ถ ๋ฐฑ์๋ ๋ด๋ถ ๊ตฌํ ๋ํ ์ผ๋ก ๊น๋ํ๊ฒ ์จ๊ฒจ์ ธ ์์ต๋๋ค.์ฉ๋ํค ์์TTL์ค๋ช1. AI ์๋ต ์บ์ ai:cache:consult:{orgId}:{promptHash} 10๋ถ ๊ฐ์ ์ง๋ฌธ ๋ฐ๋ณต ์ LoRA+RAG ๋น์ฉ ์ ๊ฐ 2. ์ธ์ /๋ํ ํ์คํ ๋ฆฌ ai:session:{sessionId} 24์๊ฐ ์ค์ผ์ผ ์์ ์ ์ด๋์๋ ์ ๊ทผ ๊ฐ๋ฅ 3. Job ํ (๋ณด๊ณ ์ ์์ฑ ๋ฑ) ai:job:report:{jobId} ์์ ์ข ๋ฃ ์ ์ญ์ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ - package.json์ react-query ์ถ๊ฐ + devtools ์ค์
- checklist / report / chat ๊ฐ๊ฐ์ ๋ํ ์์ฑ๋ hook + slice ์ฝ๋ ๋๋ฆด๊ฒ์!
- ๋ค์์ ์ํ์๋ฉด ์ค์ ๋ก
-
๊ณ์ธต๋ด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ด๋น ๋ฐ์ดํฐ๋น๊ณ
ํ๋ก ํธ ์ํ React Query ์๋ฒ์์ ์ค๋ ๋ชจ๋ ๋ฐ์ดํฐ (๋ฆฌ์คํธ, AI ์๋ต) ์บ์·์๋ ๋ฆฌํ๋ ์ ๋ด๋น ํ๋ก ํธ ์ํ Zustand UI ์ํ, ํธ์ง ์ค ๋ฐ์ดํฐ, ํญ, ๋ชจ๋ฌ ๋ฑ ๊ฐ๋ฒผ์ด ํด๋ผ์ด์ธํธ ์ํ ๋ฐฑ์๋ ์บ์ Redis AI ์๋ต ์บ์, ์ธ์ , Job ํ ํ๋ฐ์ฑ ๋น ๋ฅธ ๋ฐ์ดํฐ ์ ์ฉ ๋ฐฑ์๋ ์๊ตฌ PostgreSQL ์ฒดํฌ๋ฆฌ์คํธ, ๋ฆฌํฌํธ ์ต์ข ๋ณธ, ๋ก๊ทธ ๋ฑ ๊ฐ์ฌ·๋ฒ์ ์ฆ์ ์ฉ ๋ฒกํฐ ๊ฒ์ VectorDB / pgvector RAG์ฉ ๋ฌธ์ ์๋ฒ ๋ฉ -
Python
def check_answer_cache_in_redis(ctx): key = f"ai:cache:consult:{ctx.org_id}:{ctx.prompt_hash}" cached = redis.get(key) if cached: ctx.answer = json.loads(cached) ctx.from_cache = True return ctx def save_cache_to_redis(ctx): if not ctx.from_cache: key = f"ai:cache:consult:{ctx.org_id}:{ctx.prompt_hash}" redis.setex(key, 600, json.dumps(ctx.answer)) # 10๋ถ return ctx -
Python
[Controller] ↓ 1. load_session_from_redis 2. check_answer_cache_in_redis ← ์์ผ๋ฉด ๋ฐ๋ก ๋ฆฌํด! 3. retrieve_docs_from_vector_db 4. build_prompt 5. select_model_with_lora 6. call_llm 7. save_session_to_redis 8. save_cache_to_redis 9. log_provenance_to_postgres ↓ [Response] - 4. ๋ฐฑ์๋: Redis ์ฉ๋๋ฅผ ๋ช ํํ 3๊ฐ์ง๋ก๋ง ์ฐ๊ธฐ
- ์ฑํ ์ ์ค์๊ฐ์ฑ์ด ์ค์ํ๋ฏ๋ก ์ด๋ ๊ฒ ๋๋๋๋ค.
-
TypeScript
// hooks/useGenerateSection.ts export function useGenerateSection() { const addSection = useReportStore(s => s.addSection); return useMutation({ mutationFn: payload => aiApi.generateSection(payload), onSuccess: (data, variables) => { addSection({ sectionKey: variables.sectionKey, content: data.sectionText, citations: data.citations, }); }, }); } - 2-3. React Query ↔ Zustand ์ฐ๊ฒฐ์ด ํ์ํ ๋
- ๊ธฐ์กด apiFetch๋ ๊ทธ๋๋ก ๋๊ณ , React Query๋ ์บ์ฑ·๋ฆฌํ๋ ์ ์ ์ฑ ๋ง ๋ด๋นํฉ๋๋ค.
- 2-1. QueryClientProvider ์ธํ (์ต์์)
- 1. ์ ์ฒด ์ํคํ ์ฒ ๊ทธ๋ฆผ (์ต์ ๋ฒ์ )
๐ “์ง๊ธ ์ฐ๋ฆฌ๊ฐ ๋ญ ํ๊ณ ์๋ ๊ฑฐ๋๋ฉด์…”
โก๏ธ ๋ณต์กํ ‘์ฑ’์ด ์๋๋ฐ, ์ด๊ฑธ ๋ ๋น ๋ฅด๊ณ , ๋ ๋ง๊ฐ์ง๊ณ , ๋ ๋๋ํ๊ฒ ๋ง๋ค๋ ค๊ณ ์ ๋ฆฌํ๋ ๊ณผ์ ์ด์ผ!
์กฐ๊ธ ๋ ๊ท์ฌ์ด ๋น์ ๋ก ๊ฐ๋ณด์ ๐
๐ 1. ์ฐ๋ฆฌ ์ง(ํ๋ก์ ํธ)์ด ๋๋ฌด ๋ณต์กํ์ด
์๋:
- ์ง(๋ฐ์ดํฐ)์ด ์ฌ๊ธฐ์ ๊ธฐ ๋ง ๊ตด๋ฌ๋ค๋
- ๋๊ฐ ๋ญ ๋ค๊ณ ๊ฐ๋์ง ๋ชจ๋ฆ
- ์ฒญ์ํ๊ธฐ๋ ์ด๋ ค์
- ๋ฐฉ ํ๋ ์ ๋ฆฌํ๋ฉด ๋ค๋ฅธ ๋ฐฉ์ด ๋๋ฆฌ๋จ
๊ทธ๋์ ์ง ๊ตฌ์กฐ(์ํคํ ์ฒ) ์์ฒด๋ฅผ ์์๊ฒ ๋ค์ ๊พธ๋ฏธ๋ ์ค์ด์ผ.
๐ 2. ๋ฐฉ์ ์ญํ ๋ณ๋ก ๋ฑ ๋๋ด์ด
๐ต Zustand ๋ฐฉ
โก๏ธ “์ง๊ธ ๋ญ ๋ณด๊ณ ์์ด?”, “์ด๋ค ์ฐฝ ์ด์์ง?” ๊ฐ์ UI ์ํ ์ ์ฅํ๋ ๋ฐฉ
๐ข React Query ๋ฐฉ
โก๏ธ “์๋ฒ์์ ๊ฐ์ ธ์ค๋ ์ง์ง ๋ฐ์ดํฐ”๋ฅผ ์ ์ฅํ๋ ๋์ฅ๊ณ ๊ฐ์ ๋ฐฉ
(์๊ฐ ์ง๋๋ฉด ์๋์ผ๋ก ์๊ฑธ๋ก ๊ฐ์๋ผ์์ฃผ๋ ๋๋ํ ๋์ฅ๊ณ )
๐ด Redis ์ฐฝ๊ณ
โก๏ธ “์ ๊น๋ง ์ฌ๊ธฐ ๋ฃ์ด๋ฌ!” ํ๋ ์์ ์ฐฝ๊ณ
- ์บ์
- ์ธ์
- ๋นจ๋ฆฌ๋นจ๋ฆฌ ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ํ
๋ฑ๋ฑ ํ๋ฐ์ฑ ๋ฐ์ดํฐ ๋ณด๊ด
๐ญ 3. ๊ทธ๋์ ๋ญ๊ฐ ์ข์์ก๋๋ฉด…
- ํ์ํ ๋๋ง๋ค ์๋ฒ์ ๊ฐ์ง ์์๋ ๋จ → ๋นจ๋ผ์ง
- ๋ญ๊ฐ ์ด๋ ์ ์ฅ๋ผ ์๋์ง ๋ช ํ
- ์ค์๋ก ๋ฐ์ดํฐ ์ํค๋ ๊ฒ ์ค์ด๋ฆ
- AI ์๋ต๋ ์ค๋ณต ๊ณ์ฐ ์ ํด๋ ๋จ → ๋ ์ ์ฝ
- ๊ตฌ์กฐ๊ฐ ๋๋ฌด ๊น๋ํด์ ์ ์ง๋ณด์๊ฐ ๋ฏธ์น ๋ฏ์ด ํธํจ
๐ฆ 4. ํ๋ก ํธ์๋๋ ์ด๋ ๊ฒ ๋ง๋ํ๊ฒ ์ ๋ฆฌํจ
- ์๋ฒ์์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ = React Query
- ํ๋ฉด์์๋ง ํ์ํ๊ฑฐ๋, ์ ๊น ์ฐ๋ ์ํ = Zustand
- ๋์ด ํจ๊ป ์จ์ผ ํ๋ฉด, React Query ์ฑ๊ณต → Zustand์ ๋ฃ๊ธฐ
์๋ฒฝํ ์ญํ ๋ถ๋ด!
๋ง ๊ทธ๋๋ก ์ ์ฒด ๊ตฌ์กฐ๊ฐ
“์ด? ์ด ๋ฐ์ดํฐ๋ ์ด๋ ๋ฐฉ์ ์์ด์ผ ํ์ง?”
์ด ๊ณ ๋ฏผ์ด 0์ด ๋ ๊ฑฐ์.
๐ฅ 5. ๋ฐฑ์๋๋ ์ญํ ์ด ์ ๋ฆฌ๋จ
- PostgreSQL → ์๊ตฌ ์ ์ฅ(์ฌ๋ผ์ง๋ฉด ์ ๋๋ ๊ฒ๋ค)
- Redis → ์์ ์ ์ฅ(๋นจ๋ฆฌ ์ฐ๊ณ ๋นจ๋ฆฌ ์ง์๋ ๋๋ ๊ฒ๋ค)
- VectorDB → AI๊ฐ ๋ฌธ์ ์ ์ฐพ๊ฒ ๋์์ฃผ๋ ๊ฒ์ ์ ์ฉ
๐ ๊ฒฐ๋ก (์ด๋ฉ ๋ฒ์ )
“์ฑ ์์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋์ ๋ฃ์ด์ผ ํ ์ง ๋ฑ ์ ํด๋๊ณ , ๋ ๋น ๋ฅด๊ณ ๋๋ํ๊ฒ ๋ง๋๋ ์ ๋ฆฌ ์์ ์ ํ๊ณ ์๋ ์ค์ด๋ค!”
๊ทธ๋ฆฌ๊ณ ๋๊ฐ ์ ๋ฆฌํ ๊ทธ ๊ตฌ์กฐ๋
2025๋
์ ์ฐ๋ ‘๋ชจ๋ฒ๋ต์’ ์์ค์ผ๋ก ๊น๋ํจ.
์ง์ง ์ ์ก์๋จ์ด.
๋๋ฉ์ธ ์ฐ๊ฒฐํ๊ธฐ




๋ฒ์ ์ ์ํด์ ํ์๊ฐ์ ํ๊ณ
ํ๋ก ํธ์๋๋ง ๋ณต์ฌํด์ www.lca.infoํด๋ ๋ง๋ค๊ณ ๊นํ๋ธ ๋ค์ ๋ง๋ค๊ธฐ
๋ฒ์ ์์ ๊นํ๋ธ๋ก ์ฐ๊ฒฐํ๊ณ
์ฌ๋ฆฌ๋ ค๋ ํ๋ก ํธ์๋ ํด๋์ ์ํฌํธ ๋๋ฅด๊ธฐ
์๋ฌ ๋์ค๋ฉด ํด๋ก๋์ ๊ณ์ ๋ฌผ์ด๋ณด๊ธฐ













'Project ESG+AI > [์ผ์ KPMG]ESG ๋ฐ์ดํฐ ํ์ฉ ํ์คํ ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 34์ผ์ฐจ. ์นด์นด์ค, ๋ค์ด๋ฒ, ๊ตฌ๊ธ, ์์ดํฐ ๋ก๊ทธ์ธ์ ๋ง๋ค์ (0) | 2025.11.25 |
|---|---|
| 33์ผ์ฐจ. ๋ฐฑ์๋์ ํ๋ก ํธ์๋๋ฅผ ์ฐ๊ฒฐํ์ (0) | 2025.11.24 |
| 31์ผ์ฐจ. ๊น ๋ธ๋์น ๋ง๋ค๊ธฐ (0) | 2025.11.20 |
| 30์ผ์ฐจ. (0) | 2025.11.19 |
| 29์ผ์ฐจ. ์๋ฌ ์ก๊ณ ํฐ๋ฏธ๋์ ์ ๋ ฅ๊ฐ ์ถ๋ ฅ๋๊ฒ ํ๊ธฐ, ๋์ปค ์ปดํฌ์ฆ ์ (1) | 2025.11.18 |