<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>익스플로의 아카이브</title>
    <link>https://iksflow.tistory.com/</link>
    <description>호기심 많은 개발자의 프로그래밍 탐구일지</description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 10:29:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Iksflow</managingEditor>
    <image>
      <title>익스플로의 아카이브</title>
      <url>https://tistory1.daumcdn.net/tistory/3461772/attach/cb0c48f2efa54c5ebeded40e19e6e453</url>
      <link>https://iksflow.tistory.com</link>
    </image>
    <item>
      <title>2024년 회고</title>
      <link>https://iksflow.tistory.com/178</link>
      <description>&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;2024년을 돌아보며&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;2024년은 내가 개발자로 일하는 7년의 커리어 중에 가장 큰 위기를 경험했고 힘들었던 해였다.&lt;br /&gt;2023년 회고를 들춰보니 그때에도 경제 상황이 갈수록 안 좋아지는 것을 언급했었는데 2024년은 그보다 더 심했다.&amp;nbsp;&lt;br /&gt;나 또한 다니던 회사에서 권고사직을 통보받고 실업자가 되었다.&lt;br /&gt;권고사직을 계기로 나는 지속 가능한 삶에 대한 고민이 많아졌다.&amp;nbsp;&lt;br /&gt;'회사에서 잘렸으니 다시 이직을 하면 그걸로 충분한 것인가?'&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아직은 &lt;/span&gt;연차가 많이 쌓이지 않았고 젊기 때문에 이직 하는게 불가능한 일은 아니다. &lt;br /&gt;하지만 더 나이가 들어서 나를 필요로 하는 곳이 없어졌을 때 나는 어떻게 살아갈 것인지에 대한 계획을 떠올릴 수 없었다.&lt;br /&gt;부모님 세대에서는 괜찮았을지 모르지만 지금도 직장인으로 살아가는 방식이 지속가능한 삶의 방식일까?&lt;br /&gt;나에게 2024년은 스스로 던진 이 질문에 대한 답을 고민하는 시기였다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;생애 첫 권고사직&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;사실 2023년 12월 나는 권고사직으로 인해 무직자가 되었다.&lt;br /&gt;연말에 갑작스럽게 진행된 일이라 2023년 회고에서는 경황이 없어서 다루지 못했었다.&lt;br /&gt;권고사직은 뉴스에서나 접하는 다른사람 얘기라고만 생각했던 일이 나에게 벌어지니 당황스러웠다.&lt;br /&gt;회사는 경영악화를 이유로 프로덕트 개발팀 전원을 해고했다. &lt;br /&gt;투자금의 절반 가량을 소진했지만 이렇다할 성과가 없었고 PMF를 찾지 못했다고 판단해서 특단의 결정을 내렸다고 공지했다.&lt;br /&gt;회사에게 서운하고 분한 마음이 들지 않았다고하면 거짓말이겠지.&amp;nbsp;&lt;br /&gt;그래도 회사는 위로금 명목으로 2개월치 급여를 챙겨줬다는 점이 씁쓸한 마음을 달래는데 조금 도움이 되었다.&amp;nbsp;&lt;br /&gt;권고사직 절차를 진행하면서 나는 이직하기위해 여러 번 시도를 했지만 번번이 실패했다.&lt;br /&gt;나처럼 일자리를 잃어버린 사람들이 인력시장에 많이 풀려서 경쟁이 심해진 것도 한몫했다.&lt;br /&gt;어쩌다 운이 좋게 최종 면접까지 가더라도 연봉협상에서 결렬되는 경우가 많았다.&lt;br /&gt;경험치가 쌓이다 보니 회사의 규모, 투자 시리즈만 봐도 내가 지원해 볼 만한 곳인지 아닌지 알 수 있게 되었다.&lt;br /&gt;당시 분위기는 회사들이 3~5년 차 가성비 좋은 인력을 채용하는데 집중하는 분위기였다.&amp;nbsp;&lt;br /&gt;계속해서 탈락의 고배를 마시면서 몸과 마음이 지치기도 했던지라 잠시 구직활동을 멈추고 휴식을 취하기로 결정했다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;제주도 한 달 살기&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;지쳐있던 몸과 마음에게 휴식을 선물할 겸 제주도에 한 달 살기를 다녀왔다.&lt;br /&gt;나는 사람이 많은 곳을 좋아하지 않아서 여행 스타일이 독특한 편이다. &lt;br /&gt;관광은 가볍게 하고 남은 시간은 조용한 곳에서 혼자 컴퓨터를 하거나 코딩을 하는 것을 좋아한다.&lt;br /&gt;제주도에는 이런 장소들이 몇 군데 있다. &lt;br /&gt;예전부터 가보고 싶었던 '오피스제주', '스페이스모노', '아임포트'와 같은 노마드 워커를 위한 공유오피스에 다녀왔다.&lt;br /&gt;바다가 잘 보이는 곳에서 조용히 코딩할 수 있는 작업실을 갖고 싶다는 로망이 있었는데 '오피스제주'는 바로 그런 곳이었다.&lt;br /&gt;조용하고 아늑한 오피스에서 일에 집중하다가 고개를 살짝 들면 푸른 바다가 펼쳐진 풍경을 만끽할 수 있었다.&lt;br /&gt;매일같이 숨 막히는 지하철에 몸을 싣고 콘크리트 숲에 나를 가둬놓을 때와 비교하면 말로 표현할 수 없을 만큼의 해방감과 창의력이 생기는 감정을 느꼈다.&lt;br /&gt;내가 하고 싶은 일과 스스로를 위해 일한다는 기분이 들었다.&lt;br /&gt;그렇게 제주도 한 바퀴를 돌면서 가보고 싶었던 곳을 구석구석 다녀왔다.&lt;br /&gt;좋은 리프레쉬 휴가였다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;정부지원사업에 도전&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;제주도 한 달 살기를 하던 중 창업에 관심이 생겼다.&lt;br /&gt;앞서 언급했듯이 나는 '바다가 잘 보이는 곳에서 조용히 코딩할 수 있는 작업실을 갖고 싶다'라는 로망이 있다.&lt;br /&gt;오피스 제주에서 작업을 하던 중 문득 ' 로망은 반드시 돈을 많이 벌고 여유가 생겨야만 실현 가능한 것일까?'라는 생각이 들었다.&lt;br /&gt;그리고 이 생각은 '좋아하는 일을 하면서 돈을 벌면 그만 아닌가?'라는 생각으로 발전했다.&lt;br /&gt;나도 노마드 워커를 위한 공간을 운영하면서 돈을 버는 사업을 해보자는 생각이 들어 계획을 세워보았다.&lt;br /&gt;처음에는 바다가 잘 보이는 지역들로 알아보았다. &lt;br /&gt;하지만 임대매물로 나온 건물 같은 건 있을 리가 없었다.&lt;br /&gt;직접 토지를 매입해서 건물을 올리거나, 오래된 건물을 사서 리모델링하는 방법뿐이었다.&lt;br /&gt;하지만 토지에도 용도가 있었고 도시 계획에 맞게 이미 구역이 나누어져 있었다.&amp;nbsp;&lt;br /&gt;내가 원하는 위치가 있더라도 허가를 받지 못한다면 해결할 수 없는 문제였다.&lt;br /&gt;물론 비용 또한 당연히 감당할 능력이 없었다.&lt;br /&gt;이건 내 예상을 크게 벗어나는 복잡한 문제라 이내 접어버렸다.&lt;br /&gt;&lt;br /&gt;조금 타협해서 상가자리를 찾기 쉬운 서울에 만들면 어떨까 생각을 해보았다.&lt;br /&gt;공부하거나 일할 때 카페를 찾는 사람들이 있다.&lt;br /&gt;그런데 이들이 카페를 찾는 이유는 정말 카페에서 일하는 것이 편해서일까?라는 생각을 하게 되었다.&lt;br /&gt;내가 생각한 가설은 적당한 가격에 앉아서 공부하거나 캼퓨터로 업무를 처리할 장소가 마땅치 않아서 카페를 이용한다는 것이었다.&lt;br /&gt;그리고 이들은 카페에서 음료를 하나 시키고 장시간 머문다.&lt;br /&gt;이들이 오래 머물수록 업주들 입장에서는 회전율이 떨어지고 매출에 타격을 받게 된다.&lt;br /&gt;그래서 이 문제를 해결하기 위해 카페를 대신해서 일상에서 편하게 이용할 수 있는 작업 공간 대여사업을 기획해 보았고 사업계획서도 작성했다.&lt;br /&gt;정부지원사업에 기획한 아이디어를 제출해 보았지만 탈락했다.&lt;br /&gt;부동산 임대업으로 속해서 애초에 지원 대상이 아니었다.&lt;br /&gt;그래도 아이디어를 구체화해 보면서 사업계획서를 써본 경험은 나에게 큰 자산이 되었다.&lt;br /&gt;면밀히 수익과 비용을 예상해 보면서 사업성이 있는 아이템인가를 따져보는 작업들은 내 시야가 더 넓어지게 만들어 주었다.&lt;br /&gt;사업성분석을 해보기 전에는 '왜 이런 아이템이 있으면 좋을 것 같은데, 세상에는 없을까?'라는 생각을 한 적이 많았다.&lt;br /&gt;하지만 지금은 안다. &lt;br /&gt;없는 데는 다 이유가 있다. &lt;br /&gt;해봤자 돈이 안되기 때문이다.&lt;br /&gt;다음에는 돈이 되는 사업아이템을 발굴해서 철저히 준비해 봐야겠다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;다시 한번 스타트업&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;그렇게 정부지원사업에 지원했지만 결과적으로 탈락의 고배를 마시고 말았다. &lt;br /&gt;나는 다시 무언가 해야만 하는 상황에 놓였다.&lt;br /&gt;3개월 전과 똑같이 무직이었지만 그래도 사업을 꼭 시작하겠다는 목표가 생겼다.&lt;br /&gt;사업을 시작하려면 자본금이 있어야 한다. 그리고 아직 더 일을 해야겠구나 싶었다.&lt;br /&gt;그러던 중 운이 좋게도 6월에 이직을 하게 됐다.&lt;br /&gt;새 회사에서는 모바일앱과 AI서비스를 활용한 제품을 개발하는 역할을 담당했다.&lt;br /&gt;실제로 AI를 실무에 활용하는 경험을 할 수 있다는 점이 마음에 들었다.&lt;br /&gt;업무 강도는 심한 편이지만, 좋은 사람들과 일하면서 배우는 점도 많다.&lt;br /&gt;내가 다녀본 가장 얼리스테이지 스타트업이라 체계도 거의 없었다. &lt;br /&gt;그래도 미래의 내가 창업을 했을 때 겪을 수 있는 일이라 생각한다. &lt;br /&gt;힘들어도 즐거운 마음으로 잘 헤쳐나가야지&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;전산회계 자격증 취득&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;본격적으로 사업을 해야겠다는 목표가 생긴 뒤에는 재무회계에 관심이 생겼다.&lt;br /&gt;개인이 부자가 되기 위해서는 시드머니를 모아야 하고 이를 위해 돈을 절약하는 것처럼, 회사도 마찬가지라고 본다.&lt;br /&gt;돈을 잘 버는 것도 중요하지만 돈을 아낄 수 있는 부분은 아껴야 한다.&amp;nbsp;&lt;br /&gt;즉 어디서 돈이 새는지를 알아야 한다는 말이다.&lt;br /&gt;그러려면 회계를 알아야 하고 장부를 잘 기록하고 관리하는 능력이 필요하다.&lt;br /&gt;나는 가볍게 전산회계 2급부터 시작했다.&lt;br /&gt;2급은 따기 쉬운 편이라는 말이 많았지만 직장을 다니면서 시험을 준비하는 건 쉽지 않았다.&lt;br /&gt;시험은 70점을 넘으면 합격이었다.&lt;br /&gt;하지만 자격증 취득보다는 배움에 목표를 두고 있었기 때문에 100점 만점으로 취득하기 위해 더 꼼꼼히 공부했다.&lt;br /&gt;결과적으로 전산회계 2급 자격증을 91점이라는 성적으로 취득할 수 있었다.&lt;br /&gt;2025년의 목표는 전산회계 1급 자격증, 전산세무 2급 자격증에 도전하는 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정신없이 많은 일들이 스쳐 지나간 2024년이었다.&lt;br /&gt;힘든 일이 많았지만 그만큼 좋은 일도 많았다.&lt;br /&gt;니체의 '나를 죽이지 못하는 고통은 나를 더욱 강하게 만든다'라는 말이 딱 어울리는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;한 해였다.&lt;br /&gt;지금의 고난을 거름으로 삼아 더 큰 목표를 이루는 사람이 되기를 바라면서 회고를 마친다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일상</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/178</guid>
      <comments>https://iksflow.tistory.com/178#entry178comment</comments>
      <pubDate>Sat, 18 Jan 2025 18:02:08 +0900</pubDate>
    </item>
    <item>
      <title>[오류해결 | React Native] Xcode must be fully installed before you can continue.</title>
      <link>https://iksflow.tistory.com/177</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;React Native 프레임워크인 Expo에서 iOS 에뮬레이터로 앱을 실행하려는데 인식하지 못하는 경우가 있다. XCode는 정상적으로 설치했음에도, App Store에서 설치할 것인지 계속 묻는다. 예를 들면 아래와 같은 식이다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;$ npm run ios
