<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>crypto_yurright.log</title>
        <link>https://velog.io/</link>
        <description>블록체인 개발자 - 개발 정보 기록 및 공유</description>
        <lastBuildDate>Sat, 02 Mar 2024 12:40:06 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. crypto_yurright.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/crypto_jang" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[AxiosError {message: 'Request failed with status code 400', name: 'AxiosError', code: 'ERR_BAD_REQUEST' 트러블슈팅]]></title>
            <link>https://velog.io/@crypto_jang/AxiosErrormessage-Request-failed-with-status-code-400-name-AxiosError-code-ERRBADREQUEST-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</link>
            <guid>https://velog.io/@crypto_jang/AxiosErrormessage-Request-failed-with-status-code-400-name-AxiosError-code-ERRBADREQUEST-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</guid>
            <pubDate>Sat, 02 Mar 2024 12:40:06 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/crypto_jang/post/4f0d3752-bf43-43a4-9b69-d033c910ec5e/image.png" alt=""></p>
<p>MinuteCandle.jsx:14 Uncaught (in promise) AxiosError {message: &#39;Request failed with status code 400&#39;, name: &#39;AxiosError&#39;, code: &#39;ERR_BAD_REQUEST&#39;, config: {…}, request: XMLHttpRequest, …}code: &quot;ERR_BAD_REQUEST&quot;config: {transitional: {…}, adapter: Array(2), transformRequest: Array(1), transformResponse: Array(1), timeout: 0, …}message: &quot;Request failed with status code 400&quot;name: &quot;AxiosError&quot;request: XMLHttpRequest {onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, …}response: config: {transitional: {…}, adapter: Array(2), transformRequest: Array(1), transformResponse: Array(1), timeout: 0, …}data: error: {name: 400, message: &#39;Missing request parameter error. Check the required parameters!&#39;}[[Prototype]]: Objectheaders: AxiosHeaders {cache-control: &#39;no-cache, no-store, max-age=0, must-revalidate&#39;, content-type: &#39;application/json; charset=utf-8&#39;, expires: &#39;0&#39;, pragma: &#39;no-cache&#39;}request: XMLHttpRequest {onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, …}status: 400statusText: &quot;&quot;[[Prototype]]: Objectstack: &quot;AxiosError: Request failed with status code 400\n    at settle (<a href="http://localhost:3001/main.da0a1744dd95d793ed15.hot-update.js:1603:12)%5Cn">http://localhost:3001/main.da0a1744dd95d793ed15.hot-update.js:1603:12)\n</a>    at XMLHttpRequest.onloadend (<a href="http://localhost:3001/main.da0a1744dd95d793ed15.hot-update.js:277:66)%5Cn">http://localhost:3001/main.da0a1744dd95d793ed15.hot-update.js:277:66)\n</a>    at Axios.request (<a href="http://localhost:3001/main.da0a1744dd95d793ed15.hot-update.js:773:41)%5Cn">http://localhost:3001/main.da0a1744dd95d793ed15.hot-update.js:773:41)\n</a>    at async getMinuteCandle (<a href="http://localhost:3001/main.da0a1744dd95d793ed15.hot-update.js:33:22)&quot;%5B%5BPrototype%5D%5D">http://localhost:3001/main.da0a1744dd95d793ed15.hot-update.js:33:22)&quot;[[Prototype]]</a>: Error
getMinuteCandle @ MinuteCandle.jsx:14
await in getMinuteCandle (async)
(anonymous) @ MinuteCandle.jsx:17
commitHookEffectListMount @ react-dom.development.js:23123
invokePassiveEffectMountInDEV @ react-dom.development.js:25129
invokeEffectsInDev @ react-dom.development.js:27323
commitDoubleInvokeEffectsInDEV @ react-dom.development.js:27302
flushPassiveEffectsImpl @ react-dom.development.js:27029
flushPassiveEffects @ react-dom.development.js:26956
commitRootImpl @ react-dom.development.js:26911
commitRoot @ react-dom.development.js:26656
performSyncWorkOnRoot @ react-dom.development.js:26091
flushSyncCallbacks @ react-dom.development.js:12017
flushSync @ react-dom.development.js:26176
scheduleRefresh @ react-dom.development.js:27769
renderer.scheduleRefresh @ renderer.js:592
(anonymous) @ react-refresh-runtime.development.js:275
performReactRefresh @ react-refresh-runtime.development.js:264
(anonymous) @ RefreshUtils.js:78
setTimeout (async)
enqueueUpdate @ RefreshUtils.js:76
executeRuntime @ RefreshUtils.js:225
$ReactRefreshModuleRuntime$ @ MinuteCandle.jsx:23
./src/components/MinuteCandle.jsx @ MinuteCandle.jsx:23
options.factory @ CancelToken.js:117
<strong>webpack_require</strong> @ global-this.js:4
_requireSelf @ xhr.js:191
apply @ AxiosHeaders.js:156
(anonymous) @ CancelToken.js:54
internalApply @ CancelToken.js:51
(anonymous) @ axios.js:84
waitForBlockingPromises @ axios.js:35
(anonymous) @ axios.js:80
Promise.then (async)
(anonymous) @ axios.js:78
Promise.then (async)
(anonymous) @ axios.js:57
Promise.then (async)
hotCheck @ axios.js:47
check @ stripAnsi.js:18
(anonymous) @ dev-server.js:39
emit @ events.js:122
reloadApp @ reloadApp.js:16
warnings @ index.js:252
(anonymous) @ socket.js:40
client.onmessage @ WebSocketClient.js:23
Show 1 more frame
Show less</p>
<p>axios 400 에러가 났다. </p>
<pre><code>{name: 400, message: &#39;Missing request parameter error. Check the required parameters!&#39;}</code></pre><p>이 부분을 보니, 입력해야 하는 파라미터가 추가로 있나보다.</p>
<p>코드를 살펴보면</p>
<pre><code class="language-javascript">//MinuteCandle.jsx
import axios from &quot;axios&quot;;
import { useEffect } from &quot;react&quot;;

const MinuteCandle = () =&gt; {
  const getMinuteCandle = async () =&gt; {
    const response = await axios.get(
      `https://api.upbit.com/v1/candles/minutes/${1}`
    );
    console.log(response);
  };

  useEffect(() =&gt; {
    getMinuteCandle();
  }, []);

  return &lt;div&gt;minute candle!&lt;/div&gt;;
};

export default MinuteCandle;</code></pre>
<p><img src="https://velog.velcdn.com/images/crypto_jang/post/e0d48262-1033-4786-b917-a89bc2aaeb2f/image.png" alt="">
업비트 분(Minute) 캔들 문서를 보니,
request parameters 이 부분 같다.</p>
<p><img src="https://velog.velcdn.com/images/crypto_jang/post/18a0323f-e813-4956-934d-f61b401d761c/image.png" alt=""></p>
<p>마켓 코드 조회 페이지를 보면, request parameter 없이 response가 있다. 이경우 추가로 입력하지 않아도 위에 적혀 있는 <a href="https://api.upbit.com/v1/market/all">https://api.upbit.com/v1/market/all</a>
만으로 결과를 얻을 수 있다.</p>
<p>하지만 분 캔들 문서는 다른 것이다. request parameter를 꼭 입력해줘야지만 response를 받을 수 있는 것이었다!</p>
<p>오른쪽에 나와있는 예시처럼</p>
<p>? 뒤에 parameter = 파라미터 값 &amp; parameter = 파라미터 값으로 필요한 두 개를 입력해주니 해결되었다. (to 파라미터는 비어있어도 된다고 하니, 비어놓고 해봄)</p>
<p>수정한 코드:</p>
<pre><code class="language-javascript">//MinuteCandle.jsx
import axios from &quot;axios&quot;;
import { useEffect } from &quot;react&quot;;

const MinuteCandle = () =&gt; {
  const getMinuteCandle = async () =&gt; {
    const response = await axios.get(
      `https://api.upbit.com/v1/candles/minutes/${1}?market=KRW-BTC&amp;count=1`
    );
    console.log(response);
  };

  useEffect(() =&gt; {
    getMinuteCandle();
  }, []);

  return &lt;div&gt;minute candle!&lt;/div&gt;;
};

export default MinuteCandle;</code></pre>
<p>업비트 원화마켓 비트코인의 1분봉 관련 수치가 들어온 것 확인할 수 있다. 각각의 값이 무엇을 의미하는지도 다음 글에서 정리해보도록 하겠다. 
<img src="https://velog.velcdn.com/images/crypto_jang/post/cfa93711-d98d-47fd-ba23-90ec91e2bd10/image.png" alt=""></p>
<p>response data도 제대로 들어온 것을 확인할 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Uncaught Error: Objects are not valid as a React child 에러 트러블슈팅]]></title>
            <link>https://velog.io/@crypto_jang/Uncaught-Error-Objects-are-not-valid-as-a-React-child-%EC%97%90%EB%9F%AC-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</link>
            <guid>https://velog.io/@crypto_jang/Uncaught-Error-Objects-are-not-valid-as-a-React-child-%EC%97%90%EB%9F%AC-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85</guid>
            <pubDate>Sat, 02 Mar 2024 12:14:46 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/crypto_jang/post/dfc06a15-ffd0-41b1-a9ff-c9ccdca10c77/image.png" alt=""></p>
