<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>nam-willow.log</title>
        <link>https://velog.io/</link>
        <description>기록하는 습관</description>
        <lastBuildDate>Tue, 10 Dec 2024 21:00:41 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>nam-willow.log</title>
            <url>https://velog.velcdn.com/images/nam-willow/profile/effd8c18-07b6-4a8f-bea2-40a1cad0d2a6/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. nam-willow.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/nam-willow" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[외부 api 코드 적용 후 예외처리 부족,,,,]]></title>
            <link>https://velog.io/@nam-willow/%EC%99%B8%EB%B6%80-api-%EC%BD%94%EB%93%9C-%EC%A0%81%EC%9A%A9-%ED%9B%84-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EB%B6%80%EC%A1%B1</link>
            <guid>https://velog.io/@nam-willow/%EC%99%B8%EB%B6%80-api-%EC%BD%94%EB%93%9C-%EC%A0%81%EC%9A%A9-%ED%9B%84-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EB%B6%80%EC%A1%B1</guid>
            <pubDate>Tue, 10 Dec 2024 21:00:41 GMT</pubDate>
            <description><![CDATA[<p>설명하기 앞서 _<strong>외부 회사의 명칭을 willow(가명)</strong>_라고 말하도록 하겠음</p>
<ul>
<li>willow 회사와 협업하여 <code>willow-api</code>를 사용.</li>
<li><code>willow-db</code>를 공유해서 우리 서비스에서 데이터가 바뀌면 willow의 db가 변경되는 api를 작성해야하는 상황.</li>
<li>willow를 사용하는지 안하는지에 대한 구분을 통해서 willow db가 수정된다. <br>

</li>
</ul>
<h2 id="상황">상황</h2>
<ul>
<li>willow api 사용 기능을 추가 후 유저 추가, 수정, 삭제, 등의 기능에 willow db 데이터도 수정되게 코드 수정을 한다.</li>
<li>유저의 경우 만1세 이상이 아니면 willow 사용이 되지 않아서 만0세인 경우에는 강제로 willow db에 만, 년도를 -1을 만들어주기로 했다. <blockquote>
<p>ex) 2024-01-01년생 → 2023-01-01년생으로 willowdb에만 저장</p>
</blockquote>
</li>
</ul>
<br>

<h2 id="오류">오류</h2>
<p>willow 코드를 적용한 <code>유저 삭제</code>  부분에서 오류가 발생했다.
<br><br></p>
<h2 id="원인1--willow-를-사용하지-않았을때-test-부족">원인1 : willow 를 사용하지 않았을때 test 부족</h2>
<p>수정전 </p>
<p>USING_HC_YN 가 없는 상황에서는 오류가 발생한다. 그러니 옵셔널 체이닝을 사용해서 작성해주면 좋다.</p>
<pre><code class="language-js">        if (willowData.USING_YN === &quot;Y&quot;) {</code></pre>
<p>수정 후</p>
<p>옵셔널 체이닝을 사용하면 없는경우에도 비교가 가능해서 오류를 방지할 수 있다.</p>
<pre><code class="language-js">             if (willowData?.USING_YN === &quot;Y&quot;) {</code></pre>
<p><br><br></p>
<h2 id="해결">해결</h2>
<pre><code class="language-js">        /*****************************************************
         *             willow DB 정보 업데이트
         *****************************************************/
        const willowCheckInfo = {
          country_code,
          id,
        };
        // willow사용 확인
        const willowData = await services.willowCheck(
          willowCheckInfo
        );

        // willow db정보 업데이트
        if (willowData?.USING_YN === &quot;Y&quot;) {
          try {
            await willow.updateInfo(willowData);
          } catch (error) {
            try {
              // willow 오류 기록
              await models.insertLog(
                id_num,
                req.body,
                error,
                req.originalUrl,
                &quot;UPDATE&quot;
              );
            } catch {
              // 오류 LOG 저장시에 발생하는 오류는 무시
            }
          }
        }</code></pre>
<p><br><br></p>
<h2 id="원인2-생년월일이-없을때의-예외처리-부족">원인2: 생년월일이 없을때의 예외처리 부족</h2>
<p>생년월일은 입력하지 않은 경우에 오류가 발생항 예외처리가 없었음<br><br></p>
<p>수정 전</p>
<p>생년월일에 대한 내용을 if 밖에서 작성해서 willow를 사용하지 않는 경우 검증을 안해봐서  오류가 발생함</p>
<pre><code class="language-js">    if (USING_YN === &quot;Y&quot;) {
      willowData = await models.readStudentInfo(params, Id);
    }
    // ★ 생년월일 검증 및 수정 코드 if 밖에 있음
    willowData.birthday = util.birthdayCheckForWillow(willowData.birthday);</code></pre>
<p>수정 후</p>
<pre><code class="language-js">    // willow 저장하기 위한 학생정보 조회
    if (USING_YN === &quot;Y&quot;) {
      willowData = await models.readStudentInfo(params, Id);

      // ★willow를 사용하는 if문 안에서 birth를 검증하는 코드 추가
      if (willowData?.birthday) {
        willowData.birthday = util.birthdayCheckForWillow(willowData.birthday);
      }

    }</code></pre>
<p><br><br></p>
<h2 id="코드-작성시-가독성-항상-생각하기">코드 작성시 가독성 항상 생각하기</h2>
<p>내가 작성코드</p>
<pre><code class="language-js">  willowStudentCheck: async (params, Id) =&gt; {
    let willowData = {};

    // willow 사용 YN (USING_YN)
    const { USING_YN } = await models.readWillow(params);

    // willow 저장하기 위한 유저정보 조회
    if (USING_YN === &quot;Y&quot;) {
      willowData = await models.readInfo(params, Id);
      if (willowData?.birthday) {
        // 만0세 라면 만1세로 변경
        willowData.birthday = util.birthdayCheck(willowData.birthday);
      }
    }
    willowData.USING_YN = USING_YN;
    return willowData;
  },</code></pre>
<p>팀장님 가독성 개선 코드</p>
<pre><code class="language-js">  willowStudentCheck: async (params, Id) =&gt; {
    // 도장 willow 기기 사용 YN (USING_HC_YN)
    const { USING_YN } = await dojangModels.readDojangWillow(params);

    // willow o
    if (USING_YN === &quot;Y&quot;) {
      const willowData = await models.readInfo(params, Id);
      if (willowData?.birthday) {
        // 만0세 라면 만1세로 변경
        willowData.birthday = util.birthdayCheck(willowData.birthday);
      }
      return { USING_YN, ...willow };
    }

    // willow x
    else {
      return { USING_YN };
    }
  },</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] SSH로 원격접속 하기]]></title>
            <link>https://velog.io/@nam-willow/Linux-SSH%EB%A1%9C-%EC%9B%90%EA%B2%A9%EC%A0%91%EC%86%8D-%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@nam-willow/Linux-SSH%EB%A1%9C-%EC%9B%90%EA%B2%A9%EC%A0%91%EC%86%8D-%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Dec 2024 20:36:51 GMT</pubDate>
            <description><![CDATA[<p>참고 블로그
<a href="https://winterbloooom.github.io/computer%20science/linux/2022/03/22/ssh.html">[Ubuntu] SSH로 원격접속 하기 | winterblooom (EunGi Han)</a></p>
<hr>
<br>

<h2 id="ip주소-확인">ip주소 확인</h2>
<pre><code class="language-xml">ip address</code></pre>
<p>확인 했을때 <code>eth0:</code> 옆에 있는 <code>inet</code>(IP) 확인.
<img src="https://velog.velcdn.com/images/nam-willow/post/74570be9-bfcc-4dfd-98d7-9b0ae47e255e/image.png" alt="">
<br></p>
<pre><code class="language-xml">sudo apt install openssh-server</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/889383b9-cebc-4ae1-bd72-36546cf10d95/image.png" alt=""></p>
<h4 id="ssh-서버와-클라이언트-등-관련-유틸의-설치-여부를-확인한다">SSH 서버와 클라이언트 등 관련 유틸의 설치 여부를 확인한다.</h4>
<pre><code class="language-xml">dpkg -l | grep openssh</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/bb3102fb-16f9-44db-a8bc-d23a5db3aa6b/image.png" alt="">
<br></p>
<h2 id="서비스-실행-여부-확인">서비스 실행 여부 확인</h2>
<pre><code class="language-xml">sudo service ssh status</code></pre>
<p>확인해보면 Active: inactive (dead) 로 되어있어서 활성화 해줘야한다.</p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/1924adab-25d2-42ed-8931-b8118566bbe8/image.png" alt="">
<br></p>
<pre><code class="language-xml">sudo service ssh start</code></pre>
<p>이렇게 해주면 Active: active (running)으로 되어있는것을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/5da1d064-c4a9-4586-bb8a-d1e64e64619e/image.png" alt="">
<br></p>
<h2 id="방화벽-확인">방화벽 확인</h2>
<pre><code class="language-xml">sudo apt install ufw</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/8345afb2-33b1-41f1-99cd-4e79bf3b2d76/image.png" alt=""></p>
<br>

<h4 id="방화벽-상태-확인">방화벽 상태 확인</h4>
<pre><code class="language-xml">sudo ufw status</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/2f4f2e00-06ed-431e-a097-0011b801cd9d/image.png" alt="">
<br></p>
<h4 id="방화벽-활성화">방화벽 활성화</h4>
<pre><code class="language-xml">sudo ufw enable</code></pre>
<p>방화벽 ssh 포트번호(22) 허용</p>
<pre><code class="language-xml">sudo ufw allow 22/tcp</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/09639872-7911-40d2-afee-39dd117b01ab/image.png" alt="">
<br></p>
<h4 id="vscode-cursor에서-접속하기">vscode, cursor에서 접속하기</h4>
<p>다른 컴퓨터로 SSH 접속을 하려면 그 컴퓨터의 user ID와 IP 주소를 알아야 한다. 후자의 경우 1번 과정에서 메모해두었고, 전자의 경우 쉬이 알 수 있다. 터미널 창의 프롬프트 앞, <code>@</code> 앞에 붙은 것이 유저 아이디이다. 필자의 경우 <code>itricat</code>이었다.</p>
<ul>
<li>User ID: jungwoo</li>
<li>IP: <a href="#ip%EC%A3%BC%EC%86%8C-%ED%99%95%EC%9D%B8">여기서 확인한 IP주소</a><br>

</li>
</ul>
<p>cutsor나 VSCode에서 ssh연결을 하려면 아래의 명령어를 작성한다.</p>
<pre><code>ssh -Y jungwoo[@0.0.0.0]</code></pre><p><br><br></p>
<h4 id="ssh-configuration-file-저장소-선택">ssh configuration file 저장소 선택</h4>
<p>명령어를 치면 아래의 내용을 선택하라고 한다. 
<img src="https://velog.velcdn.com/images/nam-willow/post/b971e910-0c8d-40aa-87e0-f44c390038c0/image.png" alt=""></p>
<blockquote>
<ol>
<li>C:\Users\user.ssh\config  -   이건 이 컴퓨터의 user라는 사용자가 사용할때만 적용하도록한다.<br></li>
<li>C:\ProgramData\ssh\ssh_config  -   이건 이 컴퓨터의 전체사용자에 적용하도록 한다.</li>
</ol>
</blockquote>
<p>혼자 노트북을 사용하는 입장에서는 뭐든 상관은 없지만 혹시 모르니 내꺼에만 적용되도록 하자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] ubuntu에서 env파일 및 숨김파일 수정방법]]></title>
            <link>https://velog.io/@nam-willow/Linux-ubuntu%EC%97%90%EC%84%9C-env%ED%8C%8C%EC%9D%BC-%EB%B0%8F-%EC%88%A8%EA%B9%80%ED%8C%8C%EC%9D%BC-%EC%88%98%EC%A0%95%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@nam-willow/Linux-ubuntu%EC%97%90%EC%84%9C-env%ED%8C%8C%EC%9D%BC-%EB%B0%8F-%EC%88%A8%EA%B9%80%ED%8C%8C%EC%9D%BC-%EC%88%98%EC%A0%95%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 10 Dec 2024 20:11:27 GMT</pubDate>
            <description><![CDATA[<p>보통 env 파일은 감춰두기 때문에 간단하게 파일을 열어서 수정이 불가능하다.</p>
<br>

<p>vscode에서 프로젝트를 할때는 파일을 열어서 수정이 가능하지만 
aws에 서버를 가지고 있으면 vscode에서 설정이 불가하기 때문에 수정 방법을 정리한다. </p>
<h3 id="env파일이-있는-위치로-이동">.env파일이 있는 위치로 이동</h3>
<pre><code class="language-xml">cd 경로이동</code></pre>
<br>

<h3 id="수정모드로-env-파일-열기">수정모드로 .env 파일 열기</h3>
<pre><code class="language-xml">vi .env</code></pre>
<br>

<h3 id="insert-수정하도록-설정">insert 수정하도록 설정</h3>
<pre><code class="language-xml">i</code></pre>
<ol>
<li><p>내용 입력 </p>
</li>
<li><p><code>ESC</code> 누르기</p>
</li>
<li><p>저장 후 종료(:wq)</p>
</li>
</ol>
<pre><code class="language-xml">:wq</code></pre>
<br>

<p>만약에 이거 안해주고 그냥 :w로 종료했으면 .env.swp 파일(임시파일)이 생성되된다.</p>
<p>제거 해주면 됨. 그러고 다시 작성해줘야함</p>
<pre><code class="language-xml">rm .env.swp </code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 초기세팅 | Express.js, Typescript 설정하기]]></title>
            <link>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-Express.js-Typescript-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-Express.js-Typescript-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Dec 2024 20:00:56 GMT</pubDate>
            <description><![CDATA[<p>명령을 사용하여 cURL(명령줄을 사용하여 인터넷에서 콘텐츠를 다운로드하는 데 사용되는 도구)을 설치합니다</p>
<pre><code class="language-coq">sudo apt-get install curl</code></pre>
<p><br><br></p>
<p>nvm, node.js, pm2가 기본적으로 설정이 되어있다는 가정하에 진행하겠습니다.</p>
<blockquote>
<p>만약, 안되어 있다면 아래 포스팅을 참고하세요
<a href="https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-nvm-node.js-%EB%B0%8F-pm2-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0">초기세팅 | nvm, node.js 및 pm2 설정하기</a></p>
</blockquote>
<br>

<h1 id="express-설치">express 설치</h1>
<pre><code class="language-coq">npm install express</code></pre>
<p><br><br></p>
<h1 id="typescript-설치">typescript 설치</h1>
<pre><code class="language-coq">npm install -g typescript </code></pre>
<br>

<p>typescript 버전 확인</p>
<pre><code class="language-coq">tsc --version
tsc --version@4.9.5</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/4bc63b7f-75f3-4bec-9694-ef7f9abdc6df/image.png" alt="">
<br></p>
<p>타입스크립트 설정파일(tsconfig.json) 생성</p>
<pre><code class="language-coq">tsc —init</code></pre>
<p>target 옵션을 자바스크립트 언어 버전에 맞는 것으로 지정 <code>es2016</code> → <code>es2020</code>
<img src="https://velog.velcdn.com/images/nam-willow/post/59ee071b-4497-4583-a475-aeab6fafb025/image.png" alt="">
<br></p>
<p>javascript 버전 확인</p>
<pre><code class="language-coq">node -p &quot;process.versions.v8&quot;  </code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/cf5150d0-5385-4775-807e-b7aa503f49b5/image.png" alt="">
<br></p>
<h1 id="ts-node-패키지-설치">ts-node 패키지 설치</h1>
<pre><code class="language-coq">npm install -g ts-node</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 초기세팅 | nvm, node.js 및 pm2 설정하기]]></title>
            <link>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-nvm-node.js-%EB%B0%8F-pm2-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-nvm-node.js-%EB%B0%8F-pm2-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Dec 2024 19:52:24 GMT</pubDate>
            <description><![CDATA[<p>참고 블로그
<a href="https://velog.io/@ashappyasikonw/Windows11-WSL2%EC%97%90-Node.js-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0">[Windows11] WSL2에 Node.js 설치하기</a></p>
<p><a href="https://learn.microsoft.com/ko-kr/windows/dev-environment/javascript/nodejs-on-wsl">WSL 2에 Node.js 설치</a></p>
<hr>
<br>

<h1 id="nvm-nodejs-및-pm2-설치"><strong>nvm, node.js 및 pm2 설치</strong></h1>
<h2 id="1-nvm-설치">1. nvm 설치</h2>
<p>Ubuntu 명령줄(또는 선택한 배포판)을 엽니다.</p>
<p>명령을 사용하여 cURL(명령줄을 사용하여 인터넷에서 콘텐츠를 다운로드하는 데 사용되는 도구)을 설치합니다</p>
<pre><code class="language-powershell">sudo apt-get install curl</code></pre>
<p>nvm을 설치합니다.</p>
<pre><code class="language-powershell">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash</code></pre>
<p>설치를 확인</p>
<pre><code class="language-powershell">command -v nvm</code></pre>
<p>&#39;nvm&#39;이 반환됨</p>
<blockquote>
<p>&#39;명령을 찾을 수 없음&#39; 메시지가 수신되거나 응답이 없으면 현재 터미널을 닫았다가 열고 다시 시도해 보세요. <a href="https://github.com/nvm-sh/nvm">nvm github 리포지토리에서 자세한 정보를 알아보세요</a>.</p>
</blockquote>
<p><br><br></p>
<h2 id="2-nodejs-설치">2. node.js 설치</h2>
<p>명령을 사용하여 현재 설치된 노드 버전을 나열</p>
<pre><code class="language-powershell">nvm ls </code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/e8840805-c527-4e7c-b4f7-5ae263aea15b/image.png" alt="">
<br></p>
<p>Node.js의 현재 버전과 안정적인 LTS 버전을 모두 설치합니다. 이후 단계에서는 <code>nvm</code> 명령을 사용하여 Node.js의 활성 버전 간에 전환하는 방법을 알아봅니다.</p>
<ul>
<li>Node.js의 현재 안정적인 LTS 릴리스를 설치합니다(프로덕션 애플리케이션에 권장).</li>
</ul>
<pre><code class="language-powershell">nvm install --lts</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/e247b492-613a-4947-8a0e-e6cee704474f/image.png" alt="">
<br></p>
<ul>
<li>Node.js의 현재 릴리스를 설치합니다(최신 Node.js 기능 및 개선 사항을 테스트하지만 문제가 발생할 가능성이 높음).</li>
</ul>
<pre><code class="language-powershell">nvm install node</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/b2f7cbfe-cc00-4745-bdd7-3d9bfcb6c1af/image.png" alt="">
<br></p>
<p>설치된 노드 버전을 나열</p>
<pre><code class="language-powershell">nvm ls</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/209bd894-1549-4496-b410-7b8a443fa75b/image.png" alt="">
<br></p>
<p>Node.js가 설치되어 있는지 여부 및 현재 기본 버전을 확인합니다. </p>
<pre><code class="language-powershell">node --version  </code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/bac4e60e-c335-404b-98ad-b13f45072543/image.png" alt="">
<br></p>
<p>사용할 노드js 버전을 변경</p>
<pre><code class="language-powershell">nvm use v18.20.4</code></pre>
<p>use로 사용했더니  </p>
<pre><code class="language-powershell">root@DESKTOP-GDPLMAE:~# nvm use v18.20.4
N/A: version &quot;v18.20.4 -&gt; N/A&quot; is not yet installed.

You need to run &quot;nvm install v18.20.4&quot; to install it before using it.</code></pre>
<p>install 을 사용하라고 나온다</p>
<pre><code class="language-powershell">nvm install v18.20.4</code></pre>
<p>완료!</p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/dfb510cd-4a9b-4efd-b121-e1008021545b/image.png" alt=""></p>
<h2 id="3-pm2-설치">3. pm2 설치</h2>
<p>npm install -g pm2</p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/59c246dc-eb8e-443a-b0f5-314c53d0706e/image.png" alt=""></p>
<p>실행방법</p>
<pre><code class="language-powershell"># dev라는 브랜치의 내용을 pull한다
git pull origin dev</code></pre>
<pre><code class="language-powershell"># 패키지를 설치한다.
npm i</code></pre>
<pre><code class="language-powershell"># 환경을 실행한다.
./local.sh</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 초기세팅 | wsl2에 mysql 설정하기]]></title>
            <link>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-wsl2%EC%97%90-mysql-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-wsl2%EC%97%90-mysql-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Dec 2024 19:42:23 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-powershell">root@DESKTOP-GDPLMAE:~/tk_world/tk_world_server# sudo systemctl status mysql
