<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>또치의 삽질 보관함</title>
    <link>https://ddochea.tistory.com/</link>
    <description>시간과 삽을 연성하여 뻘짓을 만드는 놀라움을 선보이는 곳</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 11:55:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ddochea</managingEditor>
    <image>
      <title>또치의 삽질 보관함</title>
      <url>https://t1.daumcdn.net/cfile/tistory/23391338592100B435</url>
      <link>https://ddochea.tistory.com</link>
    </image>
    <item>
      <title>[Hyper-V] Hyper-V 관리자 실행 시 0x80131040 오류</title>
      <link>https://ddochea.tistory.com/269</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느새부터인가 `Newtonsoft.Json Version=12.0.0.0` 어셈블리 로드 실패로 인해 Hyper-V에서 VM 빨리만들기를 사용할 수 없는 문제가 생겼다. 결론부터 말하자면 Hyper-V 버그이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hyper-V 설치위치를 가면 Newtonsoft.Json.dll을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\Program&amp;nbsp;Files\Hyper-V&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GbTIO/btsMuuHrNIZ/EmiKI0T0RGnlMuUhqJ2Of1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GbTIO/btsMuuHrNIZ/EmiKI0T0RGnlMuUhqJ2Of1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GbTIO/btsMuuHrNIZ/EmiKI0T0RGnlMuUhqJ2Of1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGbTIO%2FbtsMuuHrNIZ%2FEmiKI0T0RGnlMuUhqJ2Of1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;614&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 기준 해당 dll 파일의 버전을 보면 13.0.3 인것을 확인할 수 있는데, 빨리 만들기 기능을 담당하는 `VMCreate.exe` 는 12 버전을 찾고 있으니 안되는게 어찌보면 당연하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dll을 교체할 필요 없이 해당 위치에 아래 내용과 같이 버전을 새로 정의한 VMCreate.exe.config 파일을 추가해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1740408734941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;
  &amp;lt;runtime&amp;gt;
    &amp;lt;assemblyBinding xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot;&amp;gt;
      &amp;lt;dependentAssembly&amp;gt;
        &amp;lt;assemblyIdentity name=&quot;Newtonsoft.Json&quot; publicKeyToken=&quot;30ad4fe6b2a6aeed&quot; culture=&quot;neutral&quot; /&amp;gt;
        &amp;lt;bindingRedirect oldVersion=&quot;0.0.0.0-12.0.0.0&quot; newVersion=&quot;13.0.0.0&quot; /&amp;gt;
      &amp;lt;/dependentAssembly&amp;gt;
    &amp;lt;/assemblyBinding&amp;gt;
  &amp;lt;/runtime&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;급한게 아니라면 MS가 고쳐줄 때 까지 기다려야 하지만, 급히 생성이 필요하다면 아래와 같이 dll을 강제로 교체해보자&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;s&gt;1. Newtonsoft.Json.dll 변경을 위한 권한 부여&lt;/s&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;Hyper-V의 파일은 관리자 권한만으로도 삭제나 이동이 불가하다. 따라서 아래와 같은 명령어로 권한 설정 작업이 필요하다. 명령어를 수행하는 powershell이나 cmd 는 관리자 권한으로 열어줘야 한다.&lt;/s&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740406243922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;takeown /f &quot;.\Newtonsoft.Json.dll&quot; /a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;그 다음 아래 명령어를 수행한다.&lt;/s&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740406335021&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;icacls.exe .\Newtonsoft.Json.dll /grant Users:F&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;이제 일반 유저 권한으로 삭제 및 이동이 가능해진다.&lt;/s&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;s&gt;2. 구 버전 Newtonsoft.Json 받기&lt;/s&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;Hyper-V 에 맞는 dll로 교체하기위해 아무 dotnet 프로젝트를 생성 한 뒤, nuget을 통해 v12 버전의 Newtonsoft.Json을 받도록 하자. 다른 안전한 방법이 있다면 해당 방법을 써도 무방하다.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;Newtonsoft.Json 12버전을 구했다면 Hyper-V 경로에 이동 시킨 뒤, Hyper-V를 재실행하면 된다.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>서버 관리/Windows</category>
      <category>Hyper-V</category>
      <category>newtonsoft.json</category>
      <category>빨리만들기</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/269</guid>
      <comments>https://ddochea.tistory.com/269#entry269comment</comments>
      <pubDate>Mon, 24 Feb 2025 23:38:37 +0900</pubDate>
    </item>
    <item>
      <title>[rust] tokio 비동기 동시 처리 기본 예시 코드</title>
      <link>https://ddochea.tistory.com/268</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;tokio를 통한 async 작업을 동시 실행. dotnet의 Task.WaitAll() 과 유사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력받은 초(sec)만큼 시간이 출력되는 작업 print_now를 각각 f1, f2 작업을 만들어 동시 실행 처리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tokio::join으로 들어온 작업 중 가장 늦게 끝난 작업 기준으로 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[main.rs]&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;use tokio;
use time::{OffsetDateTime}; // 포맷팅된 시간 글자를 표기하기위한 라이브러리

#[tokio::main]
async fn main() {
    let f1 = print_now(1, 5);
    let f2 = print_now(2, 10);
    tokio::join!(f1, f2); // f1, f2
}