<p>트러블슈팅 </p>
<p>코드 깃허브: <a href="https://github.com/yurright/upbit-study">https://github.com/yurright/upbit-study</a></p>
<p>react-dom.development.js:14860 Uncaught Error: Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
    at throwOnInvalidObjectType (react-dom.development.js:14860:1)
    at reconcileChildFibers (react-dom.development.js:15800:1)
    at reconcileChildren (react-dom.development.js:19143:1)
    at mountIndeterminateComponent (react-dom.development.js:20130:1)
    at beginWork (react-dom.development.js:21563:1)
    at beginWork$1 (react-dom.development.js:27400:1)
    at performUnitOfWork (react-dom.development.js:26532:1)
    at workLoopSync (react-dom.development.js:26439:1)
    at renderRootSync (react-dom.development.js:26407:1)
    at recoverFromConcurrentError (react-dom.development.js:25825:1)</p>
<p>return에 promise object가 직접 들어가서 이 에러가 발생했다. </p>
<p>코드를 보니 <strong>App.jsx</strong>에 컴포넌트로 MinuteCandle 컴포넌트가 문제였는데</p>
<pre><code class="language-javascript">   //App.jsx
    const App = () =&gt; {
  return (
    &lt;div className=&quot;bg-red-100&quot;&gt;
      &lt;div&gt;Hi upbit!&lt;/div&gt;
      &lt;div&gt;{/* &lt;MarketCode /&gt; */}&lt;/div&gt;
      &lt;div&gt;
        &lt;MinuteCandle /&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  );
};

export default App;</code></pre>
<p><strong>MinuteCandle.jsx</strong>에서 컴포넌트를 보니 왜인지 async 함수로 정의되어 있어서 리턴값이 프로미스로 들어오는 게 문제였다.</p>
<pre><code class="language-javascript">//MinuteCandle.jsx
const MinuteCandle = async () =&gt; {
  return &lt;div&gt;minute candle!&lt;/div&gt;;
};