Xcode must be fully installed before you can continue. Continue to the App Store?&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;해결 방법&lt;/h2&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;pre class=&quot;awk&quot;&gt;&lt;code&gt;$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer&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;code&gt;npm run ios&lt;/code&gt; 명령어를 실행한다.&lt;br /&gt;그럼 Expo에서 자동으로 시뮬레이터를 인식해서 앱 프로세스를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;$ npm run ios  

&amp;gt; rncourse@1.0.0 ios
&amp;gt; expo start --ios

Starting project at /Users/iksflow/studyroom/react-native-study/RNCourse
Starting Metro Bundler
&amp;rsaquo; Opening exp://192.168.0.2:8081 on iPhone 15 Pro Max
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
█ ▄▄▄▄▄ █▀▀ ██ █  █ ▄▄▄▄▄ █
█ █   █ █▄▀██▀██  █ █   █ █
█ █▄▄▄█ █ ▄ █ ▀▀ ██ █▄▄▄█ █
█▄▄▄▄▄▄▄█ █ ▀▄█▄█▄█▄▄▄▄▄▄▄█
█  ▀▄▀█▄ █▀█   ▀▄▄▀  ▄▀▄▄▀█
█▄ ▀▄ ▀▄█▄▀▀    ▀█▄▀ ▀▀█▄▄█
█▄▀▀▄ ▀▄█▄▀▄ █  █▀█ ▄█ ██▀█
█▄▀██▀▀▄▄▄▀▄ █▀██ ▄▄ ▀▀██▄█
█▄▄▄██▄▄█ ▀██ ▀▄  ▄▄▄ █ ▄ █
█ ▄▄▄▄▄ █▄▀ ▄ █   █▄█  ▀  █
█ █   █ █▀█▀▀███▀▄ ▄▄ █▀█▄█
█ █▄▄▄█ █▀▀▀███▀█  █▄  ▄█▄█
█▄▄▄▄▄▄▄█▄█▄█▄███▄███▄▄█▄▄█