// 1초당 현재시간(UTC) 표기
async fn print_now(id: i32, sec: i32) {
    let mut i = 0;
    while i &amp;lt; sec {
        println!(&quot;print{}, {}&quot;, id, OffsetDateTime::now_utc());
        tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
        i += 1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Cargo.toml]&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;[package]
name = &quot;tokio-test&quot;
version = &quot;0.1.0&quot;
edition = &quot;2021&quot;

[dependencies]
tokio = { version = &quot;1.41.1&quot;, features = [&quot;full&quot;]}
time = &quot;0.3.36&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>Rust</category>
      <category>async</category>
      <category>await</category>
      <category>rust</category>
      <category>TOKIO</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/268</guid>
      <comments>https://ddochea.tistory.com/268#entry268comment</comments>
      <pubDate>Sun, 24 Nov 2024 18:06:52 +0900</pubDate>
    </item>
    <item>
      <title>[rust] tokio, bb8, tokio_postgres DB 연결 예시 코드</title>
      <link>https://ddochea.tistory.com/267</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;tokio 와 bb8을 이용한 postgres db 연결 기본 예시 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[main.rs]&lt;/p&gt;
&lt;pre id=&quot;code_1732433000565&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use bb8;
use bb8::Pool;
use bb8_postgres::PostgresConnectionManager;
use tokio_postgres::NoTls;

#[tokio::main]
async fn main() {
    println!(&quot;Hello, world!&quot;);

    let manager =
        PostgresConnectionManager::new_from_stringlike(&quot;postgresql://{계정}:{암호}@localhost:5432/{db명}&quot;, NoTls).unwrap();
    let pool = Pool::builder().build(manager).await.unwrap();
    let conn = pool.get().await.unwrap();

    let row = conn.query_one(&quot;select 1 + 1&quot;, &amp;amp;[]).await.unwrap();
    let v : i32 = row.try_get(0).unwrap();

    println!(&quot;value: {}&quot;, v);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Cargo.toml]&lt;/p&gt;
&lt;pre id=&quot;code_1732433041254&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[package]
name = &quot;패키지명&quot;
version = &quot;0.1.0&quot;
edition = &quot;2021&quot;

[dependencies]
bb8 = &quot;0.8.6&quot;
bb8-postgres = &quot;0.8.1&quot;
tokio = { version = &quot;1.41.1&quot;, features = [&quot;full&quot;] }
tokio-postgres = &quot;0.7.12&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Rust</category>
      <category>BB8</category>
      <category>Database</category>
      <category>postgres</category>
      <category>rust</category>
      <category>TOKIO</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/267</guid>
      <comments>https://ddochea.tistory.com/267#entry267comment</comments>
      <pubDate>Sun, 24 Nov 2024 17:11:27 +0900</pubDate>
    </item>
    <item>
      <title>[VMWare] VMWare Fusion 에서 Windows 설치시 네트워크 이슈 해결</title>
      <link>https://ddochea.tistory.com/266</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;VMWare Fusion 에서 Windows 11 설치 과정에서 네트워크 연결 여부를 확인하는 단계가 있는데, 해당 단계를 건너뛸 수 없어 설치를 못하는 경우&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 단계에서 드라이버 이슈로 진행이 안될 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 10.11.31.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9EXN4/btsKTUAM9Pi/eDg3YvGk0gkM2jyuvxS4o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9EXN4/btsKTUAM9Pi/eDg3YvGk0gkM2jyuvxS4o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9EXN4/btsKTUAM9Pi/eDg3YvGk0gkM2jyuvxS4o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9EXN4%2FbtsKTUAM9Pi%2FeDg3YvGk0gkM2jyuvxS4o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2040&quot; height=&quot;1532&quot; data-filename=&quot;스크린샷 2024-11-19 오후 10.11.31.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 Shift + F10 키를 눌러 cmd 창을 연 뒤 `OOBE\BYPASSNRO`를 입력 후 엔터를 눌러 설치과정을 재수행하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 10.14.43.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LdcQu/btsKUEcSHK5/TAxZK6kPzlo5CKEY1PvN10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LdcQu/btsKUEcSHK5/TAxZK6kPzlo5CKEY1PvN10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LdcQu/btsKUEcSHK5/TAxZK6kPzlo5CKEY1PvN10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLdcQu%2FbtsKUEcSHK5%2FTAxZK6kPzlo5CKEY1PvN10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2040&quot; height=&quot;1532&quot; data-filename=&quot;스크린샷 2024-11-19 오후 10.14.43.png&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;1532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재수행한 단계에선 인터넷에 연결되어 있지 않음 메뉴가 표기된다. 해당 버튼을 눌러 다음 단계를 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치완료 후 인터넷을 사용할 수 없을 때&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 단계에서 드라이버 이슈로 Windows 11을 설치에 어려움을 겪은 사람들이 이어서 겪을&amp;nbsp; 수 있는 문제이다. 이 경우 VMWare Tools을 설치하면 해결 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mac OS 상단에 있는 Fusion 의 메뉴 중 [Virtual Machine] -&amp;gt; [Install VMWare Tools] 를 선택하면 Guest OS인 Windows 에 설치 프로그램이 포함된 DVD 드라이브가 추가된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 10.24.36.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;1186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHdq1/btsKT8ldsC3/pjQNIeT5XrOZI1z1BthNEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHdq1/btsKT8ldsC3/pjQNIeT5XrOZI1z1BthNEK/img.png&quot; data-alt=&quot;Fusion의 VMWare Toolls 설치 메뉴 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHdq1/btsKT8ldsC3/pjQNIeT5XrOZI1z1BthNEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHdq1%2FbtsKT8ldsC3%2FpjQNIeT5XrOZI1z1BthNEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;1186&quot; data-filename=&quot;스크린샷 2024-11-19 오후 10.24.36.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;1186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fusion의 VMWare Toolls 설치 메뉴 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-11-19 오후 10.25.26.png&quot; data-origin-width=&quot;2272&quot; data-origin-height=&quot;1836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C6vP7/btsKUxLTi8z/mxSYQFqcmQUnmtiqyDBpZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C6vP7/btsKUxLTi8z/mxSYQFqcmQUnmtiqyDBpZK/img.png&quot; data-alt=&quot;선택 후 추가 된 DVD 드라이브&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C6vP7/btsKUxLTi8z/mxSYQFqcmQUnmtiqyDBpZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC6vP7%2FbtsKUxLTi8z%2FmxSYQFqcmQUnmtiqyDBpZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2272&quot; height=&quot;1836&quot; data-filename=&quot;스크린샷 2024-11-19 오후 10.25.26.png&quot; data-origin-width=&quot;2272&quot; data-origin-height=&quot;1836&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;선택 후 추가 된 DVD 드라이브&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare Tools 디렉토리 내 위치한 setup 을 선택하여 프로그램을 설치하고 OS를 재부팅 해주면 인터넷 문제가 해결될 수 있다.&lt;/p&gt;</description>
      <category>ETC</category>
      <category>Fusion</category>
      <category>VMWare</category>
      <category>windows</category>
      <category>네트워크</category>
      <category>인터넷</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/266</guid>
      <comments>https://ddochea.tistory.com/266#entry266comment</comments>
      <pubDate>Sat, 23 Nov 2024 13:47:56 +0900</pubDate>
    </item>
    <item>
      <title>[rust] 규칙에 맞는 프로젝트 템플릿을 통해 새로운 rust 프로젝트 생성을 돕는 cargo-generate</title>
      <link>https://ddochea.tistory.com/265</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;cargo new 명령을 통한 프로젝트 생성은 실행프로그램을 생성하는 --bin 과 라이브러리 생성인 --lib 두가지이다. 그 후 webapi 이든 ui 프로그램이든 생성하고자 하는 프로그램 유형에 따라 crate 를 일일히 추가해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 생성하는게 귀찮다면 cargo-generate 를 설치해 보는 것을 추천한다.&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;cargo binstall cargo-generate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 아래와 같이 사용하면 된다. 아래 예시는 rust + axum + utoipa 조합으로 webapi 개발을 위해 직접 생성한 webapi 브랜치이다.&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;cargo generate --git https://github.com/ddochea0314/template-axum-webapi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성하면 입력한 프로젝트명에 따라 &lt;code&gt;README.md&lt;/code&gt; 파일과 &lt;code&gt;main.rs&lt;/code&gt;의 Info::new() title 부분에 입력한 프로젝트명이 들어가는 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;PS /Users/ddochea/source/repos&amp;gt; cargo generate --git https://github.com/ddochea0314/template-axum-webapi
    Project Name: my-test-api
    Destination: /Users/ddochea/source/repos/my-test-api ...
    project-name: my-test-api ...
    Generating template ...
    Moving generated files into: `/Users/ddochea/source/repos/my-test-api`...
    Initializing a fresh Git repository
✨   Done! New project created /Users/ddochea/source/repos/my-test-api&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에 생성한 템플릿도 사용가능하다. --git 대신 --path를 사용하면 된다.&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;cargo generate --path ./cargo-gen-test/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿 소스코드를 살펴보면 {{project-name}}과 {{authors}} 를 확인할 수 있다. 이를 code generate 에서 &lt;code&gt;placeholder&lt;/code&gt; 라고 부르며, {{project-name}}과 {{authors}}는 code generate에서 기본적으로 사용하는 빌트인 placeholder 이다. 보다 자세한 정보는 아래 링크를 통해 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cargo-generate.github.io/cargo-generate/templates/builtin_placeholders.html&quot;&gt;https://cargo-generate.github.io/cargo-generate/templates/builtin_placeholders.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 제공하는 빌트인 placeholder 외에도 직접 생성할 수 있다. 템플릿 프로젝트 루트경로에 &lt;code&gt;cargo-generate.toml&lt;/code&gt; 를 생성하고 아래와 같이 입력한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;[placeholders]
placeholder_name = { prompt = &quot;Enter your name&quot;, choices = [&quot;Alice&quot;, &quot;Bob&quot;], default = &quot;Alice&quot;, type = &quot;string&quot; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;placeholder_name&lt;/code&gt;을 README.md 파일이나 소스코드 내부에 {{placeholder_name}} 를 추가해보자.&lt;/p&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;fn main() {
    println!(&quot;Hello, world!, {{placeholder_name}}&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo generate 로 프로젝트를 생성해준다.&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;PS /Users/ddochea/source/repos&amp;gt; cargo generate --path ./cargo-gen-test/
    Project Name: gen-test123
    Destination: /Users/ddochea/source/repos/gen-test123 ...
    project-name: gen-test123 ...
    Generating template ...
✔     Enter your name &amp;middot; Alice
    Moving generated files into: `/Users/ddochea/source/repos/gen-test123`...
    Initializing a fresh Git repository
✨   Done! New project created /Users/ddochea/source/repos/gen-test123&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 프로젝트의 소스코드를 살펴보면 &lt;code&gt;Enter your name&lt;/code&gt; 프롬프트로 입력받은 이름이 코드에 반영된 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;rust&quot;&gt;&lt;code&gt;fn main() {
    println!(&quot;Hello, world!, Alice&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/cargo-generate/cargo-generate&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/cargo-generate/cargo-generate&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Rust</category>
      <category>Cargo</category>
      <category>cargo-generate</category>
      <category>rust</category>
      <category>rustlang</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/265</guid>
      <comments>https://ddochea.tistory.com/265#entry265comment</comments>
      <pubDate>Sun, 10 Nov 2024 10:31:20 +0900</pubDate>
    </item>
    <item>
      <title>[rust] axum 과 utoipa  로 swagger를 지원하는 web api 구현 예제</title>
      <link>https://ddochea.tistory.com/264</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Axum은 Rust 언어를 위한 웹 애플리케이션 프레임워크로 사실상 표준 비동기 프로그래밍 라이브러리로 받아들여지는 Tokio를 만든 Tokio-rs 에서 개발하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rust 생태계의 대표 웹 프레임워크인 Rocket 과 Actix 에 비해 비교적 최근에 릴리즈 되었다. 그래서인지 utoipa 를 통한 swagger 적용이 원할하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇 시간의 삽질 끝에 예제가 될만한 구현작업을 완료할 수 있었다. 아래 리포지토리는 axum에서 swagger ui 가 동작할 수 있도록 예시형식으로 구현한 브랜치이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ddochea0314/template-axum-webapi&quot;&gt;ddochea0314/template-axum-webapi (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726634099036&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ddochea0314/template-axum-webapi&quot; data-og-description=&quot;Contribute to ddochea0314/template-axum-webapi development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ddochea0314/template-axum-webapi&quot; data-og-url=&quot;https://github.com/ddochea0314/template-axum-webapi&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kB7gw/hyW2TpAqw0/fo0ZO32RUSrlrH8bfF1nj0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ddochea0314/template-axum-webapi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ddochea0314/template-axum-webapi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kB7gw/hyW2TpAqw0/fo0ZO32RUSrlrH8bfF1nj0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - ddochea0314/template-axum-webapi&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to ddochea0314/template-axum-webapi development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 후 브라우저에서 http://localhost:3000/swagger 접속시 2개의 get endpoint를 제공하는 swagger-ui가 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VL5Zb/btsJGi4N5YO/pNFuLIEa40wJ3K9zdN2LeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VL5Zb/btsJGi4N5YO/pNFuLIEa40wJ3K9zdN2LeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VL5Zb/btsJGi4N5YO/pNFuLIEa40wJ3K9zdN2LeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVL5Zb%2FbtsJGi4N5YO%2FpNFuLIEa40wJ3K9zdN2LeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1236&quot; height=&quot;600&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행하면 코드에 설정된 값이 나온다. 처음엔 랜덤한 데이터를 표기하도록 구현하려 했으나, random 마저 별도 크레이트(crate)로 받아야 해서 그냥 동일한 값으로 구현했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4HO3x/btsJGLFdQMv/VbjefFvLEUXOd83k8ZiRJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4HO3x/btsJGLFdQMv/VbjefFvLEUXOd83k8ZiRJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4HO3x/btsJGLFdQMv/VbjefFvLEUXOd83k8ZiRJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4HO3x%2FbtsJGLFdQMv%2FVbjefFvLEUXOd83k8ZiRJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1178&quot; height=&quot;585&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Rust</category>
      <category>axum</category>
      <category>rust</category>
      <category>SWAGGER</category>
      <category>utoipa</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/264</guid>
      <comments>https://ddochea.tistory.com/264#entry264comment</comments>
      <pubDate>Wed, 18 Sep 2024 14:18:06 +0900</pubDate>
    </item>
    <item>
      <title>[golang] WebAssembly 빌드시 expected magic word 00 61 73 6d</title>
      <link>https://ddochea.tistory.com/263</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;go 공식 웹 어셈블리 wiki 문서(&lt;a href=&quot;https://go.dev/wiki/WebAssembly&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://go.dev/wiki/WebAssembly&lt;/a&gt;)에서 실행시 magic word 00 61 73 6d 가 나올 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;windows 파워쉘 환경에서 하고 있다면 GOOS, GOARCH 변수설정을 잘못한 것일 가능성이 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1724419627246&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ GOOS=js GOARCH=wasm go build -o main.wasm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 아래와 같이 수행.&lt;/p&gt;
&lt;pre id=&quot;code_1724419557886&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$env:GOOS=&quot;js&quot;
$env:GOARCH=&quot;wasm&quot;
go build -o main.wasm main.go&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <category>GO</category>
      <category>magic-word-00-61-73-6d</category>
      <category>pwsh</category>
      <category>wasm</category>
      <category>WebAssembly</category>
      <category>웹어셈블리</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/263</guid>
      <comments>https://ddochea.tistory.com/263#entry263comment</comments>
      <pubDate>Fri, 23 Aug 2024 22:29:21 +0900</pubDate>
    </item>
    <item>
      <title>[css] animation 재생을 다시 실행할 수 있도록 처리</title>
      <link>https://ddochea.tistory.com/262</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;css animation을 특정 이벤트가 발생할 때마다 재생시키고 싶을 때 아래와 같이 작성하는 케이스가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1723369207969&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Home&amp;lt;/title&amp;gt;
    &amp;lt;script&amp;gt;
        function play() {
            var target = document.querySelector('#target');
            target.classList.remove('bounce');
            target.classList.add('bounce');
        }
    &amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
        #target {
            width: 100px;
            height: 100px;
            background-color: red;
        }

        .bounce {
            animation: bounce 2s;
        }

        @keyframes bounce {
            0% {
                transform: translateY(0);
            }
            50% {
                transform: translateY(100px);
            }
            100% {
                transform: translateY(0);
            }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;button onclick=&quot;play()&quot;&amp;gt;play&amp;lt;/button&amp;gt;
    &amp;lt;div id=&quot;target&quot;&amp;gt;

    &amp;lt;/div&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제에서 버튼을 누르면 100px * 100px의 빨간색 박스가 아래로 이동했다가 원위치될것이다. 그런데 처음 버튼을 눌렀을 땐 정상동작하는데, 두번째부터는 정상동작하지 않는다. 이 경우 아래와 같이 소스를 수정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1723369653345&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Home&amp;lt;/title&amp;gt;
    &amp;lt;script&amp;gt;
        function play() {
            var target = document.querySelector('#target');
            target.classList.remove('bounce');
            target.offsetWidth; // 추가
            target.classList.add('bounce');
        }
    &amp;lt;/script&amp;gt;
    &amp;lt;style&amp;gt;
        #target {
            width: 100px;
            height: 100px;
            background-color: red;
        }

        .bounce {
            animation: bounce 2s;
        }

        @keyframes bounce {
            0% {
                transform: translateY(0);
            }
            50% {
                transform: translateY(100px);
            }
            100% {
                transform: translateY(0);
            }
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;button onclick=&quot;play()&quot;&amp;gt;play&amp;lt;/button&amp;gt;
    &amp;lt;div id=&quot;target&quot;&amp;gt;

    &amp;lt;/div&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 html 태그의 구조나 다시 랜더링할 속성 변경이 없어서 브라우저의 리플로우(reflow) 및 리페인트(repaint)가 일어나지 않아서인데, offsetWidth과 같이 읽기만해도 리플로우(reflow)를 유발시키는 속성을 호출하여 이를 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gist.github.com/paulirish/5d52fb081b3570c81e3a&quot;&gt;What forces layout/reflow. The comprehensive list. (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723370032560&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;What forces layout/reflow. The comprehensive list.&quot; data-og-description=&quot;What forces layout/reflow. The comprehensive list. - what-forces-layout.md&quot; data-og-host=&quot;gist.github.com&quot; data-og-source-url=&quot;https://gist.github.com/paulirish/5d52fb081b3570c81e3a&quot; data-og-url=&quot;https://gist.github.com/paulirish/5d52fb081b3570c81e3a&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c6sTH7/hyWKHDgIrH/IlkfWvKiufKWEZ83u74dbK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/jaWKq/hyWKHwsBLS/praJ2ZiMhsV0HR44pKtiC0/img.png?width=1027&amp;amp;height=619&amp;amp;face=0_0_1027_619&quot;&gt;&lt;a href=&quot;https://gist.github.com/paulirish/5d52fb081b3570c81e3a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gist.github.com/paulirish/5d52fb081b3570c81e3a&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c6sTH7/hyWKHDgIrH/IlkfWvKiufKWEZ83u74dbK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/jaWKq/hyWKHwsBLS/praJ2ZiMhsV0HR44pKtiC0/img.png?width=1027&amp;amp;height=619&amp;amp;face=0_0_1027_619');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What forces layout/reflow. The comprehensive list.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;What forces layout/reflow. The comprehensive list. - what-forces-layout.md&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gist.github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 설명 및 최적화 방법은 아래 블로그에서 잘 정리되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://beomy.github.io/tech/browser/reflow-repaint/&quot;&gt;[Browser] Reflow와 Repaint | Beomy&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723370249811&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Browser] Reflow와 Repaint&quot; data-og-description=&quot;브라우저의 화면이 수정될 때, 렌더링 과정을 최적화 하는 방법에 대해 이야기 할 것입니다.&quot; data-og-host=&quot;beomy.github.io&quot; data-og-source-url=&quot;https://beomy.github.io/tech/browser/reflow-repaint/&quot; data-og-url=&quot;https://beomy.github.io/tech/browser/reflow-repaint/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XQsRL/hyWOpgCTav/98cl21gtRITNBxbtAlQPRk/img.png?width=2000&amp;amp;height=1000&amp;amp;face=756_340_865_458,https://scrap.kakaocdn.net/dn/bTHbXX/hyWOesCKrH/SGfUzpFasrom51q5QabFlk/img.png?width=894&amp;amp;height=1046&amp;amp;face=0_0_894_1046,https://scrap.kakaocdn.net/dn/dCb3r6/hyWKHpIija/6ydy0onsRVIhItjtBJFxEk/img.png?width=902&amp;amp;height=950&amp;amp;face=0_0_902_950&quot;&gt;&lt;a href=&quot;https://beomy.github.io/tech/browser/reflow-repaint/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://beomy.github.io/tech/browser/reflow-repaint/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XQsRL/hyWOpgCTav/98cl21gtRITNBxbtAlQPRk/img.png?width=2000&amp;amp;height=1000&amp;amp;face=756_340_865_458,https://scrap.kakaocdn.net/dn/bTHbXX/hyWOesCKrH/SGfUzpFasrom51q5QabFlk/img.png?width=894&amp;amp;height=1046&amp;amp;face=0_0_894_1046,https://scrap.kakaocdn.net/dn/dCb3r6/hyWKHpIija/6ydy0onsRVIhItjtBJFxEk/img.png?width=902&amp;amp;height=950&amp;amp;face=0_0_902_950');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Browser] Reflow와 Repaint&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;브라우저의 화면이 수정될 때, 렌더링 과정을 최적화 하는 방법에 대해 이야기 할 것입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;beomy.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <category>Animation</category>
      <category>CSS</category>
      <category>keyframes</category>
      <category>Reflow</category>
      <category>repaint</category>
      <category>리페인트</category>
      <category>리플로우</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/262</guid>
      <comments>https://ddochea.tistory.com/262#entry262comment</comments>
      <pubDate>Sun, 11 Aug 2024 18:58:38 +0900</pubDate>
    </item>
    <item>
      <title>[winget] 소스를 열 때 실패했습니다. 문제가 계속되면 'source reset' 명령을 사용해 보십시오. 발생시 확인사항</title>
      <link>https://ddochea.tistory.com/261</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PC를 새로 세팅하고 winget 으로 필요한 프로그램을 설치할 때 아래와 같은 메시지가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스를 열 때 실패했습니다. 문제가 계속되면 'source reset' 명령을 사용해 보십시오.&lt;/p&gt;
&lt;pre id=&quot;code_1722432046194&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Failed when opening source(s); try the 'source reset' command if the problem persists.
An unexpected error occurred while executing the command:
0x8a15000f : Data required by the source is missing&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Administrator 에서 source reset 을 수행해봐도, source update를 수행해봐도 해결되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그나마 github에서 검색한 아래 방법을 사용하니 winget source 리포지토리는 찾았지만, 여전히 업데이트가 되지 않는 등의 이슈가 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1722432252208&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Add-AppxPackage -Path https://cdn.winget.microsoft.com/cache/source.msix&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인은 의외의 곳에서 확인할 수 있었다. Microsoft Store를 통해 설치 관리되는 &quot;앱 설치 관리자&quot;가 최신버전이 아니라 발생한 이슈였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU3yxe/btsIRymi1L8/9KplgFDEEtB1gAQMvmIdbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU3yxe/btsIRymi1L8/9KplgFDEEtB1gAQMvmIdbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU3yxe/btsIRymi1L8/9KplgFDEEtB1gAQMvmIdbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU3yxe%2FbtsIRymi1L8%2F9KplgFDEEtB1gAQMvmIdbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1267&quot; height=&quot;670&quot; data-origin-width=&quot;1267&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;msstore에서 설치가 안된다면 아래 링크를 통해 직접 설치가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/windows/msix/app-installer/install-update-app-installer&quot;&gt;앱 설치 관리자 설치 및 업데이트 - MSIX | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/winget-cli/discussions/3258&quot;&gt;Help: Failed when opening source(s)... &amp;middot; microsoft/winget-cli &amp;middot; Discussion #3258 &amp;middot; GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1;&quot; href=&quot;https://learn.microsoft.com/ko-kr/windows/msix/app-installer/install-update-app-installer&quot;&gt;앱 설치 관리자 설치 및 업데이트 - MSIX | Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <category>MSStore</category>
      <category>source reset</category>
      <category>WinGet</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/261</guid>
      <comments>https://ddochea.tistory.com/261#entry261comment</comments>
      <pubDate>Wed, 31 Jul 2024 22:31:58 +0900</pubDate>
    </item>
    <item>
      <title>[.NET] ASP.NET Core MVC에 View 영역을 Vite 프로젝트로 개발할 수 있게 도와주는 Vite.AspNetCore 소개</title>
      <link>https://ddochea.tistory.com/260</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Vite를 기반으로한 웹 프론트엔드 개발시, Next.js, Nuxt.js 가 아닌 ASP.NET Core 웹 프레임워크에 사용해야할 때 유용한 라이브러리이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Eptagone/Vite.AspNetCore&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/Eptagone/Vite.AspNetCore&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720865206501&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Eptagone/Vite.AspNetCore: Small library to integrate Vite into ASP.NET projects&quot; data-og-description=&quot;Small library to integrate Vite into ASP.NET projects - Eptagone/Vite.AspNetCore&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Eptagone/Vite.AspNetCore&quot; data-og-url=&quot;https://github.com/Eptagone/Vite.AspNetCore&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ccoba6/hyWzCgOCSK/TrLIFiIeBlQ6BGulQGhA5K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Eptagone/Vite.AspNetCore&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Eptagone/Vite.AspNetCore&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ccoba6/hyWzCgOCSK/TrLIFiIeBlQ6BGulQGhA5K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Eptagone/Vite.AspNetCore: Small library to integrate Vite into ASP.NET projects&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Small library to integrate Vite into ASP.NET projects - Eptagone/Vite.AspNetCore&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리 추가 후 프로젝트에 몇 가지 작업이 필요한데, 브랜치 내 examples를 참고하면 된다. 필자의 경우는 vue 기반의 MPA 형식의 웹 서비스 개발을 목적으로 아래와 같이 작업하였다. example에 없다고 하여 지원이 안되는 건 아니니 설정값을 참고하여 자신만의 프로젝트 템플릿을 만들어도 좋을 듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. MVC 프로젝트 및 vite-project 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVC 프로젝트를 생성한 후 vite-project를 생성한다. 그 뒤 파일 일부를 이동시켜야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;package.json, package-lock.json, tsconfig.json, vite.config.ts 파일은 csproj 파일과 같은 위치로 옮긴다.&lt;/li&gt;
&lt;li&gt;assets, components, public, src 경로 및 css, ts, js등의 파일들은 프로젝트 하위 Assets 폴더를 생성하여 추가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Assets 경로가 마음에 안든다면 후속 작업인 vite.config.ts 편집을 참고하여 수정해도 된다.&lt;br /&gt;html 파일은 기본적으로 필요없으며, 기본 생성된 app.vue 파일도 신규 생성할 것이므로 제거해도 된다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 웹 프로젝트 파일(.csproj) 파일 편집&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리 추가 후 ItemGroup 및 Target 을 아래와 같이 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1720865392918&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Project Sdk=&quot;Microsoft.NET.Sdk.Web&quot;&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;TargetFramework&amp;gt;net8.0&amp;lt;/TargetFramework&amp;gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;PackageReference Include=&quot;Vite.AspNetCore&quot; Version=&quot;2.1.1&quot; /&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;Content Remove=&quot;package-lock.json&quot; /&amp;gt;
    &amp;lt;Content Remove=&quot;package.json&quot; /&amp;gt;
    &amp;lt;Content Remove=&quot;tsconfig.json&quot; /&amp;gt;
    &amp;lt;Content Remove=&quot;tsconfig.app.json&quot; /&amp;gt;
    &amp;lt;Content Remove=&quot;tsconfig.node.json&quot; /&amp;gt;
    &amp;lt;!-- Don't remove this line or your manifest.json won't be copied on publish --&amp;gt;
    &amp;lt;Content Include=&quot;wwwroot\.vite\**&quot; /&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;
  
  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;None Include=&quot;package-lock.json&quot; /&amp;gt;
    &amp;lt;None Include=&quot;package.json&quot; /&amp;gt;
    &amp;lt;None Include=&quot;tsconfig.json&quot; /&amp;gt;
    &amp;lt;None Include=&quot;tsconfig.app.json&quot; /&amp;gt;
    &amp;lt;None Include=&quot;tsconfig.node.json&quot; /&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

  &amp;lt;!-- Ensure Node environment on Build --&amp;gt;
  &amp;lt;Target Name=&quot;DebugEnsureNodeEnv&quot; BeforeTargets=&quot;Build;PublishBuildAssets&quot; Condition=&quot; !Exists('node_modules') &quot;&amp;gt;
    &amp;lt;!-- Ensure Node.js is installed --&amp;gt;
    &amp;lt;Exec Command=&quot;node --version&quot; ContinueOnError=&quot;true&quot;&amp;gt;
      &amp;lt;Output TaskParameter=&quot;ExitCode&quot; PropertyName=&quot;ErrorCode&quot; /&amp;gt;
    &amp;lt;/Exec&amp;gt;
    &amp;lt;Error Condition=&quot;'$(ErrorCode)' != '0'&quot; Text=&quot;Node.js is required to build and run this project. To continue, please install Node.js from https://nodejs.org/, and then restart your command prompt or IDE.&quot; /&amp;gt;
    &amp;lt;Message Importance=&quot;high&quot; Text=&quot;Restoring dependencies using 'npm'. This may take several minutes...&quot; /&amp;gt;
    &amp;lt;!-- Install Node packages --&amp;gt;
    &amp;lt;Exec Command=&quot;npm install&quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;

  &amp;lt;!-- Build the final assets --&amp;gt;
  &amp;lt;Target Name=&quot;PublishBuildAssets&quot; BeforeTargets=&quot;Build&quot; Condition=&quot; '$(Configuration)' == 'Release' &quot;&amp;gt;
    &amp;lt;!-- Build the final assets --&amp;gt;
    &amp;lt;Exec Command=&quot;npm run build&quot; /&amp;gt;
  &amp;lt;/Target&amp;gt;
&amp;lt;/Project&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. vite.config.ts 편집&lt;/h2&gt;
&lt;pre id=&quot;code_1720866138974&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { UserConfig, defineConfig } from 'vite'
import { spawn } from 'child_process'
import fs from 'node:fs'
import path from 'node:path'

import vue from '@vitejs/plugin-vue'

// Get base folder for certificates.
const baseFolder =
    process.env.APPDATA !== undefined &amp;amp;&amp;amp; process.env.APPDATA !== ''
        ? `${process.env.APPDATA}/ASP.NET/https`
        : `${process.env.HOME}/.aspnet/https`;

// Generate the certificate name using the NPM package name
const certificateName = process.env.npm_package_name;

// Define certificate filepath
const certFilePath = path.join(baseFolder, `${certificateName}.pem`);
// Define key filepath
const keyFilePath = path.join(baseFolder, `${certificateName}.key`);

// Export Vite configuration

// https://vitejs.dev/config/
// Export Vite configuration
export default defineConfig(async () =&amp;gt; {
  // Ensure the certificate and key exist
  if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) {
      // Wait for the certificate to be generated
      await new Promise&amp;lt;void&amp;gt;((resolve) =&amp;gt; {
          spawn('dotnet', [
              'dev-certs',
              'https',
              '--export-path',
              certFilePath,
              '--format',
              'Pem',
              '--no-password',
          ], { stdio: 'inherit', })
              .on('exit', (code) =&amp;gt; {
                  resolve();
                  if (code) {
                      process.exit(code);
                  }
              });
      });
  };

  // Define Vite configuration
  const config: UserConfig = {
      plugins: [vue()],
      appType: 'custom',
      root: 'Assets',
      publicDir: 'public',
      build: {
          emptyOutDir: true,
          manifest: true,
          outDir: '../wwwroot',
          assetsDir: '',
          rollupOptions: {
              input: ['Assets/views/index.ts', 'Assets/views/privacy.ts'],
              output: {
                    entryFileNames: '[name].js',
                    chunkFileNames: 'chunks/[name]-[hash].js',
                    assetFileNames: 'assets/[name]-[hash].[ext]',
              }
          },
      },
      server: {
          strictPort: true,
          https: {
              cert: certFilePath,
              key: keyFilePath
          }
      },
      optimizeDeps: {
          include: []
      }
  }

  return config;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. C# 및 cshtml 영역 수정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 MVC 뷰(View)영역을 Vue로 대체하기 위해 아래와 같이 파일들을 생성 및 편집한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Program.cs&lt;/p&gt;
&lt;pre id=&quot;code_1720866950453&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using Vite.AspNetCore;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddViteServices(option =&amp;gt; {
    option.Server.AutoRun = true;
    option.Server.Https = true;
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler(&quot;/Home/Error&quot;);
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

if (app.Environment.IsDevelopment())
{
    app.UseWebSockets();
    app.UseViteDevelopmentServer(true);
}

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: &quot;default&quot;,
    pattern: &quot;{controller=Home}/{action=Index}/{id?}&quot;);

app.Run();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Views/_ViewImports.cshtml&lt;/p&gt;
&lt;pre id=&quot;code_1720866910916&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@using Template.AspNetCore.MVC.Vue
@using Template.AspNetCore.MVC.Vue.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Vite.AspNetCore&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Views/Shared/_Layout.cshtml&lt;/p&gt;
&lt;pre id=&quot;code_1720867021125&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
	&amp;lt;link rel=&quot;icon&quot; type=&quot;image/svg+xml&quot; href=&quot;~/vite.svg&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;@ViewData[&quot;Title&quot;] - Template.AspNetCore.MVC.Vue&amp;lt;/title&amp;gt;
	@await RenderSectionAsync(&quot;Styles&quot;, required: false)
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;        
        &amp;lt;nav class=&quot;navbar&quot;&amp;gt;
            &amp;lt;ul&amp;gt;
                &amp;lt;li class=&quot;nav-item btn&quot;&amp;gt; 
                    &amp;lt;a class=&quot;nav-link text-dark&quot; asp-area=&quot;&quot; asp-controller=&quot;Home&quot; asp-action=&quot;Index&quot;&amp;gt;Home&amp;lt;/a&amp;gt;
                &amp;lt;/li&amp;gt;
                &amp;lt;li class=&quot;nav-item btn&quot;&amp;gt;
                    &amp;lt;a class=&quot;nav-link text-dark&quot; asp-area=&quot;&quot; asp-controller=&quot;Home&quot;
                        asp-action=&quot;Privacy&quot;&amp;gt;Privacy&amp;lt;/a&amp;gt;
                &amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/nav&amp;gt;
    &amp;lt;/header&amp;gt;
    
    @RenderBody()

    &amp;lt;footer&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;amp;copy; 2024 - Template.AspNetCore.MVC.Vue - &amp;lt;a asp-area=&quot;&quot; asp-controller=&quot;Home&quot;
                asp-action=&quot;Privacy&quot;&amp;gt;Privacy&amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/footer&amp;gt;
    @await RenderSectionAsync(&quot;Scripts&quot;, required: false)
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Views/Home/Index.cshtml&lt;/p&gt;
&lt;pre id=&quot;code_1720867059777&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@{
    ViewData[&quot;Title&quot;] = &quot;Home Page&quot;;
}

@* This line includes the style from the &quot;index.ts&quot; entrypoint *@
@section Styles {
	&amp;lt;link rel=&quot;stylesheet&quot; vite-href=&quot;~/views/index.ts&quot; asp-append-version=&quot;true&quot; /&amp;gt;
}
&amp;lt;main role=&quot;main&quot; id=&quot;app&quot;&amp;gt;
&amp;lt;/main&amp;gt;

&amp;lt;!-- This line includes your &quot;index.ts&quot; entrypoint --&amp;gt;
&amp;lt;script type=&quot;module&quot; vite-src=&quot;~/views/index.ts&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Views/Home/Privacy.cshtml&lt;/p&gt;
&lt;pre id=&quot;code_1720867134881&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@{
    ViewData[&quot;Title&quot;] = &quot;Privacy Page&quot;;
}

@* This line includes the style from the &quot;privacy.ts&quot; entrypoint *@
@section Styles {
	&amp;lt;link rel=&quot;stylesheet&quot; vite-href=&quot;~/views/privacy.ts&quot; asp-append-version=&quot;true&quot; /&amp;gt;
}
&amp;lt;main role=&quot;main&quot; id=&quot;app&quot;&amp;gt;
&amp;lt;/main&amp;gt;

&amp;lt;!-- This line includes your &quot;privacy.ts&quot; entrypoint --&amp;gt;
&amp;lt;script type=&quot;module&quot; vite-src=&quot;~/views/privacy.ts&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Vue 영역 수정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Assets/views/index.ts&lt;/p&gt;
&lt;pre id=&quot;code_1720867266187&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'vite/modulepreload-polyfill';
import { createApp } from 'vue'
import '../style.css'
import IndexApp from './Index.vue'

createApp(IndexApp).mount('#app')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Assets/views/index.vue&lt;/p&gt;
&lt;pre id=&quot;code_1720867382447&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
import HelloWorld from '../components/HelloWorld.vue'
&amp;lt;/script&amp;gt;

&amp;lt;template&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;a href=&quot;https://vitejs.dev&quot; target=&quot;_blank&quot;&amp;gt;
      &amp;lt;img src=&quot;/vite.svg&quot; class=&quot;logo&quot; alt=&quot;Vite logo&quot; /&amp;gt;
    &amp;lt;/a&amp;gt;
    &amp;lt;a href=&quot;https://vuejs.org/&quot; target=&quot;_blank&quot;&amp;gt;
      &amp;lt;img src=&quot;../assets/vue.svg&quot; class=&quot;logo vue&quot; alt=&quot;Vue logo&quot; /&amp;gt;
    &amp;lt;/a&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;HelloWorld msg=&quot;Vite + Vue&quot; /&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;style scoped&amp;gt;
.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;
}
.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
  filter: drop-shadow(0 0 2em #42b883aa);
}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Assets/views/privacy.ts&lt;/p&gt;
&lt;pre id=&quot;code_1720867432774&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'vite/modulepreload-polyfill';
import { createApp } from 'vue'
import '../style.css'
import PrivacyApp from './Privacy.vue'

createApp(PrivacyApp).mount('#app')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Assets/views/Privacy.vue&lt;/p&gt;
&lt;pre id=&quot;code_1720867454908&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
&amp;lt;/script&amp;gt;

&amp;lt;template&amp;gt;
  &amp;lt;div&amp;gt;
    Privacy
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;style scoped&amp;gt;
.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;
}
.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
  filter: drop-shadow(0 0 2em #42b883aa);
}
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구성완료 후 dotnet run 실행시 npm run dev 명령어도 같이 실행되는데, 실제 웹 페이지에 vue 랜더링 결과는 없고 View 화면값만 나온다면 개발환경 https 사용에 의한 인증서 문제로 안될 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-13 오후 7.48.30.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EzJPm/btsIy2AtsKz/QKXIRwTClYe80IQ6cxkZTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EzJPm/btsIy2AtsKz/QKXIRwTClYe80IQ6cxkZTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EzJPm/btsIy2AtsKz/QKXIRwTClYe80IQ6cxkZTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEzJPm%2FbtsIy2AtsKz%2FQKXIRwTClYe80IQ6cxkZTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;256&quot; data-filename=&quot;스크린샷 2024-07-13 오후 7.48.30.png&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그럴 경우 npm run dev 로 실행된 dev 서버 URL로 접속한 뒤 `localhost(안전하지 않음)`으로 이동하여 허용하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAR7m/btsIy5cTNYV/4iw41IoIBXyhzDXfg9CHPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAR7m/btsIy5cTNYV/4iw41IoIBXyhzDXfg9CHPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAR7m/btsIy5cTNYV/4iw41IoIBXyhzDXfg9CHPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAR7m%2FbtsIy5cTNYV%2F4iw41IoIBXyhzDXfg9CHPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;604&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 후 캐시를 지워 새로고침하면 정상 표기된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-13 오후 7.49.19.png&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyGRuE/btsIx2anLPi/UC1E4Fr57knb9c8rBnpZWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyGRuE/btsIx2anLPi/UC1E4Fr57knb9c8rBnpZWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyGRuE/btsIx2anLPi/UC1E4Fr57knb9c8rBnpZWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyGRuE%2FbtsIx2anLPi%2FUC1E4Fr57knb9c8rBnpZWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;625&quot; height=&quot;565&quot; data-filename=&quot;스크린샷 2024-07-13 오후 7.49.19.png&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vite의 정식지원이 아닌만큼 완벽하진 않지만, MVC의 프론트영역에 vue를 도입해야 한다면 해당 방법도 도움이 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 예제는 개인 github 브랜치에 공개 템플릿 브랜치로 올려두었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ddochea0314/Template.AspNetCore.MVC.Vue&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ddochea0314/Template.AspNetCore.MVC.Vue&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720867960771&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ddochea0314/Template.AspNetCore.MVC.Vue: MVC + Vue3&quot; data-og-description=&quot;MVC + Vue3 . Contribute to ddochea0314/Template.AspNetCore.MVC.Vue development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ddochea0314/Template.AspNetCore.MVC.Vue&quot; data-og-url=&quot;https://github.com/ddochea0314/Template.AspNetCore.MVC.Vue&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blssAO/hyWzy6ybd0/vSIXvmoZaDoRFhJJXFbv51/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ddochea0314/Template.AspNetCore.MVC.Vue&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ddochea0314/Template.AspNetCore.MVC.Vue&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blssAO/hyWzy6ybd0/vSIXvmoZaDoRFhJJXFbv51/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - ddochea0314/Template.AspNetCore.MVC.Vue: MVC + Vue3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MVC + Vue3 . Contribute to ddochea0314/Template.AspNetCore.MVC.Vue development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>.NET/유용한 라이브러리</category>
      <category>asp-net-core</category>
      <category>MVC</category>
      <category>vite</category>
      <author>ddochea</author>
      <guid isPermaLink="true">https://ddochea.tistory.com/260</guid>
      <comments>https://ddochea.tistory.com/260#entry260comment</comments>
      <pubDate>Sat, 13 Jul 2024 20:02:13 +0900</pubDate>
    </item>
  </channel>
</rss>