export default MinuteCandle;</code></pre>
<p>MinuteCandle 컴포넌트에서 async를 빼주니 해결되었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[solidity] i++; i =+; i = i + i; 가스비 비교]]></title>
            <link>https://velog.io/@crypto_jang/solidity-i-i-i-i-i-%EA%B0%80%EC%8A%A4%EB%B9%84-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@crypto_jang/solidity-i-i-i-i-i-%EA%B0%80%EC%8A%A4%EB%B9%84-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Sat, 30 Dec 2023 13:29:06 GMT</pubDate>
            <description><![CDATA[<p>i++ &lt; i+= &lt; i = i + 1 
가스비 비싼 순서</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[solidity] string 비교하는 방법]]></title>
            <link>https://velog.io/@crypto_jang/solidity-%EC%8A%A4%ED%8A%B8%EB%A7%81-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@crypto_jang/solidity-%EC%8A%A4%ED%8A%B8%EB%A7%81-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Sat, 30 Dec 2023 11:49:55 GMT</pubDate>
            <description><![CDATA[<p>스트링 비교해야 할때 해시함수 돌려서 확인한다.</p>
<blockquote>
<p>TypeError: Built-in binary operator == cannot be applied to types string memory and literal_string&quot;abc&quot;.</p>
</blockquote>
<p>솔리디티 코드를 작성하다보면, 두 스트링 값이 같은지 확인해야 할 때가 있다.</p>
<pre><code class="language-solidity">
   function getString(string memory _s) public pure returns(bool) {
       if ( _s == &quot;abc&quot;) {
           return true;
       } else {
           return false;
       }
   }</code></pre>
<p>그러나, 스트링 비교 코드를 작성하면, 타입에러가 발생해 난처할 것이다. </p>
<p>솔리디티는 스트링 비교 시, 해시함수를 돌려 일치여부를 확인해야 한다.</p>
<pre><code class="language-solidity">function stringComp(string memory _s) public pure returns(bool) {
       if(keccak256(bytes(_s)) == keccak256(bytes(&quot;abc&quot;))) {
           return true;
       } else {
           return false;
       }
   }</code></pre>
<p>같은 스트링 해시하면 같은 값 나온다는 것 활용해서 같은지 판단!!!</p>
<hr>
<p><a href="https://velog.io/@crypto_jang/solidity-require-%ED%95%A8%EC%88%98-%EC%8B%A4%ED%96%89-%EC%A1%B0%EA%B1%B4-%EC%84%A4%EC%A0%95">require 이용해 가스비 최적화</a></p>
<pre><code class="language-solidity">function stringComp_eff(string memory _s) public pure returns(bool) {


       require(bytes(_s).length ==bytes(&quot;abc&quot;).length, &quot;No&quot;);


       if(keccak256(bytes(_s)) == keccak256(bytes(&quot;abc&quot;))) {
           return true;
       } else {
           return false;
       }
   }</code></pre>
<hr>
<p>함께 참고할 만한 글</p>
<ul>
<li><a href="https://velog.io/@crypto_jang/solidity-keccak256">keccak256</a></li>
<li><a href="https://velog.io/@crypto_jang/solidity-bytes-string-%ED%98%95-%EB%B3%80%ED%99%98">bytes &lt;-&gt; string 형 변환</a></li>
<li><a href="https://velog.io/@crypto_jang/solidity-abi.encodePacked">abi.encodePacked</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[solidity] 가스비 최적화]]></title>
            <link>https://velog.io/@crypto_jang/%EA%B0%80%EC%8A%A4%EB%B9%84-%EC%B5%9C%EC%A0%81%ED%99%94</link>
            <guid>https://velog.io/@crypto_jang/%EA%B0%80%EC%8A%A4%EB%B9%84-%EC%B5%9C%EC%A0%81%ED%99%94</guid>
            <pubDate>Sat, 30 Dec 2023 11:42:02 GMT</pubDate>
            <description><![CDATA[<p> 바로<a href="https://velog.io/@crypto_jang/solidity-require-%ED%95%A8%EC%88%98-%EC%8B%A4%ED%96%89-%EC%A1%B0%EA%B1%B4-%EC%84%A4%EC%A0%95"> require</a> 떠올리기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[solidity] require : 가스비 최적화 위해 함수 실행 조건 설정]]></title>
            <link>https://velog.io/@crypto_jang/solidity-require-%ED%95%A8%EC%88%98-%EC%8B%A4%ED%96%89-%EC%A1%B0%EA%B1%B4-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@crypto_jang/solidity-require-%ED%95%A8%EC%88%98-%EC%8B%A4%ED%96%89-%EC%A1%B0%EA%B1%B4-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Sat, 30 Dec 2023 10:55:20 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="require는-솔리디티-함수를-실행하거나-실행하지-않을-조건을-설정할-때-사용한다">require는 솔리디티 함수를 실행하거나 실행하지 않을 조건을 설정할 때 사용한다.</h2>
</blockquote>
<hr>
<h3 id="등장배경"><strong>[등장배경]</strong></h3>
<ul>
<li><p>보통 조건문은 if를 사용하지만** if문은** 의미 없는 경우의 수까지 함수를 실행시켜 <strong>가스비가 의미 없이 소비되는 경우가 발생한다</strong>. </p>
</li>
<li><p><strong>솔리디티 코드</strong>를 작성할 때에는 <strong>가스비가 최소한으로 들도록 설계</strong>해야 한다.</p>
</li>
<li><p><strong>따라서, 특정 경우 아예 함수를 실행시키지 않도록 할 필요성이 존재하여 require 문이 탄생하게 되었다.</strong>  </p>
</li>
</ul>
<hr>
<h3 id="용법"><strong>[용법]</strong></h3>
<pre><code class="language-solidity">
function A() {
require([실행 조건], &quot;[false일 경우 띄울 메시지]&quot;);
rest of code;
}</code></pre>
<ul>
<li><strong>require문 실행 조건이 true 이면</strong> 함수가 실행된다. </li>
<li><strong>require문 조건이 false이면</strong> require가 위치한 함수 내의 위치에 상관없이(return 전에 존재하는 한 - [예시2] 참고) 함수를 실행하기 전의 상태로 되돌린다. 이때, <strong>가스비가 발생하는 transaction이 실행되지 않는다</strong>. </li>
</ul>
<hr>
<blockquote>
<h4 id="아래-예시-를-통해-require문이-가진-여러-특성을-살펴본다">&gt; 아래 [예시] 를 통해 require문이 가진 여러 특성을 살펴본다.</h4>
</blockquote>
<p><strong>[예시 1] : *<em>require 조건이 false이면, 상태를 변화시키지 않아 가스비가 발생하지 않는다. (에러 메시지 확인) 
*</em>[예시 2] : *<em>require 조건이 false이면, require문의 위치에 상관없이 전체 함수를 실행하기 전의 상태로 돌아간다. 
*</em>[예시3] :</strong> require문을 return 뒤에 쓰지 않도록 주의할 것
<strong>[예시4] :</strong> require문이 존재하는 경우, 함수 속의 함수도 실행되기 전으로 돌아간다.</p>
<hr>
<h3 id="예시-1-"><strong>[예시 1] :</strong></h3>
<blockquote>
<p>*<em>require 조건이 false이면, 상태를 변화시키지 않아 가스비가 발생하지 않는다. (에러 메시지 확인) *</em></p>
</blockquote>
<pre><code class="language-solidity">function require_2(uint _n) public returns(string memory) {


       require(_n &lt;= 10, &quot;_n should not be higher than 10. &quot;);


       a = _n;
       if(0 &lt;= a &amp;&amp; a &lt;= 2) {
           return &quot;A&quot;;
       } else if(3 &lt;= a &amp;&amp; a &lt;= 5) {
           return &quot;B&quot;;
       } else if(6 &lt;= a &amp;&amp; a &lt;= 8) {
           return &quot;c&quot;;
       } else {
           return &quot;D&quot;;
       }
   }</code></pre>