&amp;rsaquo; Metro waiting on exp://192.168.0.2:8081
&amp;rsaquo; Scan the QR code above with Expo Go (Android) or the Camera app (iOS)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/expo/expo/issues/21727&quot;&gt;https://github.com/expo/expo/issues/21727&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/Error</category>
      <category>error</category>
      <category>Expo</category>
      <category>react native</category>
      <category>rn</category>
      <category>오류해결</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/177</guid>
      <comments>https://iksflow.tistory.com/177#entry177comment</comments>
      <pubDate>Fri, 31 May 2024 19:23:22 +0900</pubDate>
    </item>
    <item>
      <title>React + TypeScript로 네이버 지도 그리기 - 1. 요금 정보 및 환경설정</title>
      <link>https://iksflow.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;React + Typescript로 개발 중인 앱에 지도 기능이 필요해서 구현하는 방법을 찾아보았다.&lt;br /&gt;지도 서비스를 제공하는 플랫폼에는 카카오, 네이버, 구글 등이 있는데, 평소에 마음에 들어 자주 사용하는 네이버 지도를 선택했다.&lt;br /&gt;사용자의 입장에서 개발하는 입장이 되니 비용, 구현 방법 등 알아야 할 것이 생각보다 많았고 궁금해졌다.&lt;br /&gt;그래서 이번에 React + TypeScript 환경에서 Naver Maps로 지도를 그리기 위해 알아본 내용들을 글로 정리해 보았다.&lt;br /&gt;쓰다 보니 내용이 길어져서 &lt;b&gt;소개 및 환경설정에 대한 내용&lt;/b&gt;과 &lt;b&gt;구현 내용&lt;/b&gt;을 분리하기로 했다.&lt;br /&gt;이번 글에서는 &lt;b&gt;소개 및 환경설정에 대한 내용&lt;/b&gt;을 다룬다.&lt;br /&gt;개발을 시작하기 전에 알아두면 좋을 Naver Maps의 기능, 요금 안내, 환경 설정에 대해 정리해 보았다.&lt;br /&gt;그럼 네이버 지도(이하 Naver Maps)를 적용해 보기 전에 요금에 대한 정보와 회원가입 하는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;1. Naver Maps의 기능&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://guide.ncloud-docs.com/docs/maps-overview&quot;&gt;Naver Maps&lt;/a&gt;는 다양한 기능을 제공한다.&lt;br /&gt;지도 그리기, 지도 이동, 지도 레이어 구성, 마커 표시, 길 찾기 등 여러 기능이 있다.&lt;br /&gt;나는 지도에 원하는 위치를 표시하거나 이동하는 기능이 필요했다.&lt;br /&gt;Naver Maps는 개발문서에서 API 사용 방법과 예제를 제공하고 있어서 문서를 읽고 따라 하는 게 크게 어렵지는 않았다.&lt;br /&gt;다만 조금 아쉬웠던 점은 요즘 프런트엔드 개발 환경의 트렌드인 React와 Typescript 기반의 설명이 아니라 Vanilla JS, jQuery 기반의 설명이라는 점이다.&lt;br /&gt;React, Typescript에 능숙한 사용자라면 Vanilla JS로 작성된 부분을 React, Typescript의 구조에 맞게 변형해서 사용할 수 있을 것이다.&lt;br /&gt;하지만 나처럼 React, Typescript와 아직 친하지 않은 사람에겐 구조에 맞게 변형하는 방법까지 공부해야 했기에 약간의 진입장벽으로 느껴졌다.&lt;br /&gt;분명 나와 비슷하게 어려움을 겪는 사람도 있을 거란 생각이 들었고 이 글을 작성하는 계기가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;2. 요금 안내&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 설명에 들어가기 앞서 비용에 대한 걱정을 줄이기 위해 요금과 관련된 내용을 먼저 소개하려고 한다.&lt;br /&gt;아래는 Naver Maps의 이용 요금 안내표이다.&lt;br /&gt;용도에 따라 나뉜 다양한 API가 있으며 기본적으로 모든 API에 무료 이용 횟수가 있다.&lt;br /&gt;이번에 사용할 API는 Web Dynamic Map으로 1달에 10,000,000회를 무료로 사용할 수 있다.&lt;br /&gt;하루 평균으로 따져봤을 때 300,000회를 무료로 사용하고도 남는 정도이기 때문에 토이프로젝트 또는 작은 규모의 서비스는 요금에 대한 걱정을 할 필요가 없다.&lt;br /&gt;참고로 Web Dynamic Map은 지도에서 우리가 흔히 사용하는 지도서비스처럼 줌 인/아웃 및 지도에서 위치를 이동할 수 있는 기능을 제공하는 지도이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJhMcS/btsFMKwSlPq/LtD3tzdEnC68dMJWkcWeu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJhMcS/btsFMKwSlPq/LtD3tzdEnC68dMJWkcWeu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJhMcS/btsFMKwSlPq/LtD3tzdEnC68dMJWkcWeu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJhMcS%2FbtsFMKwSlPq%2FLtD3tzdEnC68dMJWkcWeu0%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;1846&quot; height=&quot;1404&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;1404&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;h2 data-ke-size=&quot;size26&quot;&gt;2.1. 무료 이용 한도와 대표 계정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 클라우드 플랫폼에서 처음으로 생성하는 아이디가 '대표 계정'으로 등록된다.&lt;br /&gt;대표 계정은 개인, 사업자 각 1개만 등록할 수 있고 네이버에서 제공하는 API 무료 이용 한도는 대표계정에만 제공된다.&lt;br /&gt;예를 들어 '사용자 A'가 Naver Maps API 무료 이용 한도가 월 1,000회인 경우 계정을 3개 만든다고 해서 각각 1,000회씩 총합 3,000회를 이용할 수는 없다.&lt;br /&gt;현재 계정은 가입 후 콘솔에서 '대표 계정 확인' 이라는 버튼을 클릭하면 아래와 같이 확인할 수 있다.&lt;br /&gt;참고로 대표계정은 고객센터에 문의해서 변경이 가능하다.&lt;br /&gt;자세한 정보는 &lt;a href=&quot;https://www.ncloud.com/support/faq/all/2829&quot;&gt;고객센터의 F&amp;amp;Q 페이지&lt;/a&gt;에 나와있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2794&quot; data-origin-height=&quot;1646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHL4YR/btsFRaOHkD5/JQQkadDicd6afjtEx2AS91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHL4YR/btsFRaOHkD5/JQQkadDicd6afjtEx2AS91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHL4YR/btsFRaOHkD5/JQQkadDicd6afjtEx2AS91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHL4YR%2FbtsFRaOHkD5%2FJQQkadDicd6afjtEx2AS91%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;2794&quot; height=&quot;1646&quot; data-origin-width=&quot;2794&quot; data-origin-height=&quot;1646&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;h2 data-ke-size=&quot;size26&quot;&gt;2.2. 무료 이용 한도 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 잘못된 케이스로 초과하면 어쩌나 걱정이 들 수도 있다.&lt;br /&gt;하지만 걱정하지 않아도 괜찮다.&lt;br /&gt;가입직후 콘솔에서 확인해 보면 Naver Maps의 초기 설정값은 무료 이용 한도만큼 설정되어 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2792&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dn4gVm/btsFM9DbFXA/kkXZufavTwNURT1vFQn0kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dn4gVm/btsFM9DbFXA/kkXZufavTwNURT1vFQn0kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dn4gVm/btsFM9DbFXA/kkXZufavTwNURT1vFQn0kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdn4gVm%2FbtsFM9DbFXA%2FkkXZufavTwNURT1vFQn0kK%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;2792&quot; height=&quot;1218&quot; data-origin-width=&quot;2792&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;1206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLnMHr/btsFLVlmJ8I/T2gAc2F5EQl8YmTe3zRjx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLnMHr/btsFLVlmJ8I/T2gAc2F5EQl8YmTe3zRjx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLnMHr/btsFLVlmJ8I/T2gAc2F5EQl8YmTe3zRjx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLnMHr%2FbtsFLVlmJ8I%2FT2gAc2F5EQl8YmTe3zRjx1%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;1998&quot; height=&quot;1206&quot; data-origin-width=&quot;1998&quot; data-origin-height=&quot;1206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;3. 네이버 클라우드 플랫폼 회원가입&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;a href=&quot;https://auth.ncloud.com/join&quot;&gt;네이버 클라우드 플랫폼 회원가입 페이지&lt;/a&gt;에서 회원가입을 진행한다.&lt;br /&gt;링크로 이동하면 아래와 같은 화면이 나오는데 이메일 또는 네이버 계정으로 진행이 가능하다.&lt;br /&gt;이메일 인증 및 결제 수단 등록의 추가 절차를 진행하면 가입이 완료된다.&lt;br /&gt;이메일 인증은 등록한 이메일로 받게 되는 인증 메일의 링크를 클릭하면 완료된다.&lt;br /&gt;결제 수단 등록은 체크카드나 신용카드를 등록해야 하니 미리 결제 가능한 카드를 준비한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brVaGp/btsFPqDsqg7/wi4N1ylhzEYYhKnc94lukk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brVaGp/btsFPqDsqg7/wi4N1ylhzEYYhKnc94lukk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brVaGp/btsFPqDsqg7/wi4N1ylhzEYYhKnc94lukk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrVaGp%2FbtsFPqDsqg7%2Fwi4N1ylhzEYYhKnc94lukk%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;2726&quot; height=&quot;1418&quot; data-origin-width=&quot;2726&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;4. 애플리케이션 등록&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입을 마치고 콘솔로 이동하면 대시보드에 접근할 수 있다.&lt;br /&gt;좌측의 사이드 내비게이션에서 AI/NAVER API의 Application 메뉴를 클릭한다.&lt;br /&gt;그러면 아래처럼 AI/NAVER API 이용 약관에 동의하라는 페이지가 나올텐데 동의함에 체크하고 확인을 누른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PVOOw/btsFPGuClQg/CKBolqWDqTsSZxprexDjc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PVOOw/btsFPGuClQg/CKBolqWDqTsSZxprexDjc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PVOOw/btsFPGuClQg/CKBolqWDqTsSZxprexDjc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPVOOw%2FbtsFPGuClQg%2FCKBolqWDqTsSZxprexDjc1%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;2660&quot; height=&quot;1586&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이용 약관에 대한 동의 절차가 끝나면 대시보드에서 &lt;b&gt;Application 등록&lt;/b&gt; 이란 하늘색 버튼이 보인다.&lt;br /&gt;버튼을 클릭하면 상세 정보를 입력하는 페이지가 나온다.&lt;br /&gt;이번에는 웹 애플리케이션을 등록하는 예제를 진행하는 것이므로 Web Application 개발에 필요한 내용들을 입력했다.&lt;br /&gt;아래를 참고해 Application 이름, Service 선택, 서비스 환경 등록의 정보를 입력하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2792&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x6CjV/btsFRaHQgPp/868yR0YcrnlN3PkdgUIkd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x6CjV/btsFRaHQgPp/868yR0YcrnlN3PkdgUIkd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x6CjV/btsFRaHQgPp/868yR0YcrnlN3PkdgUIkd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx6CjV%2FbtsFRaHQgPp%2F868yR0YcrnlN3PkdgUIkd0%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;2792&quot; height=&quot;1218&quot; data-origin-width=&quot;2792&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Application 이름은 본인의 앱 이름을 입력하면 된다.&lt;br /&gt;네이버 클라우드 플랫폼에서 Application을 식별하기 위한 이름이기 때문에 실제 앱의 명칭과 달라도 상관없어 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Service 선택 항목이다.&lt;br /&gt;웹 애플리케이션에 필요한 항목들을 모두 체크했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막은 서비스 환경 등록이다.&lt;br /&gt;개발단계에서는 도메인을 등록하는 일이 없을 테니, &lt;code&gt;http://localhost&lt;/code&gt; 라고 입력하면 된다.&lt;br /&gt;등록되어있지 않은 도메인에서 요청이 오는 경우는 오류가 발생하니 나중에 서비스를 배포할 경우 도메인 주소를 추가해줘야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;1520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yjiLh/btsFQe5o8Tr/VJWQ67tbeq4PRF62eKBywK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yjiLh/btsFQe5o8Tr/VJWQ67tbeq4PRF62eKBywK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yjiLh/btsFQe5o8Tr/VJWQ67tbeq4PRF62eKBywK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyjiLh%2FbtsFQe5o8Tr%2FVJWQ67tbeq4PRF62eKBywK%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;2452&quot; height=&quot;1520&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;1520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2426&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZdjS1/btsFQyJimx0/3XemI5SxSnnHSWqGDjogK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZdjS1/btsFQyJimx0/3XemI5SxSnnHSWqGDjogK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZdjS1/btsFQyJimx0/3XemI5SxSnnHSWqGDjogK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZdjS1%2FbtsFQyJimx0%2F3XemI5SxSnnHSWqGDjogK0%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;2426&quot; height=&quot;844&quot; data-origin-width=&quot;2426&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 Naver Maps로 지도를 그리기 위해 사전 준비에 대해 알아봤다.&lt;br /&gt;다음 글에서는 본격적으로 Naver Maps를 활용해 지도를 그리기 위한 개발환경을 설정하는 방법에 대해 알아볼 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;참고&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://guide.ncloud-docs.com/docs/maps-overview&quot;&gt;https://guide.ncloud-docs.com/docs/maps-overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/React</category>
      <category>NaverMaps</category>
      <category>react</category>
      <category>typescript</category>
      <category>네이버지도</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/176</guid>
      <comments>https://iksflow.tistory.com/176#entry176comment</comments>
      <pubDate>Sun, 17 Mar 2024 10:43:57 +0900</pubDate>
    </item>
    <item>
      <title>[오류해결] VSCode - Cannot find name 'test'. Do you need to install type definitions for a test runner?</title>
      <link>https://iksflow.tistory.com/175</link>
      <description>&lt;h2&gt;오류 발생&lt;/h2&gt;