Unit mysql.service could not be found.</code></pre>
<br>

<h1 id="mysql-설치">mysql 설치</h1>
<pre><code class="language-powershell">sudo apt update</code></pre>
<pre><code class="language-powershell">sudo apt install mysql-server</code></pre>
<br>

<p>우리가 사용하는건 ams RDS db를 연결하는거라 mysql client로 다시 설치</p>
<pre><code class="language-json">sudo apt install mysql-client</code></pre>
<br>

<p>연결시도</p>
<pre><code class="language-json">mysql -h &lt;db연결url&gt; -P 3306 -u &lt;username&gt; -p</code></pre>
<br>


<p>연결 완료</p>
<pre><code class="language-json">root@DESKTOP-GDPLMAE:~# mysql -h &lt;db연결url&gt; -P 3306 -u &lt;username&gt; -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 101223
Server version: 8.0.33 Source distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type &#39;help;&#39; or &#39;\h&#39; for help. Type &#39;\c&#39; to clear the current input statement.
</code></pre>
<br>

<p>확인해보기</p>
<pre><code class="language-json">MySQL [(none)]&gt; show databases;
+--------------------+
| Database           |
+--------------------+
| dbname1            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| dbname2            |
+--------------------+
6 rows in set (0.005 sec)</code></pre>
<p>.env파일이 없으면 db와 연결이 안되니 파일 요청하기</p>
<p><a href="https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-git-.env%ED%8C%8C%EC%9D%BC-push-%EC%95%88%EB%90%98%EA%B2%8C-%ED%95%B4%EC%95%BC%ED%95%A8">초기세팅 | git .env파일 push 안되게 해야함 </a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 초기세팅 | oh-my-zsh]]></title>
            <link>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-oh-my-zsh%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9-%ED%8E%B8%EB%A6%AC%ED%95%98%EB%8F%84%EB%A1%9D</link>
            <guid>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-oh-my-zsh%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9-%ED%8E%B8%EB%A6%AC%ED%95%98%EB%8F%84%EB%A1%9D</guid>
            <pubDate>Tue, 10 Dec 2024 19:36:20 GMT</pubDate>
            <description><![CDATA[<p>참고블로그 
<a href="https://www.robotstory.co.kr/raspberry/?mode=view&amp;board_pid=117">1. oh-my-zsh 설치하기</a>
<a href="https://ohmyz.sh/#install">2. oh my zsh</a> (여기서 스크립스 코드 추출 해옴)</p>
<hr>
<br>

<h1 id="1-oh-my-zsh-설치">1. oh-my-zsh 설치</h1>
<pre><code class="language-json">sudo apt install zsh</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/5b82dc86-122d-4a64-bced-b219b852012a/image.png" alt=""></p>
<p>참고 블로그 - <a href="https://ohmyz.sh/#install">oh my zsh</a> (여기서 스크립스 코드 추출 해옴)</p>
<pre><code class="language-json">sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/c0e34191-9699-4426-998e-2152b7e8c83e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/2b68e1f3-3603-4440-bd88-bae8f266723d/image.png" alt=""></p>
<p>현재 셸을 <strong>zsh</strong>로 전환</p>
<pre><code class="language-json">zsh</code></pre>
<p><br><br></p>
<h1 id="2-테마설정">2. 테마설정</h1>
<pre><code class="language-json">sudo nano ~/.zshrc</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/1d546150-e551-44af-956e-293a304aaf4f/image.png" alt=""></p>
<p>컨드롤+o : 저장   → enter</p>
<p>컨트롤+x : 나가기  → enter</p>
<pre><code class="language-json">source ~/.zshrc</code></pre>
<br>


<h2 id="폰트-설정">폰트 설정</h2>
<pre><code class="language-json">sudo apt install fonts-powerline</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/ffb73a7c-7678-45d2-bed8-e07b20845c3b/image.png" alt=""></p>
<p><br><br></p>
<h1 id="3-플러그인-설치">3. 플러그인 설치</h1>
<h2 id="1-syntax-hightlight">1. <strong>syntax hightlight</strong></h2>
<p><strong>syntax hightlight</strong>는 말그대로 구문을 강조하는 플러그인</p>
<p><strong>GITHUB:</strong> <a href="https://github.com/zsh-users/zsh-syntax-highlighting"><strong>https://github.com/zsh-users/zsh-syntax-highlighting</strong></a></p>
<pre><code class="language-json">﻿$ git clone https://github.com/zsh-users/zsh-syntax-hightlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/5b1d06a7-6986-4c09-8592-451ae30e4ce8/image.png" alt=""></p>
<h3 id="플러그인-다운로드">플러그인 다운로드</h3>
<pre><code class="language-json">
﻿$ git clone https://github.com/zsh-users/zsh-syntax-hightlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting</code></pre>
<p>플러그인 설정해주기</p>
<pre><code class="language-json">﻿$ sudo nano ~/.zshrc</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/fd2f581c-517f-40de-82aa-2c2a4f1794eb/image.png" alt=""></p>
<p>zsh-syntax-highlighting</p>
<p>소싱 해주면 이제 적용된다.</p>
<pre><code class="language-json">source ~/.zshrc</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/134694c4-d046-4a13-9337-e5202e25746c/image.png" alt=""></p>
<p>이런식으로 잘못되면 빨간색으로 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 초기세팅 | Linux(리눅스), Ubuntu(우분투), wsl 설정]]></title>
            <link>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-%EB%A6%AC%EB%88%85%EC%8A%A4-wsl-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-%EB%A6%AC%EB%88%85%EC%8A%A4-wsl-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Tue, 10 Dec 2024 19:13:51 GMT</pubDate>
            <description><![CDATA[<p>ssh 연결방식과 WSL 연결방식이 있는데 나는 WSL연결 방식을 선택함</p>
<p>참고블로그
<a href="https://tech.cloud.nongshim.co.kr/2023/11/14/windows%EC%97%90%EC%84%9C-wsllinux-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0/">[빌링] Windows에서 WSL(Linux 개발 환경) 구축하기 - NDS Cloud Tech Blog</a></p>
<hr>
<br>

<p>해당 내용 참고하면서 설치함
<a href="https://learn.microsoft.com/ko-kr/windows/wsl/install-manual">이전 버전 WSL의 수동 설치 단계</a></p>
<hr>
<h3 id="1단계---linux용-windows-하위-시스템-사용"><strong>1단계 - Linux용 Windows 하위 시스템 사용</strong></h3>
<pre><code class="language-powershell">dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart</code></pre>
<h3 id="2단계---virtual-machine-기능-사용"><strong>2단계 - Virtual Machine 기능 사용</strong></h3>
<pre><code class="language-powershell">dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/9a2ded1b-e727-408a-8f43-ebd52633fc91/image.png" alt=""></p>
<h3 id="3단계---linux-커널-업데이트-패키지-다운로드"><strong>3단계 - Linux 커널 업데이트 패키지 다운로드</strong></h3>
<p>Linux 커널 업데이트 패키지는 Windows 운영 체제 이미지 내에서 WSL을 실행하기 위해 <a href="https://github.com/microsoft/WSL2-Linux-Kernel">WSL 2 Linux 커널</a>의 최신 버전을 설치합니다.</p>
<pre><code class="language-powershell">wsl.exe --install -d &lt;원하는 버전 입력&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/ec70197a-5fe0-4c88-8a68-65ed23b3d9da/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/91ed4b32-e46a-4514-88cb-48548bd58c1f/image.png" alt=""></p>
<h3 id="4단계---wsl-2를-기본-버전으로-설정"><strong>4단계 - WSL 2를 기본 버전으로 설정</strong></h3>
<p>PowerShell을 열고 이 명령을 실행하여 새 Linux 배포를 설치할 때 WSL 2를 기본 버전으로 설정합니다.</p>
<pre><code class="language-powershell">wsl --set-default-version 2</code></pre>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/2ca6a2ff-d0dc-4a57-8772-d7939fb8ccab/image.png" alt=""></p>
<p><br><br></p>
<h3 id="vscode에서-설정">vscode에서 설정</h3>
<p>vscode 에서 사용할때도 wsl 2를 사용하길 권장한다</p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/360ce3a9-8f9e-4ec6-aa8a-6d25154c2ef3/image.png" alt=""></p>
<h3 id="wsl-시작하기">wsl 시작하기</h3>
<p>F1 → wsl : 커낵션 new wsl window라고 써져있음</p>
<p>키보드 윈도우 버튼을 눌러서 → wsl을 실행해서 vsCode 에서 처럼 실행</p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/e6566aee-1ad7-47d3-9d33-fa8945d8dcdc/image.png" alt=""></p>
<p>키보드 윈도우 버튼에서 wsl을 눌러서 창이 나오면 </p>
<pre><code class="language-powershell">code . 
</code></pre>
<p>그럼 vscode에서 리눅스환경으로 설정된 vscode가 켜진다 </p>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/20300947-7b40-409c-8583-d8d42c6d175b/image.png" alt=""></p>
<p>아래의 창이 나오면 open folder in WSL 켜주기
<img src="https://velog.velcdn.com/images/nam-willow/post/ffe1caea-c667-40bc-81cd-e652afc1918e/image.png" alt=""></p>
<p>해당 화면이 안나오면 
vscode에서 F1 → wsl : connect to wsl using distro in new  window로 켜주고 폴더 선택하면 된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[초기세팅 | git .env파일 push 안되게 해야함 ]]></title>
            <link>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-git-.env%ED%8C%8C%EC%9D%BC-push-%EC%95%88%EB%90%98%EA%B2%8C-%ED%95%B4%EC%95%BC%ED%95%A8</link>
            <guid>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-git-.env%ED%8C%8C%EC%9D%BC-push-%EC%95%88%EB%90%98%EA%B2%8C-%ED%95%B4%EC%95%BC%ED%95%A8</guid>
            <pubDate>Tue, 10 Dec 2024 19:03:01 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>git에 업로드 할때는 보안에 중요할 내용들은 push하면 안된다! </p>
</li>
<li><p>그렇기 때문에 프로젝트 git clone 해오면  env파일이 없어서 내부적으로 요청해야 함.</p>
</li>
<li><p><code>.gitignore</code>사용법을 익히고, vscode 탐색기에서 <code>.env</code>파일이 disabled(파일명 회색으로변함)되어있는지 잘 확인하세요.
<br><br></p>
</li>
</ul>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/nam-willow/post/ca4323dc-bf4f-4d93-8697-a2059c9b6038/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/nam-willow/post/fbaf8ba0-18df-4c8b-8a93-c9caee41abf5/image.png" alt=""></th>
</tr>
</thead>
</table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 초기세팅 | private repository를 ssh- git clone]]></title>
            <link>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-private-repository%EB%A5%BC-ssh-git-clone</link>
            <guid>https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-private-repository%EB%A5%BC-ssh-git-clone</guid>
            <pubDate>Tue, 10 Dec 2024 18:58:41 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>참고 블로그