<ul>
<li><p><strong>[예시 1]</strong>의 코드에서, require_2(11)을 입력해 <strong>require 조건을 만족하지 않을 경우</strong>, 다음과 같은 에러 메시지가 등장한다:</p>
<blockquote>
<p>   &quot;the transation has been reverted to the initial state&quot;</p>
</blockquote>
<ul>
<li><strong>에러 메시지의 의미를 생각해보면</strong>, 원 상태로 복구되었다는 의미가 된다. 원 상태로 보구되었다는 의미는 곧 &quot;상태(변수)가 변하지 않았다&quot;가 되기 때문에 결국 *<em>가스비를 쓰지 않는 것이다. *</em></li>
</ul>
<hr>
</li>
</ul>
<h3 id="예시-2--">**[예시 2] : **</h3>
<blockquote>
<p>*<em>require 조건이 false이면, require문의 위치에 상관없이 전체 함수를 실행하기 전의 상태로 돌아간다. *</em></p>
</blockquote>
<pre><code class="language-solidity">     function require_3(uint _n) public returns(string memory) {
       a = _n;
       require(_n &lt;= 10, &quot;_n should not be higher than 10. &quot;);

       if(0 &lt;= a &amp;&amp; a &lt;= 2) {
           return &quot;A&quot;;
       } else if(3 &lt;= a &amp;&amp; a &lt;= 5) {
           return &quot;B&quot;;
       } else if(6 &lt;= a &amp;&amp; a &lt;= 8) {
           return &quot;c&quot;;
       } else {
           return &quot;D&quot;;
       }
   }


   function getA() public view returns(uint) {
       return a;
   }</code></pre>
<ul>
<li><p>위 코드를 보면, require문 전에 &#39;a = _n;&#39; 코드가 존재하는 것을 볼 수 있다. 이 경우, require문에 반하는 경우, a=_n;이 실행될까? 즉, require문은 require 문이 작성되기 전의 줄까지의 상태로 되돌리는 것일까? 아니면 function require_3()을 실행하기 전의 상태로 되돌리는 것일까? 실행해보면 결과를 통해 확인할 수 있다. </p>
</li>
<li><p>실행 결과, require 조건을 만족하지 않는 경우, a에 _n이 입력되지 않은 것을 볼 수 있다. (바로 전 줄로 돌아가서 a에 _n이 들어가는 게 아님!) </p>
</li>
<li><p><strong>즉, require문은 아예 함수를 누르기 전으로 되돌린다.</strong></p>
</li>
</ul>
<hr>
<h3 id="예시3-"><strong>[예시3] :</strong></h3>
<blockquote>
<p><strong>require문을 return 뒤에 쓰지 않도록 주의할 것</strong></p>
</blockquote>
<ul>
<li>** [require문이 return 전에 존재하는 경우]:**</li>
</ul>
<pre><code class="language-solidity">function require2_1() public pure returns(uint) {
       uint a = 1;
       bool b;


       require(b, &quot;go back&quot;);
       return a;
   }</code></pre>
<ul>
<li><p>a가 반환되지 않는다. 즉, require 조건에 걸려, uint a = 1;을 하기 전의 상태로 되돌아간다.</p>
</li>
<li><p>** [require문이 return 뒤에 존재하는 경우]:**</p>
</li>
</ul>
<pre><code class="language-solidity">function require2_2() public pure returns(uint) {
       uint a = 1;
       bool b;
       return a;
       require(b, &quot;go back&quot;);

   }</code></pre>