&lt;p&gt;VSCode에서 Typescript로 작성된 테스트코드에 붉은 밑줄이 그어지며 오류 메시지가 나타났다.&lt;br&gt;참고로 &lt;code&gt;yarn test&lt;/code&gt; 같은 테스트 실행 명령어로 동작은 잘 되는 상태였다.&lt;br&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rlovE/btsFGB7D7EC/IgXpROruSSB4uNgNzxEY60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rlovE/btsFGB7D7EC/IgXpROruSSB4uNgNzxEY60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rlovE/btsFGB7D7EC/IgXpROruSSB4uNgNzxEY60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrlovE%2FbtsFGB7D7EC%2FIgXpROruSSB4uNgNzxEY60%2Fimg.png&quot; width=&quot;100%&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;오류 상세&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;Cannot find name &amp;#39;test&amp;#39;. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha`.ts(2582)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;VSCode에서 Jest의 타입을 불러오지 못해서 발생한 오류였다.  &lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;p&gt;해결방법은 &lt;strong&gt;tsconfig.json&lt;/strong&gt; 파일에 아래와 같이 &amp;quot;@types/jest&amp;quot;를 추가한다.&lt;br&gt;물론 tsconfig.json에 &lt;code&gt;&amp;quot;exclude&amp;quot;: [&amp;quot;**/tests/*.test.ts&amp;quot;]&lt;/code&gt; 처럼 exclude옵션에서 테스트코드의 확장자를 제외시키는 방법도 있다.&lt;br&gt;하지만 보다 근본적인 해결방법은 오류 메시지처럼 type definition을 인식가능하도록 만들어주는 것이다.  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;compilerOptions&amp;quot;: {
    ...,
    &amp;quot;types&amp;quot;: [&amp;quot;...&amp;quot;, &amp;quot;@types/jest&amp;quot;],
    ....
  },
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;npm, yarn classic(V1)을 사용한다면 위와 같이 tsconfig.json을 수정하는 것으로 오류가 해결된다.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;그런데 만약 Yarn berry(V2+)를 사용&lt;/strong&gt;하고 있고 오류가 계속 발생한다면 추가로 익스텐션 설치와 VSCode 설정을 해줘야 한다.&lt;br&gt;Yarn berry는 Plug’n’Play(PnP)방식을 사용하기 때문에 &lt;code&gt;node_modules&lt;/code&gt; 디렉터리에서 의존성을 관리하지 않는다.&lt;br&gt;&lt;code&gt;.yarn&lt;/code&gt; 디렉터리 아래에 압축된 &lt;code&gt;zip&lt;/code&gt;파일로 의존성 관리를 하기 때문에 이 경로를 인식할 수 있도록 추가적인 설정이 필요하다.&lt;br&gt;다음은 VSCode에서 Yarn Berry와 호환이 되는 개발환경을 구성하는 방법이다.  &lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h1&gt;Yarn Berry에 필요한 익스텐션과 VSCode 설정&lt;/h1&gt;
&lt;p&gt;VSCode에서 @types를 제대로 불러오려면 ZipFS, @yarnpkg/sdks를 설치해야 한다.&lt;/p&gt;
&lt;h4&gt;1. ZipFS - a zip file system&lt;/h4&gt;
&lt;p&gt;Yarn berry는 &lt;code&gt;zip&lt;/code&gt;파일로 의존성을 관리하기 때문에 필요하다.&lt;br&gt;ZipFS는 VSCode가 zip파일을 읽기 가능하게 만드는 확장 프로그램이며 Yarn의 메인테이너인 Maël Nison이 작성했다.&lt;br&gt;Extensions에서 ZipFS를 검색해서 추가한다.&lt;br&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DNybB/btsFFW5vaeb/HvCNbdy8i5y6L4CHevixY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DNybB/btsFFW5vaeb/HvCNbdy8i5y6L4CHevixY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DNybB/btsFFW5vaeb/HvCNbdy8i5y6L4CHevixY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDNybB%2FbtsFFW5vaeb%2FHvCNbdy8i5y6L4CHevixY1%2Fimg.png&quot; width=&quot;100%&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h4&gt;2. @yarnpkg/sdks 설치&lt;/h4&gt;
&lt;p&gt;아래 명령어를 실행하면 vscode 설정값들이 자동으로 생성된다.  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;yarn dlx @yarnpkg/sdks vscode&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;실행이 끝나면 프로젝트 루트에 &lt;code&gt;.vscode&lt;/code&gt;디렉터리가 만들어지고 아래와 같이 &lt;code&gt;extensions.json&lt;/code&gt;, &lt;code&gt;settings.json&lt;/code&gt;파일이 생성된다.  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;// extensions.json
{
  &amp;quot;recommendations&amp;quot;: [
    &amp;quot;arcanis.vscode-zipfs&amp;quot;,
    &amp;quot;dbaeumer.vscode-eslint&amp;quot;,
    &amp;quot;esbenp.prettier-vscode&amp;quot;
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;// settings.json
{
  &amp;quot;search.exclude&amp;quot;: {
    &amp;quot;**/.yarn&amp;quot;: true,
    &amp;quot;**/.pnp.*&amp;quot;: true
  },
  &amp;quot;eslint.nodePath&amp;quot;: &amp;quot;.yarn/sdks&amp;quot;,
  &amp;quot;prettier.prettierPath&amp;quot;: &amp;quot;.yarn/sdks/prettier/index.cjs&amp;quot;,
  &amp;quot;typescript.tsdk&amp;quot;: &amp;quot;.yarn/sdks/typescript/lib&amp;quot;,
  &amp;quot;typescript.enablePromptUseWorkspaceTsdk&amp;quot;: true
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. VSCode 재시작&lt;/h4&gt;
&lt;p&gt;설치가 완료되고 나서도 오류가 해결되지 않았다면 VSCode를 재시작한다.  &lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Microsoft/TypeScript/issues/31226#issuecomment-766293214&quot;&gt;https://github.com/Microsoft/TypeScript/issues/31226#issuecomment-766293214&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.dramancompany.com/2023/02/%EB%A6%AC%EB%A9%A4%EB%B2%84-%EC%9B%B9-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%A2%8C%EC%B6%A9%EC%9A%B0%EB%8F%8C-yarn-berry-%EB%8F%84%EC%9E%85%EA%B8%B0&quot;&gt;리멤버 웹 서비스 좌충우돌 Yarn Berry 도입기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jihyundev.tistory.com/24&quot;&gt;node_modules로부터의 해방, yarn berry를 사용해보자&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/Error</category>
      <category>error</category>
      <category>jest</category>
      <category>VSCode</category>
      <category>yarn berry</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/175</guid>
      <comments>https://iksflow.tistory.com/175#entry175comment</comments>
      <pubDate>Mon, 11 Mar 2024 18:12:39 +0900</pubDate>
    </item>
    <item>
      <title>Yarn V1에서 V4로 마이그레이션하는 방법</title>
      <link>https://iksflow.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Yarn V1에서 의존성을 추가하면 CommonJS, ESM 모듈 간 충돌하는 이슈가 지속적으로 발생해서 Yarn V4로 마이그레이션 하는 작업을 진행하였다.&lt;br /&gt;본 글에서는 Yarn Classic이라고 부르는 V1에서 Yarn Berry(Yarn V2+을 지칭하는 명칭)로 마이그레이션 하는 방법에 대해 알아본다.&lt;/p&gt;
&lt;h1&gt;1. Yarn 버전 확인&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;yarn -v&lt;/code&gt; 를 입력해서 현재 yarn 버전을 확인한다.&lt;br /&gt;명령어를 실행하니 1.22.22 버전이 설치되어 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ yarn -v  
1.22.22
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;2. Node 버전 확인&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Yarn Berry로 업그레이드하기 위해서는 &lt;b&gt;Node.js 18 버전 이상&lt;/b&gt;이 설치되어있어야 한다.&lt;br /&gt;&lt;code&gt;node -v&lt;/code&gt; 명령어로 버전을 확인해 보니 20.10.0 버전이 설치되어 있다.&lt;br /&gt;만약 18 버전보다 낮다면 18+ 버전을 설치한다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;$ node -v
v20.10.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;3. Corepack 활성화&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 입력해 corepack을 활성화한다.&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ corepack enable&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;4. Yarn Berry 버전으로 설정&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 &lt;b&gt;프로젝트 루트로 이동&lt;/b&gt;해 아래 명령어를 실행한다.&lt;br /&gt;그리고 &lt;code&gt;yarn -v&lt;/code&gt;를 입력해 버전을 확인하면 &lt;code&gt;4.1.1&lt;/code&gt;로 적용된 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;$ yarn set version berry
$ yarn -v
4.1.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;5. Yarn Classic 설정파일 마이그레이션&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;.npmrc&lt;/code&gt;, &lt;code&gt;.yarnrc&lt;/code&gt; 파일이 없다면 넘어가면 된다.&lt;br /&gt;&lt;b&gt;Yarn Berry(V2+)&lt;/b&gt;에서는 설정 파일로 &lt;code&gt;.yarnrc.yml&lt;/code&gt;를 사용한다.&lt;br /&gt;기존에 &lt;b&gt;Yarn Classic(V1)&lt;/b&gt;에서 사용하던 &lt;b&gt;.npmrc와 .yarnrc 파일의 내용을 .yarnrc.yml에 옮긴다.&lt;/b&gt;&lt;br /&gt;포맷이 조금 변경되었다고 하니 자세한 내용은 &lt;a href=&quot;https://yarnpkg.com/configuration/yarnrc&quot;&gt;Yarn Configuration&lt;/a&gt; 문서를 참고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;6. Yarn 의존성 재설치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;yarn install&lt;/code&gt; 명령어로 의존성을 다시 설치하고 마이그레이션을 마무리한다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;$ yarn install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h1&gt;참고자료&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://yarnpkg.com/migration/guide&quot;&gt;Yarn from V1 to V4 마이그레이션 가이드 - Yarn 공식문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yarnpkg.com/configuration/yarnrc&quot;&gt;Yarn Configuration 가이드 - Yarn 공식문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/Tools</category>
      <category>1.22.22</category>
      <category>Berry</category>
      <category>yarn</category>
      <category>yarn berry</category>
      <category>Yarn Classic</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/174</guid>
      <comments>https://iksflow.tistory.com/174#entry174comment</comments>
      <pubDate>Mon, 11 Mar 2024 14:22:49 +0900</pubDate>
    </item>
    <item>
      <title>[오류해결] ESLint 'test' is not defined. no-undef</title>
      <link>https://iksflow.tistory.com/173</link>
      <description>&lt;h2&gt;오류 발생&lt;/h2&gt;
&lt;p&gt;테스트코드를 작성했는데 VSCode에서 아래의 오류 상세처럼 &lt;code&gt;&amp;#39;test&amp;#39; is not defined.&lt;/code&gt;라는 eslint의 no-undef유형의 오류가 발생했다.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;오류 상세&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp6CbX/btsFGLuKBUH/fKzfxphWJb0AjrcJTq0W3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp6CbX/btsFGLuKBUH/fKzfxphWJb0AjrcJTq0W3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp6CbX/btsFGLuKBUH/fKzfxphWJb0AjrcJTq0W3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp6CbX%2FbtsFGLuKBUH%2FfKzfxphWJb0AjrcJTq0W3K%2Fimg.png&quot; width=&quot;100%&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;ESLint의 설정 파일에 Jest와 관련된 설정들이 추가되어있지 않아서 발생한 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.eslintrc.cjs&lt;/code&gt;파일에 다음과 같이 &lt;code&gt;&amp;quot;jest/globals&amp;quot;&lt;/code&gt;설정 값을 추가하면 오류메시지가 더 이상 나타나지 않는다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;module.exports = {
  ...생략...
  env: {
    ...,
    &amp;quot;jest/globals&amp;quot;: true,
  },
  ...생략...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/55807824/describe-is-not-defined-when-installing-jest&quot;&gt;https://stackoverflow.com/questions/55807824/describe-is-not-defined-when-installing-jest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/Error</category>
      <category>error</category>
      <category>eslint</category>
      <category>jest</category>
      <category>VSCode</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/173</guid>
      <comments>https://iksflow.tistory.com/173#entry173comment</comments>
      <pubDate>Mon, 11 Mar 2024 12:27:00 +0900</pubDate>
    </item>
    <item>
      <title>[오류해결] Error [ERR_REQUIRE_ESM]: require() of ES Module ~ node_modules/cliui/build/index.cjs not supported.</title>
      <link>https://iksflow.tistory.com/172</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 발생&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;yarn test&lt;/code&gt; 명령어로 테스트 코드를 실행하려는데 아래와 같이 오류가 발생했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;yarn v1.22.21&lt;/li&gt;
&lt;li&gt;node 20.10.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오류 상세&lt;/h2&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;yarn test
yarn run v1.22.21
$ jest
Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/iksflow/${PROJECT_ROOT}/node_modules/string-width/index.js from /Users/iksflow/${PROJECT_ROOT}/node_modules/cliui/build/index.cjs not supported.
Instead change the require of index.js in /Users/iksflow/${PROJECT_ROOT}/node_modules/cliui/build/index.cjs to a dynamic import() which is available in all CommonJS modules.
    at Object.&amp;lt;anonymous&amp;gt; (/Users/iksflow/${PROJECT_ROOT}/node_modules/cliui/build/index.cjs:291:21)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원인 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경의 의존성 관리 도구인 Yarn V1으로 설치된 의존성이 CommonJS의 import 문법인 require를 사용하고 있는데 이를 ESM형태로 인식하지 못해 발생하는 것으로 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보니 Jest의 문제가 아니라 Yarn Classic(V1)에서 발생하는 오류라고한다.&lt;br /&gt;Yarn Berry(V2+) 버전으로 업그레이드하면 오류를 해결할 수 있다.&lt;br /&gt;&lt;a href=&quot;https://iksflow.tistory.com/174&quot;&gt;Yarn Berry로 마이그레이션 하는 방법&lt;/a&gt; 포스트를 참고해서 Yarn 버전을 업그레이드하면 오류가 더 이상 발생하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;!참고!&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;yarn.lock 파일을 삭제하고 yarn install을 실행하는 방법&lt;/b&gt;으로도 해결이 가능하다.&lt;br /&gt;하지만 이 방법은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;의존성에 변경이 생길 때마다 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Error [ERR_REQUIRE_ESM]&lt;/b&gt;&amp;nbsp;오류가 다시 발생&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;한다.&lt;br /&gt;따라서 재발을 방지하는 방법인 Yarn 버전 마이그레이션을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고 자료&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yarnpkg/yarn/issues/8994#issuecomment-1870052819&quot;&gt;https://github.com/yarnpkg/yarn/issues/8994#issuecomment-1870052819&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jestjs/jest/issues/14881&quot;&gt;https://github.com/jestjs/jest/issues/14881&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/Error</category>
      <category>error</category>
      <category>ERR_REQUIRE_ESM</category>
      <category>jest</category>
      <category>yarn</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/172</guid>
      <comments>https://iksflow.tistory.com/172#entry172comment</comments>
      <pubDate>Mon, 11 Mar 2024 11:40:26 +0900</pubDate>
    </item>
    <item>
      <title>[오류해결] 'React' refers to a UMD global, but the current file is a module. Consider adding an import instead.</title>
      <link>https://iksflow.tistory.com/171</link>
      <description>&lt;h2&gt;오류 발생&lt;/h2&gt;
&lt;p&gt;VSCode에서 Typecript + React 환경으로 개발을 하던 중 에디터에 React 컴포넌트에 붉은줄이 마구 생기면서 아래와 같은 오류가 발생했다.&lt;br&gt;딱히 건드린 코드가 없는데 갑자기 발생한 오류라 당황스러웠다.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;오류 상세&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;#39;React&amp;#39; refers to a UMD global, but the current file is a module. Consider adding an import instead.  &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;React 16에서 React 17로 넘어가면서 &lt;a href=&quot;https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html&quot;&gt;JSX Transformation&lt;/a&gt; 방식이 변했는데 이로 인해 발생하는 문제라고 한다.&lt;/p&gt;
&lt;p&gt;React 17에서 Transformation과 관련해 변경된 부분은 2가지이다.&lt;br&gt;첫 번째는 기존에는 React 컴포넌트 코드에 &lt;code&gt;import React from &amp;#39;react&amp;#39;;&lt;/code&gt; 라는 코드를 항상 입력해주어야 했는데 이 부분이 사라졌다.&lt;br&gt;두 번째는 React JSX Transformation 코드가 변경되었다.&lt;br&gt;아래와 같은 코드는 브라우저가 인식을 못하기 때문에 자바스크립트 코드로 변환을 해주어야한다.&lt;br&gt;변환 작업은 &lt;code&gt;Babel, Typescript&lt;/code&gt; 와 같은 도구로 브라우저가 인식 가능한 Javascript 코드로 변경하는것을 의미한다.&lt;br&gt;참고로 React 공식 문서에서 소개하는 React 16과 React 17의 차이는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;React 16의 변환 방식&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 개발자가 작성하는 React 코드
import React from &amp;#39;react&amp;#39;;

function App() {
  return React.createElement(&amp;#39;h1&amp;#39;, null, &amp;#39;Hello world&amp;#39;);
}
------------------------------------
// React 16 jsx 코드를 Javascript로 변환
import React from &amp;#39;react&amp;#39;;

function App() {
  return React.createElement(&amp;#39;h1&amp;#39;, null, &amp;#39;Hello world&amp;#39;);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;React 17의 변환 방식&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 개발자가 작성하는 React 코드
function App() {
  return &amp;lt;h1&amp;gt;Hello world&amp;lt;/h1&amp;gt;;
}
------------------------------------
// React 17 jsx 코드를 Javascript로 변환
// Inserted by a compiler (don&amp;#39;t import it yourself!)
import {jsx as _jsx} from &amp;#39;react/jsx-runtime&amp;#39;;

function App() {
  return _jsx(&amp;#39;h1&amp;#39;, { children: &amp;#39;Hello world&amp;#39; });
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;p&gt;해결 방법은 3가지를 시도해보면 된다!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;첫 번째는 tsconfig.json 파일을 수정하는 것이다.&lt;/strong&gt;&lt;br&gt;검색을 해보니 tsconfig.json 파일에 아래와 같이 옵션을 추가하면 해결이 된다고 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// tsconfig.json
{
  &amp;quot;compilerOptions&amp;quot;: {
    ...
    &amp;quot;jsx&amp;quot;: &amp;quot;react-jsx&amp;quot;
    ...
  },
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;두 번째는 VSCode사용자에게 해당하는 내용이다.&lt;/strong&gt;&lt;br&gt;위의 내용대로 tsconfig.json을 수정했는데도 해결이 되지 않거나 이미 tsconfig.json 에 해당 내용이 적용된 경우임에도 오류가 발생할 수 있다.&lt;br&gt;이런 경우에는 VSCode를 껐다가 다시 시작해주면 해결이 된다.&lt;br&gt;21년도 부터 보고가된 꽤 오래된 이슈임에도 24년 3월에도 여전히 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;세 번째는 VSCode 파일 이름 변경으로 인해 발생한 경우이다.&lt;/strong&gt;&lt;br&gt;VSCode를 껐다 켰는데도 오류가 사라지지 않는 경우가 있다.&lt;br&gt;VSCode의 버그로 보이는데 파일명을 변경했음에도 변경 전 파일 이름을 바라보고 있어서 &lt;code&gt;&amp;#39;React&amp;#39; refers to a UMD global~&lt;/code&gt; 오류를 내뱉는 상황이 발생한다.&lt;br&gt;말로 설명이 부족할 것 같아 예시로 아래 이미지를 첨부했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mwhnc/btsFJIdisZk/x8tocym6QTvMrYjNSLzQA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mwhnc/btsFJIdisZk/x8tocym6QTvMrYjNSLzQA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mwhnc/btsFJIdisZk/x8tocym6QTvMrYjNSLzQA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMwhnc%2FbtsFJIdisZk%2Fx8tocym6QTvMrYjNSLzQA0%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;1752&quot; height=&quot;474&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;변경한 파일의 이름은 아래와 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;변경 전 파일 이름: LocationSearchbar.tsx&lt;/li&gt;
&lt;li&gt;변경 후 파일 이름: LocationSearchBar.tsx&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하지만 이미지에서는 LocationSearchBar.tsx로 파일명을 변경했음에도 LocationSearchbar.tsx에서 오류가 발생했다고 알려준다.&lt;br&gt;이 오류를 해결하는 방법은 번거롭지만 &lt;strong&gt;아예 다른 이름으로 변경했다가 다시 원하는 이름으로 변경하는 것&lt;/strong&gt;이다.&lt;br&gt;예를 들면 LocationSearchBar.tsx를 다시 LocationSearchbar2.tsx로 이름을 변경하면 오류가 사라진다.&lt;br&gt;그리고 다시 LocationSearchBar.tsx로 변경하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/64656055/react-refers-to-a-umd-global-but-the-current-file-is-a-module&quot;&gt;https://stackoverflow.com/questions/64656055/react-refers-to-a-umd-global-but-the-current-file-is-a-module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-4-1-beta/#jsx-factories&quot;&gt;https://devblogs.microsoft.com/typescript/announcing-typescript-4-1-beta/#jsx-factories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/a/66674421&quot;&gt;https://stackoverflow.com/a/66674421&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/Error</category>
      <category>error</category>
      <category>react</category>
      <category>VSCode</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/171</guid>
      <comments>https://iksflow.tistory.com/171#entry171comment</comments>
      <pubDate>Sun, 10 Mar 2024 12:20:09 +0900</pubDate>
    </item>
    <item>
      <title>[오류해결] org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ~</title>
      <link>https://iksflow.tistory.com/170</link>
      <description>&lt;h2&gt;오류 발생&lt;/h2&gt;
&lt;p&gt;스프링부트에서 Author 라는 Entity와 AuthorRepository라는 Repository를 호출하는 코드를 실행했을 때 다음 오류가 발생했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;org.springframework.beans.factory.UnsatisfiedDependencyException&lt;/li&gt;
&lt;li&gt;Caused by: org.springframework.beans.factory.BeanCreationException&lt;/li&gt;
&lt;li&gt;Caused by: java.lang.IllegalArgumentException&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;오류 상세&lt;/h2&gt;
&lt;p&gt;보다 자세한 오류 내용은 다음과 같다.&lt;br&gt;3단계에 걸쳐 실제 호출해서 오류가 발생한 지점부터 근원지까지의 오류 발생 내용이 기록되어있다.&lt;br&gt;오류 내용을 제외한 나머지 내용은 길어서 생략했다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;2024-03-05T09:06:06.761+09:00 ERROR 44688 --- [main] o.s.boot.SpringApplication: Application run failed

# 1번 에러
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &amp;#39;bootstrapData&amp;#39; defined in file [/Users/iksflow/$$$$$]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name &amp;#39;authorRepository&amp;#39; defined in com.example.repositories.AuthorRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Not a managed type: class com.example.domain.Author
........생략........

# 2번 에러
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name &amp;#39;authorRepository&amp;#39; defined in com.example.repositories.AuthorRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Not a managed type: class com.example.domain.Author
........생략........

# 3번 에러
Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.example.domain.Author
    at org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl.managedType(JpaMetamodelImpl.java:181) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
........생략........
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;1번 에러&lt;/code&gt;는 스프링부트 애플리케이션 실행에 실패했다는 내용이다.&lt;br&gt;오류의 결과에 해당하는 부분으로 원인을 분석하려면 &lt;code&gt;2번 에러&lt;/code&gt;, &lt;code&gt;3번 에러&lt;/code&gt;를 확인해보면 찾을 수 있다.  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;2번 에러&lt;/code&gt;는 Bean 생성에 실패했다고 알려준다. 실패한 이유는 authorRespository에 정의한 Author라는 클래스가 Managed Type이 아니기 때문이다.&lt;br&gt;&lt;code&gt;3번 에러&lt;/code&gt;는 Author 클래스가 Managed Type이 아니라고 한다.&lt;br&gt;정리하자면 이 모든 일이 Author 클래스가 Managed Type이 아니기 때문에 발생한 것이다.  &lt;/p&gt;
&lt;p&gt;문제의 원인인 Author 클래스는 아래와 같이 작성된 상태였다.  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;

    @ManyToMany(mappedBy = &amp;quot;authors&amp;quot;)
    private Set&amp;lt;Book&amp;gt; books = new HashSet&amp;lt;&amp;gt;();
    ... 생략 ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그렇다. &lt;code&gt;3번 오류&lt;/code&gt;는 Author 클래스에 &lt;code&gt;@Entity&lt;/code&gt; 애너테이션을 빠뜨려서 벌어진 일이다.  &lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;p&gt;Author 클래스에 &lt;code&gt;@Entity&lt;/code&gt; 애너테이션을 추가하면 Managed Type으로 인식해 정상적으로 동작한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;@Entity
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;

    @ManyToMany(mappedBy = &amp;quot;authors&amp;quot;)
    private Set&amp;lt;Book&amp;gt; books = new HashSet&amp;lt;&amp;gt;();
    ... 생략 ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;p&gt;-&lt;/p&gt;</description>
      <category>Backend/Error</category>
      <category>java</category>
      <category>JPA</category>
      <category>Spring</category>
      <category>springboot</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/170</guid>
      <comments>https://iksflow.tistory.com/170#entry170comment</comments>
      <pubDate>Tue, 5 Mar 2024 09:43:58 +0900</pubDate>
    </item>
    <item>
      <title>[오류해결] Jest encountered an unexpected token</title>
      <link>https://iksflow.tistory.com/169</link>
      <description>&lt;h2&gt;오류 발생&lt;/h2&gt;
&lt;p&gt;Typescript와 Jest로 작성한 테스트코드를 실행했더니 &lt;code&gt;Jest encountered an unexpected token&lt;/code&gt; 라는 오류가 발생했다.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;오류 상세&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm test

&amp;gt; test
&amp;gt; jest

 FAIL  app/components/example/Button.test.tsx
  ● Test suite failed to run

    Jest encountered an unexpected token

    Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.

    Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.

    By default &amp;quot;node_modules&amp;quot; folder is ignored by transformers.

    Here&amp;#39;s what you can do:
     • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.
     • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript
     • To have some of your &amp;quot;node_modules&amp;quot; files transformed, you can specify a custom &amp;quot;transformIgnorePatterns&amp;quot; in your config.
     • If you need a custom transformation specify a &amp;quot;transform&amp;quot; option in your config.
     • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the &amp;quot;moduleNameMapper&amp;quot; config option.

    You&amp;#39;ll find more details and examples of these config options in the docs:
    https://jestjs.io/docs/configuration
    For information about custom transformations, see:
    https://jestjs.io/docs/code-transformation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;Jest에서 Typescript로 작성된 코드를 해석할 수 없어서 발생한 오류이다.  &lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;p&gt;Jest 공식문서에서는 &lt;code&gt;babel&lt;/code&gt;을 활용한 방법과 &lt;code&gt;ts-jest&lt;/code&gt;를 활용한 방법 2가지 해결 방법을 찾을 수 있었다.&lt;br&gt;두가지 방법의 차이는 타입 체킹 여부이다.&lt;br&gt;&lt;code&gt;babel&lt;/code&gt;은 순수하게 &lt;code&gt;transpiling&lt;/code&gt;만을 지원하기 때문에 타입 체킹의 이점을 누릴 수 없다.&lt;br&gt;반면 &lt;code&gt;ts-jest&lt;/code&gt; 에서는 온전히 Typescript의 혜택을 누릴 수 있었다.&lt;br&gt;나는 타입체킹을 지원하는 &lt;code&gt;ts-jest&lt;/code&gt;를 선택했다.&lt;br&gt;ts-jest를 사용하는 방법은 아래와 같이 의존성 추가 후 설정 파일을 변경하면 된다.&lt;br&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h3&gt;1. ts-jest 의존성 추가&lt;/h3&gt;
&lt;p&gt;아래 명령어를 입력해 ts-jest를 추가한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm i --save-dev ts-jest&lt;/code&gt;&lt;/pre&gt;
&lt;br/&gt;

&lt;h3&gt;2. jest.config.ts 수정&lt;/h3&gt;
&lt;p&gt;아래와 같이 &lt;code&gt;jest.config.ts&lt;/code&gt; 파일에  &lt;code&gt;preset: &amp;quot;ts-jest&amp;quot;&lt;/code&gt; 옵션을 추가한다.  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;import type { Config } from &amp;quot;jest&amp;quot;;

const config: Config = {
  ... 다른 옵션 생략 ...
  preset: &amp;quot;ts-jest&amp;quot;,
};
export default config;&lt;/code&gt;&lt;/pre&gt;
&lt;br/&gt;

&lt;h3&gt;3. 적용&lt;/h3&gt;
&lt;p&gt;테스트를 실행하면 정상적으로 동작하는것을 확인할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm test

&amp;gt; test
&amp;gt; jest

 PASS  app/components/example/Button.test.tsx
  ✓ when the Button is clicked, then background color changes red to blue (44 ms)

------------|---------|----------|---------|---------|-------------------
File        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------|---------|----------|---------|---------|-------------------
All files   |     100 |      100 |     100 |     100 |                   
 Button.tsx |     100 |      100 |     100 |     100 |                   
------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.848 s
Ran all test suites.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jestjs.io/docs/getting-started#via-ts-jest&quot;&gt;Typescript로 Jest 시작하기 - Jest 공식문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kulshekhar.github.io/ts-jest/docs/getting-started/installation/#jest-config-file&quot;&gt;ts-jest 설정 - ts-jest 공식문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/Error</category>
      <category>error</category>
      <category>jest</category>
      <category>ts-jest</category>
      <author>Iksflow</author>
      <guid isPermaLink="true">https://iksflow.tistory.com/169</guid>
      <comments>https://iksflow.tistory.com/169#entry169comment</comments>
      <pubDate>Mon, 4 Mar 2024 11:00:06 +0900</pubDate>
    </item>
  </channel>
</rss>