<a href="https://statistics-and-data.tistory.com/entry/Github-private-repository%EB%A5%BC-clone%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">Github private repository를 clone하는 방법</a></p>
</li>
<li><p>로컬에서 설정하려다가 오류가 나서 리눅스 환경에서 설정하기!
<a href="https://www.notion.so/wsl-3dc68df827f64c0e876d5ed8e1586147?pvs=21">초기세팅 | 리눅스 wsl 설정</a> </p>
</li>
</ul>
<hr>
<h1 id="깃-설치">깃 설치</h1>
<pre><code class="language-powershell">apt-get install git</code></pre>
<p>지금 사용하고 있는(커밋할) 계정입력</p>
<pre><code class="language-powershell">git config --global user.name &quot;자신의 계정&quot;
git config --global user.email &quot;자신의 이메일&quot;</code></pre>
<p>까지 해줘야 리눅스에서 깃 클론을 사용가능하게 된다</p>
<br>

<h1 id="리눅스에서-git해오기">리눅스에서 git해오기</h1>
<h2 id="ssh-키-생성">ssh 키 생성</h2>
<pre><code class="language-python">ssh-keygen</code></pre>
<p><br>결과</p>
<pre><code>&gt; root@DESKTOP-GDPLMAE:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
....
The key&#39;s randomart image is:
+---[RSA 3072]----+
|                 |
|  . .. . .       |
|   + .o o        |
|  + . o...       |
| + . o =S        |
|o=+ + + .o       |
|X. B.o ..        |
|*+*.B.oo         |
|E*o*o*o..        |
+----[SHA256]-----+</code></pre><p><br><br></p>
<p>생성된 키 확인</p>
<pre><code class="language-python">cd ~/.ssh
ls -al
cat id_rsa.pub</code></pre>
<ul>
<li><p>ssh-rsa 부터 나온key값을 복사 (ssh키는 리눅스 환경 하나당 하나!!)</p>
</li>
<li><p>_<strong>리눅스 환경에서 명령어 작성</strong>_하기!
<img src="https://velog.velcdn.com/images/nam-willow/post/5cab9345-4c90-44dd-a715-893cd9bb1d06/image.png" alt=""><br></p>
</li>
<li><p>리눅스 환경 결과값
```</p>
<blockquote>
<p>root@DESKTOP-GDPLMAE:<del># cd ~/.ssh
root@DESKTOP-GDPLMAE:</del>/.ssh# ls -al
total 20
drwx------ 2 root root 4096 Sep  3 18:01 .
drwx------ 8 root root 4096 Sep  3 17:57 ..</p>
</blockquote>
</li>
<li><p>rw------- 1 root root 2610 Sep  3 18:01 id_rsa</p>
</li>
<li><p>rw-r--r-- 1 root root  574 Sep  3 18:01 id_rsa.pub</p>
</li>
<li><p>rw-r--r-- 1 root root  142 Sep  3 17:54 known_hosts
root@DESKTOP-GDPLMAE:~/.ssh# cat id_rsa.pub
ssh-rsa sshkey내용</p>
<pre><code></code></pre></li>
</ul>
<p><br><br></p>
<h2 id="github에-ssh키-등록">github에 ssh키 등록</h2>
<p>settings → SSH and gpg keys → new ssh key
<img src="https://velog.velcdn.com/images/nam-willow/post/33975efa-5719-479a-bdca-8278a31a4c68/image.png" alt=""></p>
<p>복사한 키 등록
<img src="https://velog.velcdn.com/images/nam-willow/post/489d8630-014c-4827-848a-e7cd9733b251/image.png" alt=""></p>
<p>title은 아무것나 상관없음
<img src="https://velog.velcdn.com/images/nam-willow/post/1ac4d396-7a2c-40ca-816c-44f02980977b/image.png" alt="">
<br></p>
<h2 id="git-clone">git clone</h2>
<p>이제 리눅스 환경에서 깃클론 할거임
<img src="https://velog.velcdn.com/images/nam-willow/post/f3b7eef8-1942-4455-b4a2-be5aba133f7d/image.png" alt=""></p>
<p>등록해준 후 git clone할 디렉토리로 가서 git해주기</p>
<pre><code># 폴더 생성
mkdir 원하는폴더명

# 폴더로 이동
cd 원하는폴더명

# 해당 폴더에 git clone 해오기
git clone git@github.com:원하는-리포지토리.git</code></pre><hr>
<p>추가 
<a href="https://velog.io/@nam-willow/%EC%B4%88%EA%B8%B0%EC%84%B8%ED%8C%85-git-.env%ED%8C%8C%EC%9D%BC-push-%EC%95%88%EB%90%98%EA%B2%8C-%ED%95%B4%EC%95%BC%ED%95%A8">초기세팅 | git .env파일 push 안되게 해야함 </a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] ValueError: TypeError("'coroutine' object is not iterable"), TypeError('vars() argument must have dict attribute')]]></title>
            <link>https://velog.io/@nam-willow/Error-ValueError-TypeErrorcoroutine-object-is-not-iterable-TypeErrorvars-argument-must-have-dict-attribute</link>
            <guid>https://velog.io/@nam-willow/Error-ValueError-TypeErrorcoroutine-object-is-not-iterable-TypeErrorvars-argument-must-have-dict-attribute</guid>
            <pubDate>Tue, 10 Dec 2024 18:20:15 GMT</pubDate>
            <description><![CDATA[<p>참고 사이트
<a href="https://stackoverflow.com/questions/72611531/adding-async-to-fastapi-function-gives-me-the-coroutine-object-is-not-iterabl">Adding async to Fastapi function gives me the &quot;&#39;coroutine&#39; object is not iterable&quot; error</a></p>
<hr>
<br>

<h1 id="오류">오류</h1>
<p><code>coroutine함수명</code> 함수를 실행을 했더니 오류가 발생했다. </p>
<pre><code class="language-py">    async def coroutine함수명(self, file: UploadFile, 일부생략):
        return upload(file, 일부생략)</code></pre>
<pre><code class="language-python">async def upload(file, 일부생략):
    (이하 생략...)</code></pre>
<h3 id="valueerror-typeerrorcoroutine-object-is-not-iterable"><code>ValueError</code>: [TypeError(&quot;&#39;coroutine&#39; object is not iterable&quot;)</h3>
<h3 id="typeerrorvars-argument-must-have-dict-attribute"><code>TypeError</code>(&#39;vars() argument must have <strong>dict</strong> attribute&#39;)]</h3>
<pre><code class="language-python">*** API error: POST: https://주소/주소/ {&#39;error&#39;: &#39;ValueError&#39;, &#39;detail&#39;: &#39;&#39;, &#39;body&#39;: &#39;&#39;, &#39;errors&#39;: &#39;[TypeError(&quot;\&#39;coroutine\&#39; object is not iterable&quot;), TypeError(\&#39;vars() argument must have __dict__ attribute\&#39;)]&#39;}
    Traceback (most recent call last):
      File &quot;/home/ubuntu/photolabs/lib/python3.10/site-packages/fastapi/encoders.py&quot;, line 152, in jsonable_encoder
        data = dict(obj)
    TypeError: &#39;coroutine&#39; object is not iterable

    (...중간생략)

    ValueError: [TypeError(&quot;&#39;coroutine&#39; object is not iterable&quot;), TypeError(&#39;vars() argument must have __dict__ attribute&#39;)]

</code></pre>
<p><br><br></p>
<h1 id="원인">원인</h1>
<p><code>coroutine함수명()</code>에서 실행한 메서드가 코루틴이기 때문에 호출하는 <code>upload()</code>도 속도를 맞춰야 한다.</p>
<p>하지만 <code>coroutine함수명()</code>에서는 비동기로 처리가 되었지만 리턴할때는 await로 호출하지 않았기 때문에 두개의 매서드가 속도가 다르게 되서 발생하는 오류.
<br></p>
<p>호출된 비동기 작업이 완료되지 않았음에도 불구하고, 호출을 한 쪽에서는 마치 작업이 완료된 것처럼 동작함. 
비동기 작업의 완료를 기다리지 않고 결과를 반환하려고 했기 때문에 비동기 작업의 동기화와 작업 완료 상태 관리에 문제가 생긴것임</p>
<table>
<thead>
<tr>
<th>정상적으로 비동기 함수가 작동되었을때</th>
<th>await로 호출하지 않아서 함수가 동기방식으로 작동 되었을 때</th>
</tr>
</thead>
<tbody><tr>
<td></td>
<td><img src="https://velog.velcdn.com/images/nam-willow/post/6792b91e-e8af-4852-9fee-51885e48fb77/image.png" alt=""></td>
</tr>
<tr>
<td><br><br></td>
<td></td>
</tr>
</tbody></table>
<h1 id="해결">해결</h1>
<p>수정 전</p>
<pre><code class="language-py">    async def coroutine함수명(self, file: UploadFile, 일부생략):
        return upload(file, 일부생략)</code></pre>
<br>

<p>수정 후 -&gt; 호출 함수에서 _<strong><code>await</code>추가</strong>_해서 비동기 함수로 정상 작동되도록 수정 </p>
<pre><code class="language-py">    async def coroutine함수명(self, file: UploadFile, 일부생략):
        return await upload(file, 일부생략)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[node.js] logger 파일 생성하기]]></title>
            <link>https://velog.io/@nam-willow/node.js-logger-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@nam-willow/node.js-logger-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Dec 2024 17:56:34 GMT</pubDate>
            <description><![CDATA[<h4 id="참고-블로그">참고 블로그</h4>
<p><a href="https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-Winston-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%84%9C%EB%B2%84-%EB%A1%9C%EA%B7%B8-%EA%B4%80%EB%A6%AC">[NODE] 📚 Winston 모듈 사용법 - 서버 로그 관리</a></p>
<hr>
<br>

<p><code>/logs/logger.js</code>
logger 미들웨어 작성</p>
<pre><code class="language-js">const winston = require(&quot;winston&quot;);
const winstonDaily = require(&quot;winston-daily-rotate-file&quot;);
//const process = require(&quot;process&quot;);
const appRoot = require(&quot;app-root-path&quot;);

const { combine, timestamp, label, printf } = winston.format;

//로그파일 저장 경로 -&gt; 루트 경로/logs 폴더
const logDir = `${appRoot}/logs`;
// console.log(&quot;logDir&quot;, logDir);

// log 출력 포맷 정의 함수
const logFormat = printf(({ level, message, label, timestamp, meta }) =&gt; {
  const route = meta?.route || &quot;N/A&quot;; // route 정보를 meta에서 가져옴
  return `${timestamp} [${label}] ${route} | ${level}: ${message}`; // 원하는 포맷
});</code></pre>
<pre><code class="language-js">//winston 로거 생성
const logger = winston.createLogger({
  //* 로그 출력 형식 정의
  format: combine(
    timestamp({ format: &quot;YYYY-MM-DD HH:mm:ss&quot; }),
    label({ label: &quot;Node_project&quot; }),     // 어플리케이션 이름
    logFormat                              // log 출력 포맷
    //? format: combine() 에서 정의한 timestamp와 label 형식값이 logFormat에 들어가서 정의되게 된다. level이나 message는 콘솔에서 자동 정의
  ),</code></pre>
<pre><code class="language-js">
  // 실제 로그를 어떻게 기록을 한 것인가 정의
  transports: [
    // info 레벨 로그를 저장할 파일 설정 (info: 2 보다 높은 error: 0 와 warn: 1 로그들도 자동 포함해서 저장)
    new winstonDaily({
      level: &quot;info&quot;,                 // info 레벨에선
      datePattern: &quot;YYYY-MM-DD&quot;,     // 파일 날짜 형식
      dirname: logDir,                 // 파일 경로
      filename: `%DATE%.log`,         // 파일 이름
      maxFiles: 30,                 // 최근 30일치 로그 파일을 남김
      zippedArchive: true,             // 아카이브된 로그 파일을 gzip으로 압축할지 여부
    }),

    // error 레벨 로그를 저장할 파일 설정 (info에 자동 포함되지만 일부러 따로 빼서 설정)
    new winstonDaily({
      level: &quot;error&quot;,                 // error 레벨에선
      datePattern: &quot;YYYY-MM-DD&quot;,
      dirname: logDir + &quot;/error&quot;,     // /logs/error 하위에 저장
      filename: `%DATE%.error.log`, // 에러 로그는 2020-05-28.error.log 형식으로 저장
      maxFiles: 30,
      zippedArchive: true,
    }),
  ],

  // uncaughtException 발생시 파일 설정
  exceptionHandlers: [
    new winstonDaily({
      level: &quot;error&quot;,
      datePattern: &quot;YYYY-MM-DD&quot;,
      dirname: logDir,
      filename: `%DATE%.exception.log`,
      maxFiles: 30,
      zippedArchive: true,
    }),
  ],
});</code></pre>
<pre><code class="language-js">/**
 * API 로그를 남길 커스텀 메서드 추가
 * @param {String} level &quot;log레벨&quot;
 * @param {String} message &quot;log 남길 메세지&quot;
 * @param {String} route &quot;POST /selvas/measure&quot;
 */
logger.apiLog = (level, message, route) =&gt; {
  logger.log({
    level,
    message,
    meta: { route },
  });
};


module.exports = logger;
</code></pre>
<br>



<p><code>controller.js</code>
라우터 경로를 보내는 방법</p>
<pre><code class="language-jsx">      const methodUrl = `${req.method} ${req.url}`;
      const result = await services.hcMeasureResultSet(req.body, methodUrl);</code></pre>
<br>


<p><code>services.js</code>
로깅방법</p>
<pre><code class="language-jsx">logger.apiLog(&quot;error&quot;, &quot;selvas user_info not defined&quot;, methodUrl);</code></pre>
<p><br><br></p>
<p>프로젝트를 실행하면 이렇게 파일이 생성된다… 이부분 수정이 필요해보임</p>
<ul>
<li>2024-12-09.error.log,</li>
<li>2024-12-09.exception.log</li>
<li>2024-12-09.exceptions.log</li>
<li>2024-12-09.log</li>
<li>/error/2024-12-09.error.log
<img src="https://velog.velcdn.com/images/nam-willow/post/e17ba6bf-8931-43e9-86da-833fe16f1e27/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error]  type_error.dict : value is not a valid dict]]></title>
            <link>https://velog.io/@nam-willow/Error-typeerror.dict-value-is-not-a-valid-dict</link>
            <guid>https://velog.io/@nam-willow/Error-typeerror.dict-value-is-not-a-valid-dict</guid>
            <pubDate>Tue, 10 Dec 2024 17:42:54 GMT</pubDate>
            <description><![CDATA[<h1 id="오류">오류</h1>
<p>오류 메시지 &quot;422 Error: Unprocessable Entity&quot;는 서버가 요청을 이해했지만, 요청된 내용에 문제가 있어 처리할 수 없음을 나타냅니다. 
<br></p>
<h4 id="requset-body">Requset body</h4>
<p><img src="https://velog.velcdn.com/images/nam-willow/post/049ba987-58a9-443b-8d28-5e0d4d29ec58/image.png" alt=""></p>
<pre><code class="language-json">{
  &quot;format&quot;: &quot;png&quot;,
  &quot;mask_image&quot;: &quot;string&quot; / 테스트때문에 추가 또는 삭제하느라고 오류 캡쳐할때 있다가 없다가 할 수 있음
}</code></pre>
<br>

<h4 id="response-body">Response body</h4>
<pre><code class="language-json">{
  &quot;detail&quot;: [
    {
      &quot;loc&quot;: [
        &quot;body&quot;,
        &quot;request_param&quot;
      ],
      &quot;msg&quot;: &quot;value is not a valid dict&quot;,
      &quot;type&quot;: &quot;type_error.dict&quot;
    }
  ]</code></pre>
<br>

<h4 id="curl">Curl</h4>
<pre><code class="language-powershell">curl -X &#39;POST&#39; \
  &#39;http://127.0.0.1:8080/주소/주소&#39; \
  -H &#39;accept: application/json&#39; \
  -H &#39;Content-Type: multipart/form-data&#39; \
  -F &#39;file=@파일명.확장자;type=MIME타입&#39; \
  -F &#39;request_param={
        &quot;format&quot;: &quot;png&quot;,
        &quot;mask_image&quot;: &quot;string&quot;
    }&#39;</code></pre>
<p><br><br></p>
<h1 id="원인">원인</h1>
<p>파일 업로드와 requset_param을 같이 받으면 오류가 발생한다
문자열로 보내진 데이터를 Pydantic에서 json으로 받는걸로 작성 했기 때문에 오류 발생</p>
<blockquote>
<ul>
<li>업로드 파일(<code>UploadFile</code>) : Content-Type: <code>multipart/form-data</code></li>
</ul>
</blockquote>
<ul>
<li>클래스 타입 데이터(<code>request_param</code>) : Content-Type: <code>application/json</code></li>
</ul>
<br>

<p><strong><code>request_param</code></strong>을 class type으로 지정해서 json형태로 받도록 코드를 작성했음</p>
<pre><code class="language-py"> async def 함수명(self, file: UploadFile, request_param: models.RequestsClassName, 일부생략 ):</code></pre>
<pre><code class="language-py">class RequestsClassName(Base):
    __tablename__ = &#39;db_name&#39;

    format = Column(String(45))
    mask_image = Column(String(255))
</code></pre>
<p>curl 요청 <strong><code>Content-Type</code></strong> 을 확인해보면  <strong><code>multipart/form-data</code></strong> 로 보낸 경우 자동으로 JSON 객체로 변환하지 않고 문자열 그대로 받게 되는거임</p>
<p>그래서 Pydantic 모델로의 변환이 실패하며 <em><strong>type이 맞지 않아서</strong></em> &quot;value is not a valid dict&quot;라는 오류가 발생한거임</p>
<p><br><br></p>
<h1 id="해결">해결</h1>
<p>이전에는 <strong><code>RequestsClassName</code></strong> 타입을 사용하여 JSON 객체를 받는것이 아닌,</p>
<p>Content-Type을 _<strong><code>multipart/form-data</code>를 사용하여 데이터를 전송하는 것</strong>_으로 수정.</p>
<pre><code class="language-python"> async def 함수명(self, file: UploadFile, format:Optional[str], mask_image:Optional[str], 일부생략):</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] hsv를 사용해서 색상 변경하기]]></title>
            <link>https://velog.io/@nam-willow/Python-hsv%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%83%89%EC%83%81-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@nam-willow/Python-hsv%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%83%89%EC%83%81-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 10 Dec 2024 17:08:07 GMT</pubDate>
            <description><![CDATA[<h3 id="이전에-작성했던-코드에서-치명적-오류">이전에 작성했던 코드에서 치명적 오류</h3>
<ul>
<li><p>명도가 조금만 밝으면 아예 이미지가 깨지는 현상 발생... 이를 해결하려고 명도를 확인해서 수정하는 코드 작성</p>
</li>
<li><p>명도가 205이하면 어둡다고 생각해서 +50 하고, 205 이상이면 +50 했을때 이미지가 깨지는 경우가 발생해서 numpy를 사용해서 처리해줫음</p>
<br>

</li>
</ul>
<pre><code class="language-py">def color(self, request_param: models.Color, 일부 생략):

        rgb_color = self.parse_color(request_param.rgb,request_param.hex, request_param.hsl)

        # 변경할 색상 값
        newColor = {&#39;R&#39;: rgb_color[0], &#39;G&#39;: rgb_color[1], &#39;B&#39;: rgb_color[2]}  # 변경할 색상 값
        # newColor = {&#39;R&#39;: 255, &#39;G&#39;: 127, &#39;B&#39;: 127}  # 변경할 색상 값
        r = newColor[&#39;R&#39;]
        g = newColor[&#39;G&#39;]
        b = newColor[&#39;B&#39;]
        bgr_color = (b, g, r)

        (...중간 생략)

        # 원본 이미지를 HSV 색상공간으로 변환  
        hsv_image = cv2.cvtColor(originalImage, cv2.COLOR_BGR2HSV)

        # BGR 색상 값을 HSV로 변환
        hsv_color = cv2.cvtColor(np.uint8([[bgr_color]]), cv2.COLOR_BGR2HSV)
        hsv_color = hsv_color[0][0]

        # hsv
        hue=hsv_color[0]        # hsv모드의 색조 값 담아주기
        saturation=hsv_color[1] # hsv모드의 채도 값 담아주기

        # check 영역(흰색)의 boolean 생성
        # 색상이 255(흰색)내용을 트루로 표시
        check = (segmentedImage == 255)

        # check 영역에(True)만 Hue와 Saturation을 변경
        hsv_image[:, :, 0][check] = hue # 색조
        hsv_image[:, :, 1][check] = saturation # 채도

        # check에 해당하는 영역의 명도를 가져온다
        value_channel = hsv_image[:, :, 2][check] 
        lower_brightness_areas = value_channel &lt;= 205
        hsv_image[:, :, 2][check][lower_brightness_areas] = np.clip(value_channel[lower_brightness_areas] + 50, 0, 255)

        # HSV 이미지를 BGR 색상 값으로 변경
        # 이게 결과값
        image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)


        (이하 생략...)</code></pre>
<pre><code class="language-py">    # request_param == 색상값
    def parse_color(self, rgb, hex, hsl): 
        # rgb값으로 변경 -&gt; 튜플로 변환
        if hex:
            hex_color = hex.lstrip(&#39;#&#39;)
            rgb_values = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
            return rgb_values
        # 튜플로 변환
        if rgb:
            rgb_values = tuple(map(int, rgb.split(&#39;,&#39;)))
            return rgb_values</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] ZeroDivisionError]]></title>
            <link>https://velog.io/@nam-willow/Error-ZeroDivisionError</link>
            <guid>https://velog.io/@nam-willow/Error-ZeroDivisionError</guid>
            <pubDate>Tue, 10 Dec 2024 16:49:11 GMT</pubDate>
            <description><![CDATA[<h1 id="오류">오류</h1>
<p><strong><code>ZeroDivisionError: division by zero</code></strong> 오류는 보통 어떤 수를 0으로 나누려고 할 때 발생합니다. 이 경우, <strong><code>i2i_payload</code></strong>의 <strong><code>args</code></strong> 내부에서 특정 값 설정이 이 오류를 유발하는 원인일 수 있습니다. </p>
<pre><code class="language-python">*** Error running process: /경로/경로/extensions/sd-webui-controlnet/scripts/controlnet.py
    Traceback (most recent call last):
      File &quot;/경로/경로.py&quot;, line 469, in decode_base64_to_image
        image = Image.open(BytesIO(base64.b64decode(encoding)))
      File &quot;/usr/lib/python3.10/base64.py&quot;, line 87, in b64decode
        return binascii.a2b_base64(s)
    binascii.Error: Incorrect padding
        .
        .
        .
    fastapi.exceptions.HTTPException: 500: Invalid encoded image

------------------------------------------------------------------


*** API error: POST: http://127.0.0.1:8080/주소/주소 {&#39;error&#39;: &#39;ZeroDivisionError&#39;, &#39;detail&#39;: &#39;&#39;, &#39;body&#39;: &#39;&#39;, &#39;errors&#39;: &#39;division by zero&#39;}
        .
        .
        .
      File &quot;/경로/경로/extensions/sd-dynamic-thresholding/dynthres_core.py&quot;, line 29, in interpret_scale
        frac = self.step / max
    ZeroDivisionError: division by zero

------------------------------------------------------------------
</code></pre>
<h1 id="원인">원인</h1>
<p>payload에 안쓰는 값은 <code>false</code> 또는 <code>None</code> 으로 처리해줘야하는데 사용한다고 되어있는데 값이 없어서 발생하는 오류였음 = <em><strong>보통은 페이로드에 값을 잘못넣었을때 발생하는 오류</strong></em></p>
<pre><code class="language-python">i2i_payload_path = &#39;/경로/경로/i2i_base_payload.json&#39; </code></pre>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/nam-willow/post/92be0b8b-87f5-4ebd-adc4-62cc6861e3b6/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/nam-willow/post/7a299cd7-6ebc-4feb-a655-ce016b8413c1/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td></td>
<td><img src="https://velog.velcdn.com/images/nam-willow/post/43fa5167-ec9a-4213-a13f-54dec4658712/image.png" alt=""></td>
</tr>
</tbody></table>
<p><br><br></p>
<h1 id="해결">해결</h1>
<pre><code class="language-python">i2i_payload_path = &#39;/경로/경로/i2i_new_payload.json&#39;</code></pre>
<p>내가 사용할 기능만 뽑아서 payload로 새롭게 만든 후 이미지와 이미지 사이즈만 payload에 입력하는 방법으로 진행했음 
-&gt; <em><strong>다른 기능들과 충돌되지 않기위해</strong></em> 새로운 파일에 연결.
-&gt; ZeroDivisionError의 _<strong>오류를 방지</strong>_하기 위해 안쓰는 기능의 payload는 삭제.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] sqlalchemy.exc.NoForeignKeysError]]></title>
            <link>https://velog.io/@nam-willow/Error-sqlalchemy.exc.NoForeignKeysError</link>
            <guid>https://velog.io/@nam-willow/Error-sqlalchemy.exc.NoForeignKeysError</guid>
            <pubDate>Tue, 10 Dec 2024 16:32:34 GMT</pubDate>
            <description><![CDATA[<h1 id="오류">오류</h1>
<p><strong>sqlalchemy.exc.NoForeignKeysError</strong></p>
<p>: Could not determine join condition between parent/child tables on relationship FaceRequestsDB.facial_expression - there are no foreign keys linking these tables.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a &#39;primaryjoin&#39; expression.</p>
<pre><code class="language-powershell">(...중간 생략)
      File &quot;/경로/경로/lib/python3.10/site-packages/sqlalchemy/util/compat.py&quot;, line 211, in raise_
        raise exception
    sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship FaceRequestsDB.facial_expression - there are no foreign keys linking these tables.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a &#39;primaryjoin&#39; expression.
</code></pre>
<p><br><br></p>
<h1 id="원인">원인</h1>
<p>facial = relationship 으로 FacialDB로 연결해놨는데 컬럼에는 어디에 사용한다는 foreignkey를 명시한게 없어서 오류가 발생 </p>
<pre><code class="language-py">class FaceRequestsDB(Base):
    __tablename__ = &#39;face_requests&#39;

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(ForeignKey(&#39;users.id&#39;), index=True)
    (...중간생략)
    format = Column(String(45))

    user = relationship(&#39;UsersDB&#39;)
    facial = relationship(&#39;FacialDB&#39;)</code></pre>
<p><br><br></p>
<h1 id="해결">해결</h1>
<pre><code class="language-py">class FaceRequestsDB(Base):
    __tablename__ = &#39;face_requests&#39;

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(ForeignKey(&#39;users.id&#39;), index=True)
    (...중간생략)
    format = Column(String(45))
    facial_id = Column(ForeignKey(&#39;facial.id&#39;), index=True)  # 수정 부분

    user = relationship(&#39;UsersDB&#39;)
    facial = relationship(&#39;FacialDB&#39;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] io.UnsupportedOperation: read]]></title>
            <link>https://velog.io/@nam-willow/Error-io.UnsupportedOperation-read-w0cz4nd1</link>
            <guid>https://velog.io/@nam-willow/Error-io.UnsupportedOperation-read-w0cz4nd1</guid>
            <pubDate>Tue, 10 Dec 2024 16:19:41 GMT</pubDate>
            <description><![CDATA[<h1 id="오류">오류</h1>
<pre><code class="language-powershell">*** API error: POST: http://127.0.0.1:8080/주소 {&#39;error&#39;: 
    (...중간생략)
    anyio.WouldBlock

    During handling of the above exception, another exception occurred:
    Traceback (most recent call last):
      File &quot;/경로/경로/lib/python3.10/site-
      (...중간생략)
    anyio.EndOfStream

    During handling of the above exception, another exception occurred:
    Traceback (most recent call last):
      File &quot;/경로/경로.py&quot;, line 567, in exception_handling
        return await call_next(request)
        (...중간생략)
      File &quot;/경로/경로.py&quot;, line 3526, in upload_face_change
        original_image_data = await saved_file.read()
    io.UnsupportedOperation: read</code></pre>
<h1 id="원인">원인</h1>
<pre><code class="language-python">    async def 함수명(self, file: UploadFile, db: Session = Depends(get_db)): 

        # test 업로드한 파일 
        os.makedirs(f&quot;생성할폴더&quot;, exist_ok=True)
        with open(f&quot;읽어올 이미지파일&quot;, &quot;rd&quot;) as  saved_file:
           original_image_data = await saved_file.read()</code></pre>
<p>내가 이미지 파일을 테스트하려고 한건데 여기서 오류가 난거임→ </p>
<ul>
<li><strong><code>open</code></strong> 함수로 파일을 열고, 이 파일 객체에 대해 비동기적인 <strong><code>read</code></strong> 연산을 시도하려고 했기 때문에 발생. </li>
<li><strong><code>open</code></strong> 함수로 열린 파일 객체는 비동기 연산을 지원x. 따라서, <strong><code>original_image_data = await saved_file.read()</code></strong> 구문이 <strong><code>io.UnsupportedOperation: read</code></strong> 오류<br>

</li>
</ul>
<h4 id="anyiowouldblock">anyio.WouldBlock</h4>
<p>일반적으로 I/O 작업(파일 읽기/쓰기, 네트워크 요청 등)에서 비동기 처리를 잘못 설정했을 때 발생</p>
<h4 id="anyioendofstream">anyio.EndOfStream</h4>
<p>스트림의 끝에 도달. 예를 들어 파일 또는 네트워크 연결이 예상보다 일찍 닫혔거나 데이터가 손상된 경우 발생.</p>
<h4 id="iounsupportedoperation-read">io.UnsupportedOperation: read</h4>
<p>객체에서 read() 함수를 호출했으나, 해당 객체가 read 연산을 지원하지 않는 경우 발생.
이 오류는 특히 다음과 같은 상황에서 발생:</p>
<blockquote>
<ul>
<li>비동기 작업에서 파일 핸들이 올바르게 열리지 않음.</li>
</ul>
</blockquote>
<ul>
<li>saved_file이 파일 객체가 아닌 잘못된 데이터 형식으로 전달됨.</li>
<li>파일 스트림이 이미 닫힌 상태에서 접근 시도.</li>
</ul>
<br>

<h1 id="해결">해결</h1>
<p>그냥 업로드된 이미지를 read()로 읽어오는걸로 변경</p>
<pre><code class="language-python">        file.file.seek(0) # 파일 포인터를 처음으로 이동
        original_image_data = await file.read()      </code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] binascii.Error: Invalid base64-encoded string]]></title>
            <link>https://velog.io/@nam-willow/Error-binascii.Error-Invalid-base64-encoded-string</link>
            <guid>https://velog.io/@nam-willow/Error-binascii.Error-Invalid-base64-encoded-string</guid>
            <pubDate>Tue, 10 Dec 2024 16:01:08 GMT</pubDate>
            <description><![CDATA[<h1 id="오류">오류</h1>
<p>decode_base64_to_image() 메서드만 실행하면 계속 오류가 뜬다
<br></p>
<pre><code class="language-powershell">■ decode_base64_to_image() | 동작시작 
*** Error running process: /경로/경로/extensions/sd-webui-controlnet/scripts/controlnet.py
    Traceback (most recent call last):
      File &quot;/경로/경로/modules/api/api.py&quot;, line 466, in decode_base64_to_image
        image = Image.open(BytesIO(base64.b64decode(encoding)))
      File &quot;/usr/lib/python3.10/base64.py&quot;, line 87, in b64decode
        return binascii.a2b_base64(s)
    binascii.Error: Incorrect padding

    The above exception was the direct cause of the following exception:

    (... 중간 생략)

decode_base64_to_image
        raise HTTPException(status_code=500, detail=&quot;Invalid encoded image&quot;) from e
    fastapi.exceptions.HTTPException: 500: Invalid encoded image
</code></pre>
<pre><code class="language-powershell">13:21:34 - ReActor - STATUS - Working: source face index [0], target face index [0]
*** Error running postprocess: /경로/경로/extensions/sd-webui-reactor/scripts/reactor_faceswap.py
    Traceback (most recent call last):
      File &quot;/경로/경로/modules/scripts.py&quot;, line 654, in postprocess
        script.postprocess(p, processed, *script_args)
      File &quot;/경로/경로/extensions/sd-webui-reactor/scripts/reactor_faceswap.py&quot;, line 297, in postprocess
        result, output, swapped = swap_face(
      File &quot;/경로/경로/extensions/sd-webui-reactor/scripts/reactor_swapper.py&quot;, line 359, in swap_face
        img_bytes = base64.b64decode(source_img)
      File &quot;/usr/lib/python3.10/base64.py&quot;, line 87, in b64decode
        return binascii.a2b_base64(s)
    binascii.Error: Invalid base64-encoded string: number of data characters (5) cannot be 1 more than a multiple of 4
</code></pre>
<h1 id="원인-해결">원인, 해결</h1>
<ul>
<li><p>text2img를 실행하는 프로세스 였는데</p>
</li>
<li><p>payload를 사용할때 controlnet이랑 reactor를 사용을 <code>true</code>로 해놓은 payload를 사용해서 오류가 난거였음</p>
</li>
<li><p><em><code>false</code>로 변경함*</em>
<br><br></p>
</li>
</ul>
<p><em><strong>오류를 확인해보면 내가 사용하지 않은 항목들에서 오류가 발생해서 해결할 수 있었음</strong></em></p>
<blockquote>
<p>★fastapi.exceptions.HTTPException: 500: Invalid encoded image
 인코딩이 잘못되었다.</p>
</blockquote>
<blockquote>
<p>★File &quot;/경로/경로/extensions/sd-webui-controlnet/scripts/controlnet.py&quot;, line 1073, in process
controlnet.py에서의 오류</p>
</blockquote>
<blockquote>
<p>★File &quot;/경로/경로/extensions/sd-webui-reactor/scripts/reactor_faceswap.py&quot;, line 297, in postprocess
reactor_faceswap.py에서의 오류</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] StopIteration]]></title>
            <link>https://velog.io/@nam-willow/Error-StopIteration</link>
            <guid>https://velog.io/@nam-willow/Error-StopIteration</guid>
            <pubDate>Tue, 10 Dec 2024 15:48:19 GMT</pubDate>
            <description><![CDATA[<h1 id="오류">오류</h1>
<p>스테이블 디퓨전을 실행했는데 이런 오류가 발생했다. </p>
<pre><code class="language-powershell">*** Error running process: /경로/경로/sd-dynamic-prompts/scripts/dynamic_prompting.py]
    Traceback (most recent call last):
      File &quot;/경로/경로/scripts.py&quot;, line 621, in process
        script.process(p, *script_args)
      File &quot;/경로/경로/extensions/sd-dynamic-prompts/sd_dynamic_prompts/dynamic_prompting.py&quot;, line 481, in process
        all_prompts, all_negative_prompts = generate_prompts(
      File &quot;/경로/경로/extensions/sd-dynamic-prompts/sd_dynamic_prompts/helpers.py&quot;, line 93, in generate_prompts
        all_prompts = prompt_generator.generate(prompt, num_prompts, seeds=seeds) or [&quot;&quot;]
      File &quot;/경로/경로/lib/python3.10/site-packages/dynamicprompts/generators/randomprompt.py&quot;, line 71, in generate
        prompts.append(str(next(iter(gen))))
    StopIteration</code></pre>
<br>

<h1 id="원인">원인</h1>
<p> <strong><code>Stable Diffusion</code></strong> 이미지 생성을 위한 동적 프롬프트 생성 과정에서 발생한 것으로 보입니다. </p>
<p>동적 프롬프트 생성 스크립트인 <strong><code>dynamic_prompting.py</code></strong>에서 프롬프트를 생성하는 과정 중에 예상치 못한 중단(<strong><code>StopIteration</code></strong>)이 발생한 것으로 보입니다. </p>
<p><em><strong>= 스테이블 디퓨전을 실행할때 프롬프트에 내용이 없어서 발생한 오류</strong></em>
<br></p>
<h1 id="해결">해결</h1>
<p>테스트하려고 프롬프트 안쓰고 실행한거라_** 프롬프트를 쓰고 실행**_했더니 오류가 없어짐 </p>
<p><strong><code>StopIteration</code></strong>오류가 발생해도 이미지 결과는 나옴</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[라이브러리 충돌....]]></title>
            <link>https://velog.io/@nam-willow/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%B6%A9%EB%8F%8C</link>
            <guid>https://velog.io/@nam-willow/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%B6%A9%EB%8F%8C</guid>
            <pubDate>Tue, 10 Dec 2024 15:40:30 GMT</pubDate>
            <description><![CDATA[<h3 id="참고-블로그">참고 블로그</h3>
<p>번역 프로그램을 사용하기위해 라이브러리를 다운받음<em>텍스트</em>
<a href="https://boringariel.tistory.com/13">[Googletrans] Googletrans를 이용한 파이썬 번역 프로그램 만들기</a>
<br></p>
<h1 id="상황">상황</h1>
<pre><code class="language-python">pip install googletrans==4.0.0-rc1</code></pre>
<p>이거를 사용해서 라이브러리를 다운 받았더니 라이브러리 버전 충돌이 일어났다. </p>
<h1 id="오류">오류</h1>
<pre><code class="language-powershell">AttributeError: module &#39;gradio.components&#39; has no attribute &#39;IOComponent&#39;. Did you mean: &#39;Component’</code></pre>
<p>pip list로 확인을 해봤더니 pydantic 버전과 그라디오 버전이 달라져서 실행하려고 하니까 오류가 어마어마 하게 났다. </p>
<h1 id="해결">해결</h1>
<p>하나하나 버전 맞춰줬고, 수정했는데 다른게 바뀐게 많아서 라이브러리 설치할때 라이브러리 버전 관리를 해줘야한다. </p>
<pre><code class="language-powershell">pip install gradio==x.y.z pydantic==a.b.c
</code></pre>
<p>-&gt; <strong><em>우리는 git 관리를 안하는 상황이었기 때문에 바뀐게 있으면 파악하기가 어려웠음</em></strong></p>
<p><br><br><br></p>
<p>라이브러리 다운받을때 사수에게 먼저 여쭤보거나 _<strong>git으로 패키지 관리가 중요함</strong>_을 경험하였음.</p>
]]></description>
        </item>
    </channel>
</rss>