<ul>
<li>얘는 a = 1 나옴. require 까지 못 감
return 뒤에 쓰지 않도록 주의할 것</li>
</ul>
<hr>
<h3 id="예시4-"><strong>[예시4] :</strong></h3>
<blockquote>
<p><strong>require문이 존재하는 경우, 함수 속의 함수도 실행되기 전으로 돌아간다.</strong></p>
</blockquote>
<pre><code class="language-solidity">contract Require3 {
   uint a;


   function setAasFive() public {
       a = 5;
   }


   function getInput(uint _n) public {
       setAasFive();
       require(_n &gt;= 10, &quot;go back&quot;);
   }






   function getA() public view returns(uint) {
       return a;
   }
}
</code></pre>
<ul>
<li>getinput(7) 실행 시, require 조건이 false되어 getInput() 함수 내부에 있던 setAsFive() 함수조차 실행되기 전으로 돌아가 a가 0 으로 반환된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[solidity] uint <-> int 형 변환]]></title>
            <link>https://velog.io/@crypto_jang/solidity-uint-int</link>
            <guid>https://velog.io/@crypto_jang/solidity-uint-int</guid>
            <pubDate>Sat, 30 Dec 2023 10:27:07 GMT</pubDate>
            <description><![CDATA[<p>uint 에서 int 로 형 변환 안 됨</p>
<pre><code class="language-solidity"> function sub(int _a, int _b) public pure returns(int) { // uint에서 uint로 변환 안 됨
       return _a - _b;
   }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[오늘의 실수 solidity: 컨트랙트 재배포 시 주의사항]]></title>
            <link>https://velog.io/@crypto_jang/%EC%98%A4%EB%8A%98%EC%9D%98-%EC%8B%A4%EC%88%98-solidity-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8-%EC%9E%AC%EB%B0%B0%ED%8F%AC-%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD</link>
            <guid>https://velog.io/@crypto_jang/%EC%98%A4%EB%8A%98%EC%9D%98-%EC%8B%A4%EC%88%98-solidity-%EC%BB%A8%ED%8A%B8%EB%9E%99%ED%8A%B8-%EC%9E%AC%EB%B0%B0%ED%8F%AC-%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD</guid>
            <pubDate>Tue, 26 Dec 2023 14:05:26 GMT</pubDate>
            <description><![CDATA[<ol>
<li>remix 에서 스마트 컨트랙트를 재배포했다면,</li>
</ol>
<p>나의 코드에서 스마트 컨트랙트 주소를 다 바꾸는 것은 당연하고,</p>
<h1 id="abi-를-교체해주어야-한다스마트-컨트랙트-코드-수정한-경우텍스트">abi 를 교체해주어야 한다(스마트 컨트랙트 코드 수정한 경우!!)<strong>텍스트</strong></h1>
<ol start="2">
<li>컨트랙랙트트의  실실행 가능성은 injected metamask 세폴리아 사용하기 전에 상하이로 임시로 먼저 돌려보기! 세폴리아 다 써버림.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[remix 비쥬얼스튜디오코드(vsc)에 설치하기]]></title>
            <link>https://velog.io/@crypto_jang/remix-vsc%EC%97%90-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@crypto_jang/remix-vsc%EC%97%90-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 05 Dec 2023 01:13:06 GMT</pubDate>
            <description><![CDATA[<p>나는 sudo가 이상해서 vsc에 remix를 npm으로 설치하지 못한다.</p>
<p>이때 즉시 실행 명령어로 대체해서 사용할 수 있다.
매일 쓰기 때문에 여기에 적어놓는다.</p>
<pre><code>npx @remix-project/remixd -s . --remix-ide https://remix.ethereum.org</code></pre><hr>
<p>참고로, 원래 리믹스와 비쥬얼스튜디오코드를  연결하는 명령어는 다다음과 같다:</p>
<pre><code>remixd -s . --remix-ide https://remix.ethereum.org</code></pre><hr>
<p>만약 이게 안 된다면 맥의 경우 아래와 같이 sudo를 붙인 명령어를 치면 권한 문제가 해결되기도 한다:</p>
<pre><code>sudo remixd -s . --remix-ide https://remix.ethereum.org</code></pre><p>안 되면 궁극의 방책으로 내가 사용하는 npx 실행 명령어를 사용하면 된다. </p>
<hr>
<p>결론: 보통 이 세 가지 명령어 안에서 리믹스 IDE와 비쥬얼스튜디오코드 연결 기능을 구현할 수 있을 것이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[리액트 카카오맵 api]]></title>
            <link>https://velog.io/@crypto_jang/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%B9%B4%EC%B9%B4%EC%98%A4%EB%A7%B5-api</link>
            <guid>https://velog.io/@crypto_jang/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%B9%B4%EC%B9%B4%EC%98%A4%EB%A7%B5-api</guid>
            <pubDate>Sun, 03 Dec 2023 05:36:36 GMT</pubDate>
            <description><![CDATA[<p>카카오맵 api 문서를 보아도, 여러 글을 읽어도 쉽게 지도를 띄우지 못했다.</p>
<p>그러나 최초로 성공한 경우는 아래 유튜브 영상을 참고한 경우였다. 
<a href="https://youtu.be/73BPjRKCBBs?si=5qSVCMNAp5vfP5p3">https://youtu.be/73BPjRKCBBs?si=5qSVCMNAp5vfP5p3</a></p>
<p>드디어, 지도는 띄웠다. 
<img src="https://velog.velcdn.com/images/crypto_jang/post/b8744528-4760-4be9-b4b0-e7a43afb56bc/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[터미널 종료하기]]></title>
            <link>https://velog.io/@crypto_jang/%ED%84%B0%EB%AF%B8%EB%84%90-%EC%A2%85%EB%A3%8C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@crypto_jang/%ED%84%B0%EB%AF%B8%EB%84%90-%EC%A2%85%EB%A3%8C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 03 Dec 2023 05:34:49 GMT</pubDate>
            <description><![CDATA[<p>비쥬얼 스튜디오 코드에서 작업하다보면 열려있던 터미널을 종료하고 새로 실행시켜야 하는 경우가 있다.</p>
<p>보통 ctrl c 를 하면 닫히지만 이상하게 내 컴퓨터는 작동하지 않는다.</p>
<p>그래서 터미널에서 코드로 종료할 수 있는 방법을 자주 활용한다.</p>
<pre><code>lsof -i :3010</code></pre><p>위에서 3010은 닫고자 하는 포트 번호</p>
<p>node의 PID 확인 (1615라 하자)</p>
<pre><code>kill -9 1615</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[React Router Dom]]></title>
            <link>https://velog.io/@crypto_jang/React-Router-Dom</link>
            <guid>https://velog.io/@crypto_jang/React-Router-Dom</guid>
            <pubDate>Sat, 02 Dec 2023 16:19:32 GMT</pubDate>
            <description><![CDATA[<h2 id="리액트-라우터-돔이란">리액트 라우터 돔이란?</h2>
<ul>
<li><p>리액트는 싱글 페이지 어플리케이션이다. 리액트 라우터 돔으로 멀티 페이지 앱을 만들 수 있다.</p>
</li>
<li><p><a href="https://reactrouter.com/en/main">https://reactrouter.com/en/main</a></p>
</li>
<li><p>참고: 넥스트js에서는 라우팅 기능 포함됨. 따라서 cra로 작업할 때에 리액트 라우터 돔 사용</p>
</li>
</ul>
<hr>
<h2 id="참고-코드-httpsgithubcomcryptojangto-do-list-drtreemaster">참고 코드: <a href="https://github.com/cryptojang/to-do-list-dr/tree/master">https://github.com/cryptojang/to-do-list-dr/tree/master</a></h2>
<h3 id="1-리액트-라우터-돔-설치">1. 리액트 라우터 돔 설치</h3>
<ul>
<li>터미널에서 작업할 폴더로 이동한 후 아래와 같이 설치한다.<pre><code>npm i react-router-dom
</code></pre></li>
</ul>
<pre><code>
### 2. 페이지 나누기
- 만들 페이지를 파일로 만든다.
- ex. main page : src 폴더 안에 pages/main.jsx
- 페이지를 특수한 컴포넌트로 만듬. 이때 페이지 파일명은 소문자로 만들고, 컴포넌트처럼 틀 만든다.
- 이런 식으로 로그인 페이지 등 쭉 파일 만들어서 src/pages/ 에 저장
![](https://velog.velcdn.com/images/crypto_jang/post/fe60424e-494d-48ea-b02b-f1e737d51345/image.png)


### 3. App.jsx 에 페이지 부착시키기

- 모든 페이지의 구조를 최상위 렌더링 페이지인 App.jsx에서 정리한다.
- 우선, 리액트 라우터 돔에서 BrowserRouter, Routes, Route 임포트한 후, BrowserRouter 안에 Routes 안에 Route 로 구조 세운다.

```js
import { BrowserRouter, Routes, Route } from &quot;react-router-dom&quot;;
import Main from &quot;./pages/main&quot;;
import A from &quot;./pages/a&quot;;
import B from &quot;./pages/b&quot;;
import C from &quot;./pages/c&quot;;


const App = () =&gt; {
 return (
   &lt;BrowserRouter&gt;
     &lt;Routes&gt;
       &lt;Route path=&quot;/&quot; element={&lt;Main /&gt;} /&gt;
       &lt;Route path=&quot;/a&quot; element={&lt;A /&gt;} /&gt;
       &lt;Route path=&quot;/b&quot; element={&lt;B /&gt;} /&gt;
       &lt;Route path=&quot;/c&quot; element={&lt;C /&gt;} /&gt;
     &lt;/Routes&gt;
   &lt;/BrowserRouter&gt;
 );
};


export default App;</code></pre><ul>
<li><strong>path:</strong> 페이지 경로 </li>
<li><strong>element:</strong> path에 넣은 경로에서 element에 나온 페이지 띄워준다 뜻</li>
<li>*<em>브라우저 라우터: *</em>가장 바깥에서 감싸줘야 함. </li>
<li><strong>routes</strong>: 여러 개 존재 가능(localhots/user/a 식으로 가지치기 할 수 있음) -&gt; 근데 라우츠 하나 안에서 /user/a 식으로 경로 설정하는 것도 가능</li>
<li>** route:** 하나의 페이지에 대한 내용 적어주는 곳</li>
</ul>
<h3 id="4-버튼으로-이동하기-구현">4. 버튼으로 이동하기 구현:</h3>
<ul>
<li>링크 컴포넌트 사용 (미리 만든 연결 버튼): 버튼으로 페이지 이동,뒤로 가기 눌렀을 때 뒤로 가는 기능을 미리 구현해놓음</li>
<li>리액트 라우터 돔에는 페이지 이동 컴포넌트 존재<pre><code class="language-js">import { Link } from &quot;react-router-dom&quot;;

</code></pre>
</li>
</ul>
<p>const Main = () =&gt; {
 return (
   <div className="bg-blue-100 min-h-screen flex flex-col justify-center items-center">
     <div>Main</div>
     <div className="flex gap-8">
       <Link to="/a">a</Link>
       <Link to="/a">b</Link>
       <Link to="/a">c</Link></p>
<pre><code> &lt;/div&gt;</code></pre>   </div>
 );
};


<p>export default Main;</p>
<pre><code>
### 5. 동적 라우팅.
- id 값에 1,2,3,4, 등 들어올 수 있다
(http://localhost:3002/user/5 처럼)

- 코인별 소개 페이지 같이 반복적인 거 줄일 수 잇음
```js
&lt;Route path=&quot;/user/:id&quot; element={&lt;User /&gt;} /&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[소문자 대문자]]></title>
            <link>https://velog.io/@crypto_jang/%EC%86%8C%EB%AC%B8%EC%9E%90-%EB%8C%80%EB%AC%B8%EC%9E%90</link>
            <guid>https://velog.io/@crypto_jang/%EC%86%8C%EB%AC%B8%EC%9E%90-%EB%8C%80%EB%AC%B8%EC%9E%90</guid>
            <pubDate>Sat, 02 Dec 2023 15:50:42 GMT</pubDate>
            <description><![CDATA[<p>대문자로 쓰기
Component 이름
<a href="https://github.com/cryptojang/to-do-list-dr/blob/master/src/pages/detail.jsx">pages 파일 내에서 Page 이름</a></p>
<p>소문자로 쓰기
<a href="https://github.com/cryptojang/to-do-list-dr/blob/master/src/pages/detail.jsx">pages 파일 이름.jsx, </a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[npm 설치하고 사용해야 하는 것들]]></title>
            <link>https://velog.io/@crypto_jang/%EC%84%A4%EC%B9%98%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EA%B2%83%EB%93%A4</link>
            <guid>https://velog.io/@crypto_jang/%EC%84%A4%EC%B9%98%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EA%B2%83%EB%93%A4</guid>
            <pubDate>Sat, 02 Dec 2023 15:36:50 GMT</pubDate>
            <description><![CDATA[<p>리덕스</p>
<pre><code>npm install @reduxjs/toolkit react-redux</code></pre><p>백엔드 만들기</p>
<pre><code>npm init -y
npm i express
npm i nodemon
npm i cors</code></pre><p>axios</p>
<pre><code>npm i axios</code></pre><p>router</p>
<pre><code>npm i react-router-dom</code></pre><p>react icon</p>
<pre><code>npm i react-icon
npm install react-icons -save</code></pre><p>slick</p>
<pre><code>npm i react-slick slick-carousel</code></pre><p>node module 설치</p>
<pre><code>npm install</code></pre><p>tailwindcss</p>
<pre><code>npm i -D tailwindcss
npx tailwindcss init</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[리액트 배운 내용]]></title>
            <link>https://velog.io/@crypto_jang/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B0%B0%EC%9A%B4-%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@crypto_jang/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%B0%B0%EC%9A%B4-%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sat, 02 Dec 2023 12:02:00 GMT</pubDate>
            <description><![CDATA[<h3 id="1106-세팅하기">11/06 세팅하기</h3>
<ul>
<li>create-react-app / tailwindcss</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/cra-tailwind-template">https://github.com/cryptojang/cra-tailwind-template</a></li>
</ul>
<h3 id="1107-달력-만들기">11/07 달력 만들기</h3>
<ul>
<li>component / props / JSON / map</li>
<li>참고 코드: 
<a href="https://github.com/cryptojang/calendar/tree/master">https://github.com/cryptojang/calendar/tree/master</a></li>
</ul>
<h3 id="1108-투두리스트-no-redux-no-router-no-local-storage">11/08 투두리스트 (no redux, no router, no local storage)</h3>
<ul>
<li>useState / 입력창 / 제출 기능 / </li>
<li>참고 코드: 
<a href="https://github.com/cryptojang/to-do-list/tree/master">https://github.com/cryptojang/to-do-list/tree/master</a></li>
</ul>
<h3 id="1109-계산기">11/09 계산기</h3>
<ul>
<li>useState / useEffect / componenet / props / tailwindcss</li>
<li>참고 코드: 
<a href="https://github.com/cryptojang/calculator">https://github.com/cryptojang/calculator</a></li>
</ul>
<h3 id="1109-날씨-앱">11/09 날씨 앱</h3>
<ul>
<li>api / axios / useEffect / geoLocation / substring</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/weather-api">https://github.com/cryptojang/weather-api</a></li>
</ul>
<h3 id="1110-코인-시세-가져오기">11/10 코인 시세 가져오기</h3>
<ul>
<li>업비트 api / useEffect</li>
<li>참고 코드: 
<a href="https://github.com/cryptojang/coin-api">https://github.com/cryptojang/coin-api</a></li>
</ul>
<h3 id="1113-투두리스트-">11/13 투두리스트 ***</h3>
<ul>
<li>react router dom / local storage / useParams / react-icons / 쿼리스트링 / JSON / parse stringify / 배열 수정 맵함수 / useNavigate / 삼항연산자/ useState / useEffect</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/to-do-list-dr">https://github.com/cryptojang/to-do-list-dr</a></li>
</ul>
<h3 id="1115-챗gpt-검색바">11/15 챗gpt 검색바</h3>
<ul>
<li>gpt-api / pop-up창(모달 창)</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/chat-gpt">https://github.com/cryptojang/chat-gpt</a></li>
</ul>
<h3 id="1116-테킷-클론-with-리액트">11/16 테킷 클론 with 리액트</h3>
<ul>
<li>layout &amp; comp / 폰트 추가 / classname 추가 / 색 추가 </li>
<li>참고 코드:
<a href="https://github.com/cryptojang/techit-clone">https://github.com/cryptojang/techit-clone</a></li>
</ul>
<h3 id="1116-솔라나-클론">11/16 솔라나 클론</h3>
<ul>
<li>웹사이트 실제 화면과 동일한 화면 구현해보기</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/solana-clone">https://github.com/cryptojang/solana-clone</a></li>
</ul>
<h3 id="1121-헤더-사라지는-스크롤이벤트계속-감지">11/21 헤더 사라지는 스크롤이벤트(계속 감지)</h3>
<ul>
<li>addEventListener</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/disappear-header">https://github.com/cryptojang/disappear-header</a></li>
</ul>
<h3 id="1122-무한-스크롤">11/22 무한 스크롤</h3>
<ul>
<li>intersection observer(특정 객체에 도달 시 인식)</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/infinite-scroll">https://github.com/cryptojang/infinite-scroll</a></li>
</ul>
<h3 id="1123-다이나믹-스크롤스크롤-따라-사이즈-바뀌는-인터랙션">11/23 다이나믹 스크롤(스크롤 따라 사이즈 바뀌는 인터랙션)</h3>
<ul>
<li>참고 코드:
<a href="https://github.com/cryptojang/dynamic-scroll">https://github.com/cryptojang/dynamic-scroll</a></li>
</ul>
<h3 id="1127-투두리스트-">11/27 투두리스트 **</h3>
<ul>
<li>리덕스 / 백엔드와 프론트엔드 / 익스프레스 / 포스트맨</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/frontend">https://github.com/cryptojang/frontend</a>
<a href="https://github.com/cryptojang/backend">https://github.com/cryptojang/backend</a></li>
</ul>
<h3 id="1129-암기장">11/29 암기장</h3>
<ul>
<li>구글 tts api / 음성 재생 </li>
<li>참고 코드:
<a href="https://github.com/cryptojang/review-english">https://github.com/cryptojang/review-english</a></li>
</ul>
<h3 id="1130-춘짱-고양이-use-animate">11/30 춘짱 고양이 use animate</h3>
<ul>
<li>커스텀 훅스 만들기 (반복 긴 코드 줄이고 싶을 때)</li>
<li>참고 코드:
<a href="https://github.com/cryptojang/use-animate">https://github.com/cryptojang/use-animate</a></li>
</ul>
<h3 id="121-투두리스트">12/1 투두리스트</h3>
<ul>
<li>tdd </li>
<li>참고 코드: 
<a href="https://github.com/cryptojang/jest">https://github.com/cryptojang/jest</a> 
<a href="https://github.com/cryptojang/to-do-list-tdd">https://github.com/cryptojang/to-do-list-tdd</a></li>
</ul>
<h2 id="이외-이론-코드">이외 이론 코드</h2>
<h4 id="call-back">call back</h4>
<p><a href="https://github.com/cryptojang/CallBack">https://github.com/cryptojang/CallBack</a></p>
<h4 id="redux">redux</h4>
<p><a href="https://github.com/cryptojang/Redux-and-Make-Backend-Whole-Folder">https://github.com/cryptojang/Redux-and-Make-Backend-Whole-Folder</a></p>
<h4 id="hoisting">hoisting</h4>
<p><a href="https://github.com/cryptojang/Hoisting-Class211030">https://github.com/cryptojang/Hoisting-Class211030</a></p>
<h4 id="usecontext">useContext</h4>
<p><a href="https://github.com/cryptojang/use-context-practice">https://github.com/cryptojang/use-context-practice</a></p>
<h4 id="함수형-컴포넌트와-클래스형-컴포넌트">함수형 컴포넌트와 클래스형 컴포넌트</h4>
<p><a href="https://github.com/cryptojang/class-vs-function">https://github.com/cryptojang/class-vs-function</a></p>
<h4 id="useeffect">useEffect</h4>
<p><a href="https://github.com/cryptojang/use-effect-practice-4-cases">https://github.com/cryptojang/use-effect-practice-4-cases</a>
<a href="https://github.com/cryptojang/use-effect-practice">https://github.com/cryptojang/use-effect-practice</a></p>
<h4 id="react-router-dom">react router dom</h4>
<p><a href="https://github.com/cryptojang/react-router-dom-practice">https://github.com/cryptojang/react-router-dom-practice</a></p>
<h4 id="array-map-함수">array map 함수</h4>
<p><a href="https://github.com/cryptojang/array-map-basic">https://github.com/cryptojang/array-map-basic</a></p>
<h4 id="props">props</h4>
<p><a href="https://github.com/cryptojang/props-practice">https://github.com/cryptojang/props-practice</a>
<a href="https://github.com/cryptojang/props-recap">https://github.com/cryptojang/props-recap</a></p>
<h4 id="component">component</h4>
<p><a href="https://github.com/cryptojang/component-practice-2">https://github.com/cryptojang/component-practice-2</a>
<a href="https://github.com/cryptojang/component-practice">https://github.com/cryptojang/component-practice</a></p>
<h4 id="usestate">useState</h4>
<p><a href="https://github.com/cryptojang/use-state-practice">https://github.com/cryptojang/use-state-practice</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TDD]]></title>
            <link>https://velog.io/@crypto_jang/TDD</link>
            <guid>https://velog.io/@crypto_jang/TDD</guid>
            <pubDate>Sat, 02 Dec 2023 11:52:34 GMT</pubDate>
            <description><![CDATA[<p>테스트 파일로 먼저 구현하고 싶은 기능의 시험 코드 만들기
-&gt;
테스트 오류 남
-&gt; 
코드 작성해서 오류 고침</p>
<p>참고 코드: <a href="https://github.com/cryptojang/to-do-list-tdd/tree/master">https://github.com/cryptojang/to-do-list-tdd/tree/master</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[export import CJS EMS]]></title>
            <link>https://velog.io/@crypto_jang/export-import-CJS-EMS</link>
            <guid>https://velog.io/@crypto_jang/export-import-CJS-EMS</guid>
            <pubDate>Sat, 02 Dec 2023 11:50:47 GMT</pubDate>
            <description><![CDATA[<h2 id="커먼js-문법으로-export-import-하기">커먼JS 문법으로 export import 하기</h2>
<p>참고 코드: <a href="https://github.com/cryptojang/jest.git">https://github.com/cryptojang/jest.git</a> </p>
<p>[export]</p>
<pre><code class="language-js">exports.sum = sum;
exports.sumOf = sumOf; </code></pre>
<p>[import]</p>
<pre><code class="language-js">const { sum, sumOf } = require(&quot;./a&quot;);</code></pre>
<h2 id="ems-문법으로-export-import-하기">EMS 문법으로 export import 하기</h2>
<p>참고 코드: <a href="https://github.com/cryptojang/to-do-list-tdd/tree/master">https://github.com/cryptojang/to-do-list-tdd/tree/master</a> </p>
<p>[export]</p>
<pre><code class="language-js">const CreateTodo = ({ onInsert }) =&gt; {};
export default CreateTodo;</code></pre>
<p>[import]</p>
<pre><code class="language-js">import { useState } from &quot;react&quot;;
import CreateTodo from &quot;./components/CreatTodo&quot;;
import TodoList from &quot;./components/TodoList&quot;;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[useRef 사용법
]]></title>
            <link>https://velog.io/@crypto_jang/useRef</link>
            <guid>https://velog.io/@crypto_jang/useRef</guid>
            <pubDate>Fri, 17 Nov 2023 02:30:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/crypto_jang/post/f1925d36-53b3-4993-90d0-7d9c86c53bce/image.png" alt=""></p>
<p>useRef 사용법</p>
<p>1 useref return 전에 넣어주고</p>
<p>2 꺼내고자 하는 요소에 ref로 넣어주고</p>
<p>3 꺼낸 변형된 값 사용할 곳에 함수 만들어서 함수 넣어주고</p>
<p>4 함수에 변형해서 사용할 ref 넣으면 됨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] ul 태그 기본 스타일 없애기]]></title>
            <link>https://velog.io/@crypto_jang/CSS-ul-%ED%83%9C%EA%B7%B8-%EA%B8%B0%EB%B3%B8-%EC%8A%A4%ED%83%80%EC%9D%BC-%EC%97%86%EC%95%A0%EA%B8%B0</link>
            <guid>https://velog.io/@crypto_jang/CSS-ul-%ED%83%9C%EA%B7%B8-%EA%B8%B0%EB%B3%B8-%EC%8A%A4%ED%83%80%EC%9D%BC-%EC%97%86%EC%95%A0%EA%B8%B0</guid>
            <pubDate>Sat, 04 Nov 2023 14:11:47 GMT</pubDate>
            <description><![CDATA[<p>html에 &lt; ul &gt; 태그를 입력하면 특정 스타일이 입혀있다. 이 스타일을 없애고 싶다면 </p>
<p>css 파일에서 아래와 같이 입력한다. </p>
<pre><code class="language-css">ul {
list style: none;
}</code></pre>
<p>그렇다면 불릿도 안 넣는데 왜 div 대신 굳이 ul 태그를 사용할까? SEO를 위해서!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] 깃과 깃허브의 차이점]]></title>
            <link>https://velog.io/@crypto_jang/Git-%EA%B9%83%EA%B3%BC-%EA%B9%83%ED%97%88%EB%B8%8C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@crypto_jang/Git-%EA%B9%83%EA%B3%BC-%EA%B9%83%ED%97%88%EB%B8%8C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Sat, 04 Nov 2023 13:48:35 GMT</pubDate>
        </item>
    </channel>
</rss>