[{"data":1,"prerenderedAt":513},["ShallowReactive",2],{"navigation_docs_ko":3,"-ko-note-devops-webassembly":195,"-ko-note-devops-webassembly-surround":508},[4,124,181],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":27},"Note (개발 지식)","emojione-v1:note-pad","\u002Fko\u002Fnote","ko\u002F1.note",[10,28,42,68,78,88,104,114],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":27},"Spring","logos:spring-icon","\u002Fko\u002Fnote\u002Fspring","ko\u002F1.note\u002F0.spring",[16],{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":27},"Spring Ai","custom:ai","\u002Fko\u002Fnote\u002Fspring\u002Fspring-ai","ko\u002F1.note\u002F0.spring\u002F1.spring-ai",[22],{"title":23,"path":24,"stem":25,"icon":26},"Spring AI 핵심 개념과 LLM 애플리케이션 구조 이해","\u002Fko\u002Fnote\u002Fspring\u002Fspring-ai\u002Fspring-ai","ko\u002F1.note\u002F0.spring\u002F1.spring-ai\u002F1.spring-ai","lucide:file-text",false,{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":27},"Javascript","skill-icons:javascript","\u002Fko\u002Fnote\u002Fjavascript","ko\u002F1.note\u002F1.javascript",[34,38],{"title":35,"path":36,"stem":37,"icon":26},"Promise.all과 구조 분해 할당을 활용한 데이터 처리 패턴","\u002Fko\u002Fnote\u002Fjavascript\u002Fdestructuring","ko\u002F1.note\u002F1.javascript\u002F1.destructuring",{"title":39,"path":40,"stem":41,"icon":26},"JavaScript 배열 고차 함수와 데이터 처리 패턴 이해","\u002Fko\u002Fnote\u002Fjavascript\u002Ffilter","ko\u002F1.note\u002F1.javascript\u002F2.filter",{"title":43,"icon":44,"path":45,"stem":46,"children":47,"page":27},"Nuxt4","logos:nuxt-icon","\u002Fko\u002Fnote\u002Fnuxt4","ko\u002F1.note\u002F2.nuxt4",[48,52,56,60,64],{"title":49,"path":50,"stem":51,"icon":26},"Nuxt 4를 선택한 이유와 아키텍처 및 실무 가이드","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-info","ko\u002F1.note\u002F2.nuxt4\u002F1.nuxt-info",{"title":53,"path":54,"stem":55,"icon":26},"Nuxt useAsyncData 동작 원리와 SSR 데이터 페칭 최적화","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-use_async_data","ko\u002F1.note\u002F2.nuxt4\u002F2.nuxt-use_async_data",{"title":57,"path":58,"stem":59,"icon":26},"Nuxt Content v3 데이터 모델과 Query 시스템 이해","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-content-v3","ko\u002F1.note\u002F2.nuxt4\u002F3.nuxt-content-v3",{"title":61,"path":62,"stem":63,"icon":26},"Nuxt Auto-imports 내부 동작과 컴파일 과정 분석","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-auto-import","ko\u002F1.note\u002F2.nuxt4\u002F4.nuxt-auto-import",{"title":65,"path":66,"stem":67,"icon":26},"Nuxt 렌더링 방식 이해: SSR, SSG, ISR, CSR 구현 방법","\u002Fko\u002Fnote\u002Fnuxt4\u002Fnuxt-rendering-strategy","ko\u002F1.note\u002F2.nuxt4\u002F5.nuxt-rendering-strategy",{"title":69,"icon":70,"path":71,"stem":72,"children":73,"page":27},"Nitro","unjs:nitro","\u002Fko\u002Fnote\u002Fnitro","ko\u002F1.note\u002F3.nitro",[74],{"title":75,"path":76,"stem":77,"icon":26},"Nitro 아키텍처와 서버 엔진 구조","\u002Fko\u002Fnote\u002Fnitro\u002Fnitro","ko\u002F1.note\u002F3.nitro\u002Fnitro",{"title":79,"icon":80,"path":81,"stem":82,"children":83,"page":27},"Devops","vscode-icons:file-type-pipeline","\u002Fko\u002Fnote\u002Fdevops","ko\u002F1.note\u002F4.devops",[84],{"title":85,"path":86,"stem":87,"icon":26},"서버사이드 WebAssembly(Wasm)와 차세대 실행 환경","\u002Fko\u002Fnote\u002Fdevops\u002Fwebassembly","ko\u002F1.note\u002F4.devops\u002F1.webAssembly",{"title":89,"icon":90,"path":91,"stem":92,"children":93,"page":27},"Tooling","lucide:wrench","\u002Fko\u002Fnote\u002Ftooling","ko\u002F1.note\u002F4.tooling",[94],{"title":95,"icon":96,"path":97,"stem":98,"children":99,"page":27},"Package Manager","devicon:npm","\u002Fko\u002Fnote\u002Ftooling\u002Fpackage-manager","ko\u002F1.note\u002F4.tooling\u002F1.package-manager",[100],{"title":101,"path":102,"stem":103,"icon":26},"Package Lock 파일의 역할과 의존성 관리 원리","\u002Fko\u002Fnote\u002Ftooling\u002Fpackage-manager\u002Fpackage-lock","ko\u002F1.note\u002F4.tooling\u002F1.package-manager\u002F1.package-lock",{"title":105,"icon":106,"path":107,"stem":108,"children":109,"page":27},"Web","streamline-plump:web","\u002Fko\u002Fnote\u002Fweb","ko\u002F1.note\u002F4.web",[110],{"title":111,"path":112,"stem":113,"icon":26},"웹 애플리케이션 렌더링 아키텍처 이해","\u002Fko\u002Fnote\u002Fweb\u002Frendering-modes","ko\u002F1.note\u002F4.web\u002F2.rendering-modes",{"title":115,"icon":116,"path":117,"stem":118,"children":119,"page":27},"SEO","icon-park-solid:seo","\u002Fko\u002Fnote\u002Fseo","ko\u002F1.note\u002F6.seo",[120],{"title":121,"path":122,"stem":123,"icon":26},"[SEO] 개발 블로그 검색 노출을 위한 robots.txt와 SEO 설정 가이드","\u002Fko\u002Fnote\u002Fseo\u002Fseo","ko\u002F1.note\u002F6.seo\u002F1.seo",{"title":125,"icon":126,"path":127,"stem":128,"children":129,"page":27},"Project (개발일지)","icon-park-solid:branch-two","\u002Fko\u002Fproject","ko\u002F2.project",[130],{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":27},"Brolog","custom:symbol","\u002Fko\u002Fproject\u002Fbrolog","ko\u002F2.project\u002F1.brolog",[136,140,144,148,152,156,160,164,168,173,177],{"title":137,"path":138,"stem":139,"icon":26},"Brolog 프로젝트 개요","\u002Fko\u002Fproject\u002Fbrolog\u002Foutline","ko\u002F2.project\u002F1.brolog\u002F1.outline",{"title":141,"path":142,"stem":143,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (3) - Runtime 기능 문제 분석과 AI Assistant 전환","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy3-ai-integration","ko\u002F2.project\u002F1.brolog\u002F10.vercel-deploy3-ai-integration",{"title":145,"path":146,"stem":147,"icon":26},"[Brolog] AI Assistant 적용 과정 - Agent 구조와 API 사용량 관리 시 고려사항","\u002Fko\u002Fproject\u002Fbrolog\u002Fai-assistant-application-process","ko\u002F2.project\u002F1.brolog\u002F11.ai-assistant-application-process",{"title":149,"path":150,"stem":151,"icon":26},"[Brolog] 검색 엔진 노출을 위한 SEO 적용 과정","\u002Fko\u002Fproject\u002Fbrolog\u002Fbrolog-seo","ko\u002F2.project\u002F1.brolog\u002F12.brolog-seo",{"title":153,"path":154,"stem":155,"icon":26},"Brolog 프로젝트 구조","\u002Fko\u002Fproject\u002Fbrolog\u002Fstructure","ko\u002F2.project\u002F1.brolog\u002F2.structure",{"title":157,"path":158,"stem":159,"icon":26},"[Nuxt Content] 네비게이션 아이콘 커스텀 빌드","\u002Fko\u002Fproject\u002Fbrolog\u002Fcustom-icon","ko\u002F2.project\u002F1.brolog\u002F3.custom-icon",{"title":161,"path":162,"stem":163,"icon":26},"[Nuxt 4] Auto-imports 동작 원리와 자동 import 시스템 이해","\u002Fko\u002Fproject\u002Fbrolog\u002Fnuxt-auto-import","ko\u002F2.project\u002F1.brolog\u002F4.nuxt-auto-import",{"title":165,"path":166,"stem":167,"icon":26},"[Brolog] 개발 블로그 메인 페이지 구현","\u002Fko\u002Fproject\u002Fbrolog\u002Fdevelop-main","ko\u002F2.project\u002F1.brolog\u002F5.develop-main",{"title":169,"path":170,"stem":171,"icon":172},"[Brolog] 브랜드 아이덴티티 적용 - Custom 404 페이지와 Default No Image 구현","\u002Fko\u002Fproject\u002Fbrolog\u002Fcustom-error-and-default-thumbnail","ko\u002F2.project\u002F1.brolog\u002F6.custom-error-and-default-thumbnail","lucide:image",{"title":174,"path":175,"stem":176,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (1)","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy1","ko\u002F2.project\u002F1.brolog\u002F8.vercel-deploy1",{"title":178,"path":179,"stem":180,"icon":26},"[Brolog] Nuxt Multi Layer 프로젝트 Vercel 배포 (2) - Build Pipeline 오류 분석과 Nuxt 실행 구조 이해","\u002Fko\u002Fproject\u002Fbrolog\u002Fvercel-deploy2-error-analyze","ko\u002F2.project\u002F1.brolog\u002F9.vercel-deploy2-error-analyze",{"title":182,"icon":183,"path":184,"stem":185,"children":186,"page":27},"Error (트러블슈팅)","emojione:stop-sign","\u002Fko\u002Ftrouble-shooting","ko\u002F3.trouble-shooting",[187],{"title":131,"icon":132,"path":188,"stem":189,"children":190,"page":27},"\u002Fko\u002Ftrouble-shooting\u002Fbrolog","ko\u002F3.trouble-shooting\u002F1.brolog",[191],{"title":192,"path":193,"stem":194,"icon":26},"[Nuxt Content] Nuxt Icon 오류 해결과 Custom Collection 기반 오프라인 아이콘 구성","\u002Fko\u002Ftrouble-shooting\u002Fbrolog\u002Fnuxt-icon-restricted-network-troubleshooting","ko\u002F3.trouble-shooting\u002F1.brolog\u002F1.nuxt-icon-restricted-network-troubleshooting",{"id":196,"title":85,"body":197,"date":493,"description":494,"extension":495,"links":496,"meta":497,"navigation":503,"path":86,"seo":504,"stem":87,"__hash__":507},"docs_ko\u002Fko\u002F1.note\u002F4.devops\u002F1.webAssembly.md",{"type":198,"value":199,"toc":474},"minimark",[200],[201,202,204,209,213,229,232,236,239,244,247,251,262,269,271,275,282,288,291,293,297,300,411,413,417,420,427,433,437,440,444,454,456,460,463],"u-page-card",{":spotlight":203},"true",[205,206,208],"h2",{"id":207},"_1-wasm-브라우저-탈출기","🧭 1. Wasm, 브라우저 탈출기",[210,211,212],"p",{},"과거 WebAssembly(이하 Wasm)는 프론트엔드 개발자들의 전유물 혹은 웹에서 C++이나 Rust 기반의 무거운 게임\u002F피그마(Figma) 같은 그래픽 툴을 돌리기 위한 고성능 '브라우저 샌드박스 엔진'으로만 취급받았다. 브라우저 내부의 자바스크립트 엔진 성능 한계를 극복하기 위한 특수 목적용 가속기였던 셈이다.",[210,214,215,216,220,221,224,225,228],{},"그러나 최근 클라우드 및 인프라 생태계는 ",[217,218,219],"strong",{},"Wasm의 서버사이드 확장","에 주목하며 거대한 패러다임 전환을 맞이하고 있다. 핵심 골자는 브라우저라는 감옥을 탈출한 Wasm이 시스템 자원에 접근할 수 있는 ",[217,222,223],{},"WASI(WebAssembly System Interface)"," 표준을 확립하면서, 가상화 인프라의 절대강자였던 ",[217,226,227],{},"도커(Docker) 컨테이너 아키텍처","를 보완하고 대체하는 백엔드 솔루션으로 진화했다는 점이다.",[230,231],"hr",{},[205,233,235],{"id":234},"️-2-아키텍처-및-핵심-메커니즘-도커-vs-wasm","🏗️ 2. 아키텍처 및 핵심 메커니즘: 도커 vs Wasm",[210,237,238],{},"가상화 환경을 격리하고 실행하는 방식의 차이를 보면 두 기술의 목적지와 구조적 차이가 명확하게 드러난다.",[240,241,243],"h3",{"id":242},"가상화-계층의-오버헤드overhead-제거","① 가상화 계층의 오버헤드(Overhead) 제거",[210,245,246],{},"도커는 독립된 환경을 만들기 위해 리눅스 커널 수준에서 게스트 OS 계층을 복제하거나 최소한의 파일 시스템 레이어를 통째로 패키징해야 한다. 이로 인해 가벼운 애플리케이션도 최소 수백 MB 단위의 컨테이너 용량을 차지하며, 컨테이너가 최초 구동될 때 파일 시스템을 마운트하고 네트워크 인터페이스를 켜는 데 초(seconds) 단위의 지연 시간이 필수적으로 발생한다.",[240,248,250],{"id":249},"wasm-runtime-기반의-초경량-샌드박싱","② Wasm runtime 기반의 초경량 샌드박싱",[210,252,253,254,261],{},"반면 서버사이드 Wasm은 OS나 하드웨어를 통째로 가상화하지 않는다. Rust, Go, C++ 등으로 작성된 소스코드를 단 하나의 고유한 기계어 바이트코드인 ",[217,255,256,260],{},[257,258,259],"code",{},".wasm"," 바이너리 파일","로 컴파일한다.",[210,263,264,265,268],{},"이후 호스트 시스템 위에 상주하는 초경량 Wasm 가상 머신 런타임(예: Wasmtime, Wasmer)이 이 바이너리를 읽어 즉시 네이티브 코드로 변환 후 구동한다. OS 레이어와 데몬 프로세스가 완전히 생략되었기 때문에 용량은 수 MB 이하로 줄어들고, 구동 속도는 ",[217,266,267],{},"1~5밀리초($\\text{ms}$)"," 수준으로 즉시 수렴한다.",[230,270],{},[205,272,274],{"id":273},"️-핵심-표준-기술-wasi-webassembly-system-interface","🛠️ 핵심 표준 기술: WASI (WebAssembly System Interface)",[210,276,277,278,281],{},"Wasm이 브라우저 외부 백엔드 서버에서 실행되기 위해 가장 핵심이 되는 기술적 기반은 ",[217,279,280],{},"WASI","다.",[210,283,284,285,281],{},"원래 Wasm은 브라우저 안에서만 돌도록 설계되었기 때문에 보안상 컴퓨터의 파일 시스템을 읽거나 네트워크 소켓을 열 수 없었다. WASI는 Wasm 바이너리가 OS 호스트의 자원(파일 API, 네트워크 통신, 시스템 시간 등)과 안전하게 통신할 수 있도록 다리를 놓아주는 ",[217,286,287],{},"추상화된 OS 인터페이스 표준 세트",[210,289,290],{},"덕분에 개발자는 특정 OS나 특정 CPU 아키텍처(x86, ARM 등)에 종속되지 않는 이식성 높은 백엔드 프로그램을 단 한 번의 빌드로 구현할 수 있게 되었다.",[230,292],{},[205,294,296],{"id":295},"가상화-기술-세부-비교","🤝 가상화 기술 세부 비교",[210,298,299],{},"실무 인프라 설계 관점에서 두 가상화 기술이 가지는 성능적, 구조적 차이는 다음과 같이 요약된다.",[301,302,303,320],"table",{},[304,305,306],"thead",{},[307,308,309,314,317],"tr",{},[310,311,313],"th",{"align":312},"left","비교 항목",[310,315,316],{"align":312},"도커 (Docker Container)",[310,318,319],{"align":312},"서버사이드 Wasm (WebAssembly)",[321,322,323,337,353,369,385,398],"tbody",{},[307,324,325,331,334],{},[326,327,328],"td",{"align":312},[217,329,330],{},"가상화 대상",[326,332,333],{"align":312},"리눅스 커널 \u002F 파일 시스템 (OS 수준 격리)",[326,335,336],{"align":312},"언어별 컴파일된 바이트코드 (애플리케이션 수준 격리)",[307,338,339,344,347],{},[326,340,341],{"align":312},[217,342,343],{},"기동 속도 (Startup Time)",[326,345,346],{"align":312},"수 초 ($\\text{sec}$) 단위 지연 발생",[326,348,349,352],{"align":312},[217,350,351],{},"1~5밀리초 ($\\text{ms}$)"," 미만 (Cold Start 제로)",[307,354,355,360,363],{},[326,356,357],{"align":312},[217,358,359],{},"메모리 \u002F 파일 크기",[326,361,362],{"align":312},"최소 수십 MB ~ 수 GB 단위 (무거움)",[326,364,365,368],{"align":312},[217,366,367],{},"수 KB ~ 수 MB 단위"," (초경량)",[307,370,371,376,379],{},[326,372,373],{"align":312},[217,374,375],{},"이식성 (Cross-Platform)",[326,377,378],{"align":312},"타겟 CPU 아키텍처(x86\u002FARM)별 이미지 빌드 필요",[326,380,381,382],{"align":312},"한 번 빌드하면 ",[217,383,384],{},"아키텍처 무관하게 동일 바이너리 실행",[307,386,387,392,395],{},[326,388,389],{"align":312},[217,390,391],{},"메모리 관리 안전성",[326,393,394],{"align":312},"호스트 OS 커널 공유로 인한 취약점 존재 가능",[326,396,397],{"align":312},"가상 머신 내부 메모리 공간이 완전히 격리된 샌드박스 형태",[307,399,400,405,408],{},[326,401,402],{"align":312},[217,403,404],{},"생태계 성숙도",[326,406,407],{"align":312},"매우 성숙함 (모든 백엔드 언어\u002F프레임워크 지원)",[326,409,410],{"align":312},"성장 중 (Rust\u002FGo\u002FC++ 궁합 최상, Python\u002FJava는 런타임 이식 진행 중)",[230,412],{},[205,414,416],{"id":415},"_3-프로덕션-적용-및-인프라-실무-사례","📦 3. 프로덕션 적용 및 인프라 실무 사례",[210,418,419],{},"이 기술은 결코 이론 속의 유토피아가 아니다. 이미 글로벌 테크 기업들은 거대 트래픽을 처리하는 코어 인프라에 Wasm을 심어 막대한 비용 절감과 성능 향상을 누리고 있다.",[240,421,423,424],{"id":422},"cloudflare-workers-workerd","① Cloudflare Workers & ",[257,425,426],{},"workerd",[210,428,429,430,432],{},"우리가 모던 웹 프레임워크(Next.js, Nuxt 4 등)를 서버리스 엣지에 배포할 때 만나는 Cloudflare 인프라의 핵심 심장이 바로 Wasm 기반의 오픈소스 런타임 **",[257,431,426],{},"**이다. 전 세계 분산 에지 서버에서 Node.js 전체 인스턴스를 무겁게 띄우는 대신, Wasm 컨텍스트만 V8 격리 기술 안에서 1ms 만에 스위칭하여 지연 시간 없는 초고속 SSR 분산 처리를 구현한다.",[240,434,436],{"id":435},"vercel-functions-fluid-compute","② Vercel Functions (Fluid Compute)",[210,438,439],{},"Vercel 역시 백엔드 인프라의 고질적인 지연 시간(Cold Start)을 혁신적으로 줄이기 위해 V8 격리 기술 및 서버사이드 Wasm 샌드박싱 아키텍처를 적극 도입했다. 유저의 HTTP 요청이 들어오는 즉시 유휴 자원을 긁어모아 밀리초 단위로 백엔드 코드를 깨우는 원동력이 바로 Wasm의 가벼움에서 나온다.",[240,441,443],{"id":442},"엔터프라이즈-플러그인-아키텍처-istio-envoy-proxy","③ 엔터프라이즈 플러그인 아키텍처 (Istio \u002F Envoy Proxy)",[210,445,446,447,450,451,453],{},"쿠버네티스 환경에서 서비스 간 트래픽을 제어하는 프록시 엔진인 ",[217,448,449],{},"Envoy","나 API 게이트웨이 생태계에서는 메인 서버를 재시작하지 않고도 실시간으로 기능을 확장할 수 있는 '플러그인 시스템'의 표준으로 Wasm을 채택했다. Rust로 커스텀 인증\u002F필터 로직을 짜서 ",[257,452,259],{}," 파일로 던지면 Envoy 엔진이 런타임 중에 이를 동적으로 흡수하여 트래픽을 필터링한다.",[230,455],{},[205,457,459],{"id":458},"_4-결론-및-결합-구조의-이점","🧠 4. 결론 및 결합 구조의 이점",[210,461,462],{},"서버사이드 Wasm의 부상이 도커의 완전한 종말을 의미하는 것은 아니다. 네트워크 소켓의 세밀한 제어나 리눅스 커널의 로우 레벨 기능을 모두 활용해야 하는 무거운 데이터베이스 시스템, 거대한 스프링 기반 레거시 비즈니스 시스템은 여전히 도커 컨테이너가 적합하다.",[210,464,465,466,469,470,473],{},"대신 HTTP 요청에 따라 즉각적으로 즉시 반응해야 하는 ",[217,467,468],{},"이벤트 기반 마이크로서비스(FaaS)",", 이미지 프로세싱이나 비디오 인코딩, AI 추론(Inference)처럼 특정 CPU 집중 연산이 극도로 빠르게 필요한 ",[217,471,472],{},"엣지 컴퓨팅 영역","에서 Wasm은 도커 대비 압도적인 인프라 밀집도와 비용 효율성을 보장한다. 인프라의 경량화와 빠른 반응 속도가 핵심인 모던 클라우드 아키텍처에서 Wasm은 도커를 보완하는 가장 완벽한 파트너 기술로 안착했다.",{"title":475,"searchDepth":476,"depth":476,"links":477},"",2,[478,479,484,485,486,492],{"id":207,"depth":476,"text":208},{"id":234,"depth":476,"text":235,"children":480},[481,483],{"id":242,"depth":482,"text":243},3,{"id":249,"depth":482,"text":250},{"id":273,"depth":476,"text":274},{"id":295,"depth":476,"text":296},{"id":415,"depth":476,"text":416,"children":487},[488,490,491],{"id":422,"depth":482,"text":489},"① Cloudflare Workers & workerd",{"id":435,"depth":482,"text":436},{"id":442,"depth":482,"text":443},{"id":458,"depth":476,"text":459},"2026-07-13","WebAssembly와 WASI가 서버 환경으로 확장되는 과정과 Docker 컨테이너 기반 아키텍처와의 차이점, 엣지 환경에서의 활용 사례 분석","md",null,{"tags":498},[499,500,501,502],"WebAssembly","Wasm","Docker","Architecture",{"icon":26},{"title":505,"description":506},"서버사이드 WebAssembly(Wasm)와 WASI 아키텍처 이해","WebAssembly가 백엔드 실행 환경으로 확장되는 원리와 WASI, Docker 컨테이너 아키텍처와의 차이를 정리합니다.","PS0BnvK0ey9zQhKLTh5uuPhMTQr893-l1BQbAi3iBl0",[509,511],{"title":75,"path":76,"stem":77,"description":510,"icon":26,"children":-1},"Nuxt 애플리케이션의 서버 런타임을 담당하는 Nitro의 구조와 서버 라우팅, 배포 추상화, 런타임 동작 방식을 분석",{"title":101,"path":102,"stem":103,"description":512,"icon":26,"children":-1},"npm, yarn, pnpm의 Lock 파일이 생성되는 이유와 재현 가능한 의존성 관리 메커니즘 분석",1785305905066]