<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>JDK's blog</title>
    <link>https://jdkblog.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 9 Aug 2026 04:24:45 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>JDK's blog</managingEditor>
    <item>
      <title>[REACT] 문자열함수(JAVASCRIPT)</title>
      <link>https://jdkblog.tistory.com/156</link>
      <description>&lt;p data-end=&quot;142&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;좋은 질문이에요  &lt;br /&gt;React 자체는 특별한 문자열 유틸을 제공하지 않지만, JS 기본 함수로 **&amp;ldquo;치환, 배열 분리, 포함 여부 검사&amp;rdquo;**는 거의 전부 해결할 수 있고, 실무에서는 이를 감싼 &lt;b&gt;커스텀 유틸 함수&lt;/b&gt;를 만들어 두는 게 일반적입니다.&lt;/p&gt;
&lt;p data-end=&quot;183&quot; data-start=&quot;144&quot; data-ke-size=&quot;size16&quot;&gt;아래에   &lt;b&gt;자주 쓰는 3가지 카테고리별 유틸&lt;/b&gt;을 정리해드릴게요:&lt;/p&gt;
&lt;hr data-end=&quot;188&quot; data-start=&quot;185&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;228&quot; data-start=&quot;190&quot; data-ke-size=&quot;size26&quot;&gt;✏️ 1. 문자열 치환 (replace / replaceAll)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp;✅&amp;nbsp;단순&amp;nbsp;치환&amp;nbsp;(처음&amp;nbsp;하나만) &lt;br /&gt;const&amp;nbsp;result1&amp;nbsp;=&amp;nbsp;&quot;Hello&amp;nbsp;World&quot;.replace(&quot;World&quot;,&amp;nbsp;&quot;React&quot;); &lt;br /&gt;//&amp;nbsp;&amp;rarr;&amp;nbsp;&quot;Hello&amp;nbsp;React&quot; &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;모든&amp;nbsp;항목&amp;nbsp;치환&amp;nbsp;(replaceAll&amp;nbsp;또는&amp;nbsp;정규식) &lt;br /&gt;const&amp;nbsp;result2&amp;nbsp;=&amp;nbsp;&quot;apple&amp;nbsp;banana&amp;nbsp;apple&quot;.replaceAll(&quot;apple&quot;,&amp;nbsp;&quot;orange&quot;); &lt;br /&gt;//&amp;nbsp;&amp;rarr;&amp;nbsp;&quot;orange&amp;nbsp;banana&amp;nbsp;orange&quot; &lt;br /&gt;&lt;br /&gt;const&amp;nbsp;result3&amp;nbsp;=&amp;nbsp;&quot;apple&amp;nbsp;banana&amp;nbsp;apple&quot;.replace(/apple/g,&amp;nbsp;&quot;orange&quot;); &lt;br /&gt;//&amp;nbsp;&amp;rarr;&amp;nbsp;&quot;orange&amp;nbsp;banana&amp;nbsp;orange&quot; &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;여러&amp;nbsp;단어를&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;치환&amp;nbsp;(객체&amp;nbsp;매핑&amp;nbsp;활용) &lt;br /&gt;const&amp;nbsp;replaceMap&amp;nbsp;=&amp;nbsp;(str,&amp;nbsp;map)&amp;nbsp;=&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;str.replace(new&amp;nbsp;RegExp(Object.keys(map).join(&quot;|&quot;),&amp;nbsp;&quot;g&quot;),&amp;nbsp;(m)&amp;nbsp;=&amp;gt;&amp;nbsp;map[m]); &lt;br /&gt;&lt;br /&gt;console.log(replaceMap(&quot;I&amp;nbsp;like&amp;nbsp;red&amp;nbsp;and&amp;nbsp;blue&quot;,&amp;nbsp;{&amp;nbsp;red:&amp;nbsp;&quot;green&quot;,&amp;nbsp;blue:&amp;nbsp;&quot;yellow&quot;&amp;nbsp;})); &lt;br /&gt;//&amp;nbsp;&amp;rarr;&amp;nbsp;I&amp;nbsp;like&amp;nbsp;green&amp;nbsp;and&amp;nbsp;yellow &lt;/p&gt;
&lt;p data-end=&quot;869&quot; data-start=&quot;815&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;팁:&lt;/b&gt; React에서 입력 값 전처리(공백 제거, 금칙어 치환 등)에도 자주 사용됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;874&quot; data-start=&quot;871&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;908&quot; data-start=&quot;876&quot; data-ke-size=&quot;size26&quot;&gt;  2. 특정 문자열 기준으로 배열화 (split)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp;✅&amp;nbsp;구분자로&amp;nbsp;배열&amp;nbsp;생성 &lt;br /&gt;const&amp;nbsp;fruits&amp;nbsp;=&amp;nbsp;&quot;apple,banana,orange&quot;.split(&quot;,&quot;); &lt;br /&gt;//&amp;nbsp;&amp;rarr;&amp;nbsp;[&quot;apple&quot;,&amp;nbsp;&quot;banana&quot;,&amp;nbsp;&quot;orange&quot;] &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;줄바꿈&amp;nbsp;기준으로&amp;nbsp;나누기 &lt;br /&gt;const&amp;nbsp;lines&amp;nbsp;=&amp;nbsp;&quot;1줄\n2줄\n3줄&quot;.split(&quot;\n&quot;); &lt;br /&gt;//&amp;nbsp;&amp;rarr;&amp;nbsp;[&quot;1줄&quot;,&amp;nbsp;&quot;2줄&quot;,&amp;nbsp;&quot;3줄&quot;] &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;정규식&amp;nbsp;활용&amp;nbsp;(공백/쉼표&amp;nbsp;모두&amp;nbsp;기준) &lt;br /&gt;const&amp;nbsp;words&amp;nbsp;=&amp;nbsp;&quot;apple,&amp;nbsp;banana&amp;nbsp;&amp;nbsp;orange&quot;.split(/[\s,]+/); &lt;br /&gt;//&amp;nbsp;&amp;rarr;&amp;nbsp;[&quot;apple&quot;,&amp;nbsp;&quot;banana&quot;,&amp;nbsp;&quot;orange&quot;] &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;특정&amp;nbsp;문자열&amp;nbsp;기준으로&amp;nbsp;앞뒤&amp;nbsp;나누기&amp;nbsp;(2개만) &lt;br /&gt;const&amp;nbsp;[before,&amp;nbsp;after]&amp;nbsp;=&amp;nbsp;&quot;title:React&quot;.split(&quot;:&quot;); &lt;br /&gt;//&amp;nbsp;before&amp;nbsp;=&amp;nbsp;&quot;title&quot;,&amp;nbsp;after&amp;nbsp;=&amp;nbsp;&quot;React&quot; &lt;/p&gt;
&lt;p data-end=&quot;1423&quot; data-start=&quot;1339&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;실전 예:&lt;/b&gt;&lt;br /&gt;서버에서 &quot;A|B|C&quot; 같은 문자열이 올 때 배열로 만들어 React map()으로 UI를 뿌리는 데 자주 쓰입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1428&quot; data-start=&quot;1425&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1459&quot; data-start=&quot;1430&quot; data-ke-size=&quot;size26&quot;&gt;  3. 특정 문자열 포함 여부 / 위치 찾기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&amp;nbsp;✅&amp;nbsp;포함&amp;nbsp;여부&amp;nbsp;확인&amp;nbsp;(대소문자&amp;nbsp;구분) &lt;br /&gt;&quot;Hello&amp;nbsp;React&quot;.includes(&quot;React&quot;);&amp;nbsp;//&amp;nbsp;true &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;대소문자&amp;nbsp;무시&amp;nbsp;포함&amp;nbsp;확인 &lt;br /&gt;&quot;Hello&amp;nbsp;React&quot;.toLowerCase().includes(&quot;react&quot;);&amp;nbsp;//&amp;nbsp;true &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;시작/끝&amp;nbsp;검사 &lt;br /&gt;&quot;Hello&amp;nbsp;React&quot;.startsWith(&quot;Hello&quot;);&amp;nbsp;//&amp;nbsp;true &lt;br /&gt;&quot;Hello&amp;nbsp;React&quot;.endsWith(&quot;React&quot;);&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;true &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;위치&amp;nbsp;찾기&amp;nbsp;(indexOf&amp;nbsp;/&amp;nbsp;lastIndexOf) &lt;br /&gt;&quot;Hello&amp;nbsp;React&quot;.indexOf(&quot;React&quot;);&amp;nbsp;//&amp;nbsp;6&amp;nbsp;(없으면&amp;nbsp;-1) &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;✅&amp;nbsp;조건문&amp;nbsp;활용&amp;nbsp;예시 &lt;br /&gt;if&amp;nbsp;(&quot;apple&amp;nbsp;banana&quot;.includes(&quot;banana&quot;))&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;console.log(&quot; &amp;nbsp;포함됨!&quot;); &lt;br /&gt;} &lt;/p&gt;
&lt;h2 data-end=&quot;2095&quot; data-start=&quot;2067&quot; data-ke-size=&quot;size26&quot;&gt;  보너스: 응용 예제 (3가지 기능 조합)&lt;/h2&gt;
&lt;p data-end=&quot;2140&quot; data-start=&quot;2097&quot; data-ke-size=&quot;size16&quot;&gt;아래는 실무에서 자주 쓰는 &lt;b&gt;문자열 &amp;rarr; 배열 &amp;rarr; 검사&lt;/b&gt; 흐름 예시예요  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const&amp;nbsp;csv&amp;nbsp;=&amp;nbsp;&quot;id:1,name:John,age:20&quot;; &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;①&amp;nbsp;콤마로&amp;nbsp;나눠&amp;nbsp;배열로 &lt;br /&gt;const&amp;nbsp;pairs&amp;nbsp;=&amp;nbsp;csv.split(&quot;,&quot;); &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;②&amp;nbsp;각&amp;nbsp;항목을&amp;nbsp;key:value&amp;nbsp;객체로&amp;nbsp;변환 &lt;br /&gt;const&amp;nbsp;obj&amp;nbsp;=&amp;nbsp;Object.fromEntries(pairs.map(pair&amp;nbsp;=&amp;gt;&amp;nbsp;pair.split(&quot;:&quot;))); &lt;br /&gt;//&amp;nbsp;&amp;rarr;&amp;nbsp;{&amp;nbsp;id:&amp;nbsp;&quot;1&quot;,&amp;nbsp;name:&amp;nbsp;&quot;John&quot;,&amp;nbsp;age:&amp;nbsp;&quot;20&quot;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;③&amp;nbsp;특정&amp;nbsp;key&amp;nbsp;포함&amp;nbsp;여부&amp;nbsp;검사 &lt;br /&gt;if&amp;nbsp;(&quot;name&quot;&amp;nbsp;in&amp;nbsp;obj)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;console.log(`이름:&amp;nbsp;${obj.name}`);&amp;nbsp;//&amp;nbsp;이름:&amp;nbsp;John &lt;br /&gt;} &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>REACT</category>
      <category>javscript</category>
      <category>React</category>
      <category>문자열</category>
      <category>유틸</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/156</guid>
      <comments>https://jdkblog.tistory.com/156#entry156comment</comments>
      <pubDate>Fri, 3 Oct 2025 11:59:37 +0900</pubDate>
    </item>
    <item>
      <title>[REACT] fatch, axios 사용법</title>
      <link>https://jdkblog.tistory.com/155</link>
      <description>&lt;p data-end=&quot;105&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;React에서 &lt;b&gt;데이터를 가져오는(fetch)&lt;/b&gt; 방법은 대표적으로 두 가지예요:&lt;br /&gt;1️⃣ &lt;b&gt;기본 내장 fetch() API&lt;/b&gt;&lt;br /&gt;2️⃣ &lt;b&gt;외부 라이브러리 axios&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;183&quot; data-start=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;두 방법 모두 자주 쓰이고, 성격이 다르기 때문에 프로젝트 상황에 따라 선택합니다. 아래에 &lt;b&gt;종류별 예제 + 설명&lt;/b&gt;을 정리했어요  &lt;/p&gt;
&lt;hr data-end=&quot;188&quot; data-start=&quot;185&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;215&quot; data-start=&quot;190&quot; data-ke-size=&quot;size26&quot;&gt;  1. fetch() 기본 사용법&lt;/h2&gt;
&lt;p data-end=&quot;238&quot; data-start=&quot;217&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;기본 문법 (GET 요청):&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;238&quot; data-start=&quot;217&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;import&amp;nbsp;{&amp;nbsp;useEffect,&amp;nbsp;useState&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react&quot;; &lt;br /&gt;&lt;br /&gt;export&amp;nbsp;default&amp;nbsp;function&amp;nbsp;App()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[posts,&amp;nbsp;setPosts]&amp;nbsp;=&amp;nbsp;useState([]); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;useEffect(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fetch(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/posts&lt;/a&gt;&quot;)&amp;nbsp;//&amp;nbsp;API&amp;nbsp;주소 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then((res)&amp;nbsp;=&amp;gt;&amp;nbsp;res.json())&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;응답을&amp;nbsp;JSON으로&amp;nbsp;변환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then((data)&amp;nbsp;=&amp;gt;&amp;nbsp;setPosts(data))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;state에&amp;nbsp;저장 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch((err)&amp;nbsp;=&amp;gt;&amp;nbsp;console.error(&quot;에러:&quot;,&amp;nbsp;err));&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;에러&amp;nbsp;처리 &lt;br /&gt;&amp;nbsp;&amp;nbsp;},&amp;nbsp;[]); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt; &amp;nbsp;fetch&amp;nbsp;예제&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{posts.map((p)&amp;nbsp;=&amp;gt;&amp;nbsp;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;nbsp;key={p.id}&amp;gt;{p.title}&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;); &lt;br /&gt;} &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;851&quot; data-start=&quot;839&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1015&quot; data-start=&quot;852&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;891&quot; data-start=&quot;852&quot;&gt;fetch()는 브라우저 내장 함수 &amp;rarr; 별도 설치 필요 없음&lt;/li&gt;
&lt;li data-end=&quot;933&quot; data-start=&quot;892&quot;&gt;.then() 체인을 사용하거나 async/await도 가능&lt;/li&gt;
&lt;li data-end=&quot;974&quot; data-start=&quot;934&quot;&gt;응답을 JSON으로 변환하려면 .json()을 꼭 호출해야 함&lt;/li&gt;
&lt;li data-end=&quot;1015&quot; data-start=&quot;975&quot;&gt;에러 처리가 try/catch 대신 .catch()에서 이뤄짐&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1020&quot; data-start=&quot;1017&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1045&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;POST 요청 (데이터 전송):&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1045&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;async&amp;nbsp;function&amp;nbsp;addPost()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;response&amp;nbsp;=&amp;nbsp;await&amp;nbsp;fetch(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/posts&lt;/a&gt;&quot;,&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method:&amp;nbsp;&quot;POST&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers:&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Content-Type&quot;:&amp;nbsp;&quot;application/json&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body:&amp;nbsp;JSON.stringify({&amp;nbsp;title:&amp;nbsp;&quot;새&amp;nbsp;글&quot;,&amp;nbsp;body:&amp;nbsp;&quot;내용&quot;,&amp;nbsp;userId:&amp;nbsp;1&amp;nbsp;}), &lt;br /&gt;&amp;nbsp;&amp;nbsp;}); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;result&amp;nbsp;=&amp;nbsp;await&amp;nbsp;response.json(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;console.log(&quot;✅&amp;nbsp;저장&amp;nbsp;결과:&quot;,&amp;nbsp;result); &lt;br /&gt;} &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1413&quot; data-start=&quot;1400&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;포인트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1492&quot; data-start=&quot;1414&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1432&quot; data-start=&quot;1414&quot;&gt;method 지정 필요&lt;/li&gt;
&lt;li data-end=&quot;1458&quot; data-start=&quot;1433&quot;&gt;headers로 JSON 전송 명시&lt;/li&gt;
&lt;li data-end=&quot;1492&quot; data-start=&quot;1459&quot;&gt;body는 반드시 문자열(JSON.stringify)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1497&quot; data-start=&quot;1494&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1519&quot; data-start=&quot;1499&quot; data-ke-size=&quot;size26&quot;&gt;  2. axios 사용법&lt;/h2&gt;
&lt;p data-end=&quot;1581&quot; data-start=&quot;1521&quot; data-ke-size=&quot;size16&quot;&gt;Axios는 &lt;b&gt;Promise 기반 HTTP 클라이언트&lt;/b&gt;로, fetch보다 기능이 많고 문법이 간결합니다.&lt;/p&gt;
&lt;p data-end=&quot;1589&quot; data-start=&quot;1583&quot; data-ke-size=&quot;size16&quot;&gt;  설치:&lt;/p&gt;
&lt;p data-end=&quot;1589&quot; data-start=&quot;1583&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;npm&amp;nbsp;install&amp;nbsp;axios&lt;/b&gt; &lt;/p&gt;
&lt;p data-end=&quot;1589&quot; data-start=&quot;1583&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;기본 GET 요청:&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1589&quot; data-start=&quot;1583&quot; data-ke-size=&quot;size16&quot;&gt;import&amp;nbsp;axios&amp;nbsp;from&amp;nbsp;&quot;axios&quot;; &lt;br /&gt;import&amp;nbsp;{&amp;nbsp;useEffect,&amp;nbsp;useState&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react&quot;; &lt;br /&gt;&lt;br /&gt;export&amp;nbsp;default&amp;nbsp;function&amp;nbsp;App()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[posts,&amp;nbsp;setPosts]&amp;nbsp;=&amp;nbsp;useState([]); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;useEffect(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axios &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.get(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/posts&lt;/a&gt;&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then((res)&amp;nbsp;=&amp;gt;&amp;nbsp;setPosts(res.data))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;JSON&amp;nbsp;변환&amp;nbsp;불필요 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch((err)&amp;nbsp;=&amp;gt;&amp;nbsp;console.error(&quot;에러:&quot;,&amp;nbsp;err)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;},&amp;nbsp;[]); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt; &amp;nbsp;axios&amp;nbsp;예제&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{posts.map((p)&amp;nbsp;=&amp;gt;&amp;nbsp;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;nbsp;key={p.id}&amp;gt;{p.title}&amp;lt;/li&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;); &lt;br /&gt;} &lt;/p&gt;
&lt;p data-end=&quot;2206&quot; data-start=&quot;2183&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;fetch와 비교 포인트:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2330&quot; data-start=&quot;2207&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2248&quot; data-start=&quot;2207&quot;&gt;res.json() 필요 없음 &amp;rarr; res.data 바로 사용&lt;/li&gt;
&lt;li data-end=&quot;2268&quot; data-start=&quot;2249&quot;&gt;자동으로 JSON 변환 처리&lt;/li&gt;
&lt;li data-end=&quot;2291&quot; data-start=&quot;2269&quot;&gt;에러가 catch로 잘 전달됨&lt;/li&gt;
&lt;li data-end=&quot;2330&quot; data-start=&quot;2292&quot;&gt;요청/응답 인터셉터, 기본 URL, 헤더 설정 등 고급 기능 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2335&quot; data-start=&quot;2332&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;2359&quot; data-start=&quot;2337&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;POST 요청 (axios):&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2359&quot; data-start=&quot;2337&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;async&amp;nbsp;function&amp;nbsp;addPost()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;res&amp;nbsp;=&amp;nbsp;await&amp;nbsp;axios.post(&quot;&lt;a href=&quot;https://jsonplaceholder.typicode.com/posts&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/posts&lt;/a&gt;&quot;,&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;&quot;새&amp;nbsp;글&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body:&amp;nbsp;&quot;내용&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;userId:&amp;nbsp;1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;✅&amp;nbsp;저장&amp;nbsp;결과:&quot;,&amp;nbsp;res.data); &lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(error)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.error(&quot;에러&amp;nbsp;발생:&quot;,&amp;nbsp;error); &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;} &lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-end=&quot;2682&quot; data-start=&quot;2658&quot; data-ke-size=&quot;size26&quot;&gt;  fetch vs axios 비교표&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목fetchaxios
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3002&quot; data-start=&quot;2684&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3002&quot; data-start=&quot;2734&quot;&gt;
&lt;tr data-end=&quot;2787&quot; data-start=&quot;2734&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2742&quot; data-start=&quot;2734&quot;&gt;&lt;b&gt;설치 필요&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2757&quot; data-start=&quot;2742&quot;&gt;&lt;b&gt;❌ 없음 (기본 내장)&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2787&quot; data-start=&quot;2757&quot;&gt;&lt;b&gt;✅ 필요 (npm install axios)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2841&quot; data-start=&quot;2788&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2797&quot; data-start=&quot;2788&quot;&gt;&lt;b&gt;문법 간결성&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2821&quot; data-start=&quot;2797&quot;&gt;&lt;b&gt;  다소 복잡 (json 변환 필요)&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2841&quot; data-start=&quot;2821&quot;&gt;&lt;b&gt;  직관적 (자동 JSON)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2873&quot; data-start=&quot;2842&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2850&quot; data-start=&quot;2842&quot;&gt;&lt;b&gt;에러 처리&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2861&quot; data-start=&quot;2850&quot;&gt;&lt;b&gt;일부 제한 있음&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2873&quot; data-start=&quot;2861&quot;&gt;&lt;b&gt;에러 정보 상세&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2902&quot; data-start=&quot;2874&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2887&quot; data-start=&quot;2874&quot;&gt;&lt;b&gt;요청/응답 인터셉터&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2894&quot; data-start=&quot;2887&quot;&gt;&lt;b&gt;❌ 없음&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2902&quot; data-start=&quot;2894&quot;&gt;&lt;b&gt;✅ 있음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2933&quot; data-start=&quot;2903&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2918&quot; data-start=&quot;2903&quot;&gt;&lt;b&gt;기본 URL/헤더 설정&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2925&quot; data-start=&quot;2918&quot;&gt;&lt;b&gt;❌ 없음&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2933&quot; data-start=&quot;2925&quot;&gt;&lt;b&gt;✅ 있음&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2962&quot; data-start=&quot;2934&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2945&quot; data-start=&quot;2934&quot;&gt;&lt;b&gt;브라우저 호환성&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2957&quot; data-start=&quot;2945&quot;&gt;&lt;b&gt;✅ 최신 브라우저&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2962&quot; data-start=&quot;2957&quot;&gt;&lt;b&gt;✅&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3002&quot; data-start=&quot;2963&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2978&quot; data-start=&quot;2963&quot;&gt;&lt;b&gt;취소 토큰 / 타임아웃&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2991&quot; data-start=&quot;2978&quot;&gt;&lt;b&gt;❌ 직접 구현 필요&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3002&quot; data-start=&quot;2991&quot;&gt;&lt;b&gt;✅ 기본 제공&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1589&quot; data-start=&quot;1583&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;223&quot; data-start=&quot;197&quot; data-ke-size=&quot;size26&quot;&gt;  HTTP 메서드별 개념 &amp;amp; 용도 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;메서드역할주 용도특징예시 상황
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;673&quot; data-start=&quot;225&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;673&quot; data-start=&quot;306&quot;&gt;
&lt;tr data-end=&quot;384&quot; data-start=&quot;306&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;316&quot; data-start=&quot;306&quot;&gt;&lt;b&gt;GET&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;330&quot; data-start=&quot;316&quot;&gt;&lt;b&gt;  데이터 &amp;ldquo;조회&amp;rdquo;&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;346&quot; data-start=&quot;330&quot;&gt;&lt;b&gt;서버에서 데이터 가져오기&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;365&quot; data-start=&quot;346&quot;&gt;&lt;b&gt;Body 없음, URL로 요청&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;384&quot; data-start=&quot;365&quot;&gt;&lt;b&gt;게시글 목록 보기, 상세보기&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;454&quot; data-start=&quot;385&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;396&quot; data-start=&quot;385&quot;&gt;&lt;b&gt;POST&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;410&quot; data-start=&quot;396&quot;&gt;&lt;b&gt;✏️ 데이터 &amp;ldquo;생성&amp;rdquo;&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;421&quot; data-start=&quot;410&quot;&gt;&lt;b&gt;새 데이터 등록&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;438&quot; data-start=&quot;421&quot;&gt;&lt;b&gt;Body에 새 데이터 포함&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;454&quot; data-start=&quot;438&quot;&gt;&lt;b&gt;회원가입, 새 글 작성&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;531&quot; data-start=&quot;455&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;465&quot; data-start=&quot;455&quot;&gt;&lt;b&gt;PUT&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;482&quot; data-start=&quot;465&quot;&gt;&lt;b&gt;  데이터 &amp;ldquo;전체 수정&amp;rdquo;&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;501&quot; data-start=&quot;482&quot;&gt;&lt;b&gt;기존 데이터를 &amp;ldquo;완전히&amp;rdquo; 교체&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;518&quot; data-start=&quot;501&quot;&gt;&lt;b&gt;Body에 전체 객체 포함&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;531&quot; data-start=&quot;518&quot;&gt;&lt;b&gt;게시글 전체 수정&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;602&quot; data-start=&quot;532&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;544&quot; data-start=&quot;532&quot;&gt;&lt;b&gt;PATCH&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;561&quot; data-start=&quot;544&quot;&gt;&lt;b&gt;  데이터 &amp;ldquo;부분 수정&amp;rdquo;&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;573&quot; data-start=&quot;561&quot;&gt;&lt;b&gt;일부 필드만 수정&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;591&quot; data-start=&quot;573&quot;&gt;&lt;b&gt;Body에 수정 필드만 포함&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;602&quot; data-start=&quot;591&quot;&gt;&lt;b&gt;닉네임만 변경&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;673&quot; data-start=&quot;603&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;616&quot; data-start=&quot;603&quot;&gt;&lt;b&gt;DELETE&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;630&quot; data-start=&quot;616&quot;&gt;&lt;b&gt;  데이터 &amp;ldquo;삭제&amp;rdquo;&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;643&quot; data-start=&quot;630&quot;&gt;&lt;b&gt;서버의 리소스 삭제&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;656&quot; data-start=&quot;643&quot;&gt;&lt;b&gt;Body 거의 없음&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;673&quot; data-start=&quot;656&quot;&gt;&lt;b&gt;회원 탈퇴, 게시글 삭제&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>REACT</category>
      <category>axios</category>
      <category>fatch</category>
      <category>React</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/155</guid>
      <comments>https://jdkblog.tistory.com/155#entry155comment</comments>
      <pubDate>Sun, 28 Sep 2025 11:22:27 +0900</pubDate>
    </item>
    <item>
      <title>[REACT] useEffect로 알아보기</title>
      <link>https://jdkblog.tistory.com/154</link>
      <description>&lt;h1 data-end=&quot;93&quot; data-start=&quot;77&quot;&gt;⚛️ useEffect란?&lt;/h1&gt;
&lt;p data-end=&quot;206&quot; data-start=&quot;95&quot; data-ke-size=&quot;size16&quot;&gt;useEffect는 React 함수형 컴포넌트에서 &lt;b&gt;부수효과(Side Effect)&lt;/b&gt; 를 처리하기 위한 훅(Hook)입니다.&lt;br /&gt;예를 들어 다음과 같은 동작이 모두 &amp;ldquo;부수효과&amp;rdquo;에 해당해요  &lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;312&quot; data-start=&quot;208&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;232&quot; data-start=&quot;208&quot;&gt;  API 호출 (데이터 가져오기)&lt;/li&gt;
&lt;li data-end=&quot;250&quot; data-start=&quot;233&quot;&gt;⏱️ 타이머/인터벌 설정&lt;/li&gt;
&lt;li data-end=&quot;267&quot; data-start=&quot;251&quot;&gt;  로컬스토리지 접근&lt;/li&gt;
&lt;li data-end=&quot;284&quot; data-start=&quot;268&quot;&gt;  DOM 직접 조작&lt;/li&gt;
&lt;li data-end=&quot;312&quot; data-start=&quot;285&quot;&gt;  구독 해제나 리소스 정리(cleanup)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;314&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;렌더링만으로는 해결되지 않는 외부 동작&lt;/b&gt;을 처리할 때 useEffect를 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;314&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;useEffect(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;이&amp;nbsp;안에서&amp;nbsp;부수효과&amp;nbsp;실행 &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;(선택)&amp;nbsp;cleanup:&amp;nbsp;컴포넌트가&amp;nbsp;사라질&amp;nbsp;때&amp;nbsp;실행 &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;}; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;},&amp;nbsp;[dependency]);&lt;/b&gt;&lt;/u&gt; &lt;/p&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;314&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;540&quot; data-start=&quot;521&quot;&gt;첫 번째 인자: 실행할 함수&lt;/li&gt;
&lt;li data-end=&quot;573&quot; data-start=&quot;541&quot;&gt;return 부분: cleanup (선택 사항)&lt;/li&gt;
&lt;li data-end=&quot;609&quot; data-start=&quot;574&quot;&gt;두 번째 인자 []: 의존성 배열 &amp;rarr; 언제 실행할지 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;   예제 1 &amp;ndash; 컴포넌트가 처음 렌더링될 때 1회 실행 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;314&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;import&amp;nbsp;React,&amp;nbsp;{&amp;nbsp;useState,&amp;nbsp;useEffect&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react&quot;; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;function&amp;nbsp;Welcome()&amp;nbsp;{ &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[message,&amp;nbsp;setMessage]&amp;nbsp;=&amp;nbsp;useState(&quot;로딩&amp;nbsp;중...&quot;); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;useEffect(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;✅&amp;nbsp;마운트&amp;nbsp;시&amp;nbsp;한&amp;nbsp;번만&amp;nbsp;실행 &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setMessage(&quot;안녕하세요!&amp;nbsp; &quot;); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;1500); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;},&amp;nbsp;[]);&amp;nbsp;//&amp;nbsp;&amp;larr;&amp;nbsp;의존성&amp;nbsp;배열이&amp;nbsp;빈&amp;nbsp;배열이면&amp;nbsp;'처음&amp;nbsp;한&amp;nbsp;번만' &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;lt;h2&amp;gt;{message}&amp;lt;/h2&amp;gt;; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;} &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;export&amp;nbsp;default&amp;nbsp;Welcome;&lt;/b&gt;&lt;/u&gt; &lt;/p&gt;
&lt;p data-end=&quot;1014&quot; data-start=&quot;1007&quot; data-ke-size=&quot;size16&quot;&gt;  동작&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1088&quot; data-start=&quot;1015&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1053&quot; data-start=&quot;1015&quot;&gt;컴포넌트가 처음 렌더링될 때만 setTimeout() 실행&lt;/li&gt;
&lt;li data-end=&quot;1088&quot; data-start=&quot;1054&quot;&gt;1.5초 후 메시지가 업데이트되고 화면이 다시 렌더링됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;   예제 2 &amp;ndash; 상태 변화마다 실행 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;import&amp;nbsp;React,&amp;nbsp;{&amp;nbsp;useState,&amp;nbsp;useEffect&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react&quot;; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;function&amp;nbsp;Counter()&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[count,&amp;nbsp;setCount]&amp;nbsp;=&amp;nbsp;useState(0); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;useEffect(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(` &amp;nbsp;카운트가&amp;nbsp;${count}로&amp;nbsp;변경됨`); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;},&amp;nbsp;[count]);&amp;nbsp;//&amp;nbsp;count가&amp;nbsp;바뀔&amp;nbsp;때마다&amp;nbsp;실행됨 &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;현재&amp;nbsp;카운트:&amp;nbsp;{count}&amp;lt;/p&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;onClick={()&amp;nbsp;=&amp;gt;&amp;nbsp;setCount(count&amp;nbsp;+&amp;nbsp;1)}&amp;gt;+1&amp;lt;/button&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;export&amp;nbsp;default&amp;nbsp;Counter;&lt;/b&gt; &lt;/p&gt;
&lt;p data-end=&quot;1516&quot; data-start=&quot;1509&quot; data-ke-size=&quot;size16&quot;&gt;  동작&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1579&quot; data-start=&quot;1517&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1559&quot; data-start=&quot;1517&quot;&gt;count 상태가 변경될 때마다 useEffect 안의 함수 실행&lt;/li&gt;
&lt;li data-end=&quot;1579&quot; data-start=&quot;1560&quot;&gt;콘솔에 새로운 값 로그 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1584&quot; data-start=&quot;1581&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1619&quot; data-start=&quot;1586&quot; data-ke-size=&quot;size26&quot;&gt;  예제 3 &amp;ndash; 타이머 사용 + 정리(cleanup)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;import&amp;nbsp;React,&amp;nbsp;{&amp;nbsp;useState,&amp;nbsp;useEffect&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react&quot;; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;function&amp;nbsp;Timer()&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[sec,&amp;nbsp;setSec]&amp;nbsp;=&amp;nbsp;useState(0); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;useEffect(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;id&amp;nbsp;=&amp;nbsp;setInterval(()&amp;nbsp;=&amp;gt;&amp;nbsp;setSec(s&amp;nbsp;=&amp;gt;&amp;nbsp;s&amp;nbsp;+&amp;nbsp;1),&amp;nbsp;1000); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;⏱️&amp;nbsp;타이머&amp;nbsp;시작&quot;); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;✅&amp;nbsp;cleanup:&amp;nbsp;컴포넌트가&amp;nbsp;사라질&amp;nbsp;때&amp;nbsp;실행 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clearInterval(id); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot; &amp;nbsp;타이머&amp;nbsp;정리&amp;nbsp;완료&quot;); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;},&amp;nbsp;[]);&amp;nbsp;//&amp;nbsp;마운트&amp;nbsp;시&amp;nbsp;1회&amp;nbsp;실행 &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;lt;h2&amp;gt;⏱️&amp;nbsp;{sec}초&amp;nbsp;경과&amp;lt;/h2&amp;gt;; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;export&amp;nbsp;default&amp;nbsp;Timer;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2070&quot; data-start=&quot;2063&quot; data-ke-size=&quot;size16&quot;&gt;  동작&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2181&quot; data-start=&quot;2071&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2106&quot; data-start=&quot;2071&quot;&gt;컴포넌트가 처음 나타날 때 setInterval 시작&lt;/li&gt;
&lt;li data-end=&quot;2138&quot; data-start=&quot;2107&quot;&gt;1초마다 sec 상태 증가 &amp;rarr; UI 자동 갱신&lt;/li&gt;
&lt;li data-end=&quot;2181&quot; data-start=&quot;2139&quot;&gt;컴포넌트가 사라질 때 clearInterval()로 메모리 누수 방지&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2186&quot; data-start=&quot;2183&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2195&quot; data-start=&quot;2188&quot; data-ke-size=&quot;size26&quot;&gt;✅ 정리&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;옵션설명실행 시점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2432&quot; data-start=&quot;2197&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2432&quot; data-start=&quot;2246&quot;&gt;
&lt;tr data-end=&quot;2302&quot; data-start=&quot;2246&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2277&quot; data-start=&quot;2246&quot;&gt;&lt;b&gt;useEffect(() =&amp;gt; {...}, [])&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2292&quot; data-start=&quot;2277&quot;&gt;&lt;b&gt;마운트 시 1회만 실행&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2302&quot; data-start=&quot;2292&quot;&gt;&lt;b&gt;최초 렌더링&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2374&quot; data-start=&quot;2303&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2339&quot; data-start=&quot;2303&quot;&gt;&lt;b&gt;useEffect(() =&amp;gt; {...}, [state])&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2362&quot; data-start=&quot;2339&quot;&gt;&lt;b&gt;특정 상태/props가 바뀔 때 실행&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2374&quot; data-start=&quot;2362&quot;&gt;&lt;b&gt;의존성 변경 시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2432&quot; data-start=&quot;2375&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2398&quot; data-start=&quot;2375&quot;&gt;&lt;b&gt;return () =&amp;gt; {...}&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2415&quot; data-start=&quot;2398&quot;&gt;&lt;b&gt;정리(cleanup) 함수&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2432&quot; data-start=&quot;2415&quot;&gt;&lt;b&gt;언마운트 또는 재실행 전&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;369&quot; data-start=&quot;314&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>REACT</category>
      <category>React</category>
      <category>useEffect</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/154</guid>
      <comments>https://jdkblog.tistory.com/154#entry154comment</comments>
      <pubDate>Sun, 28 Sep 2025 10:20:47 +0900</pubDate>
    </item>
    <item>
      <title>[REACT] USESTATE 변수관리법</title>
      <link>https://jdkblog.tistory.com/153</link>
      <description>&lt;h2 data-end=&quot;111&quot; data-start=&quot;95&quot; data-ke-size=&quot;size26&quot;&gt;useState란?&lt;/h2&gt;
&lt;p data-end=&quot;246&quot; data-start=&quot;113&quot; data-ke-size=&quot;size16&quot;&gt;useState는 React에서 &lt;b&gt;컴포넌트의 상태(state)를 관리&lt;/b&gt;하기 위한 기본 훅(Hook)입니다.&lt;br /&gt;함수형 컴포넌트에서 변수값을 기억하고 업데이트할 수 있게 해주며, 값이 바뀌면 &lt;b&gt;자동으로 UI를 다시 렌더링&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-end=&quot;254&quot; data-start=&quot;248&quot; data-ke-size=&quot;size16&quot;&gt;  문법:&lt;/p&gt;
&lt;p data-end=&quot;254&quot; data-start=&quot;248&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;const&amp;nbsp;[state,&amp;nbsp;setState]&amp;nbsp;=&amp;nbsp;useState(initialValue);&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-end=&quot;254&quot; data-start=&quot;248&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;341&quot; data-start=&quot;323&quot;&gt;state: 현재 상태 값&lt;/li&gt;
&lt;li data-end=&quot;367&quot; data-start=&quot;342&quot;&gt;setState: 상태를 변경하는 함수&lt;/li&gt;
&lt;li data-end=&quot;393&quot; data-start=&quot;368&quot;&gt;initialValue: 상태의 초기값&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  기본 예제 &amp;ndash; 카운터 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;import&amp;nbsp;React,&amp;nbsp;{&amp;nbsp;useState&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react&quot;; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;function&amp;nbsp;Counter()&amp;nbsp;{ &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;count라는&amp;nbsp;상태를&amp;nbsp;0으로&amp;nbsp;초기화 &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[count,&amp;nbsp;setCount]&amp;nbsp;=&amp;nbsp;useState(0); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;+1&amp;nbsp;증가 &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;increase&amp;nbsp;=&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;setCount(count&amp;nbsp;+&amp;nbsp;1); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;초기화 &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;reset&amp;nbsp;=&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;setCount(0); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;현재&amp;nbsp;카운트:&amp;nbsp;{count}&amp;lt;/h2&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;onClick={increase}&amp;gt;+1&amp;lt;/button&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;onClick={reset}&amp;gt;초기화&amp;lt;/button&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;} &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;export&amp;nbsp;default&amp;nbsp;Counter;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-end=&quot;868&quot; data-start=&quot;857&quot; data-ke-size=&quot;size16&quot;&gt;  실행 흐름:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;967&quot; data-start=&quot;869&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;894&quot; data-start=&quot;869&quot;&gt;처음 렌더링 시 count는 0&lt;/li&gt;
&lt;li data-end=&quot;931&quot; data-start=&quot;895&quot;&gt;버튼 클릭 시 setCount()가 실행 &amp;rarr; 상태 변경&lt;/li&gt;
&lt;li data-end=&quot;967&quot; data-start=&quot;932&quot;&gt;상태가 바뀌면 자동으로 다시 렌더링되어 화면의 숫자도 갱신됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  예제 2 &amp;ndash; 토글 상태 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;import&amp;nbsp;React,&amp;nbsp;{&amp;nbsp;useState&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react&quot;; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;function&amp;nbsp;LoginToggle()&amp;nbsp;{ &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[isLoggedIn,&amp;nbsp;setIsLoggedIn]&amp;nbsp;=&amp;nbsp;useState(false); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;{isLoggedIn&amp;nbsp;?&amp;nbsp;&quot;✅&amp;nbsp;로그인&amp;nbsp;상태&quot;&amp;nbsp;:&amp;nbsp;&quot; &amp;nbsp;로그아웃&amp;nbsp;상태&quot;}&amp;lt;/p&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;onClick={()&amp;nbsp;=&amp;gt;&amp;nbsp;setIsLoggedIn(!isLoggedIn)}&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{isLoggedIn&amp;nbsp;?&amp;nbsp;&quot;로그아웃&quot;&amp;nbsp;:&amp;nbsp;&quot;로그인&quot;} &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/button&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt; &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;); &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;} &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;export&amp;nbsp;default&amp;nbsp;LoginToggle;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-end=&quot;1384&quot; data-start=&quot;1373&quot; data-ke-size=&quot;size16&quot;&gt;  실행 흐름:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1463&quot; data-start=&quot;1385&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1418&quot; data-start=&quot;1385&quot;&gt;초기 상태는 false &amp;rarr; &amp;ldquo;로그아웃 상태&amp;rdquo; 표시&lt;/li&gt;
&lt;li data-end=&quot;1463&quot; data-start=&quot;1419&quot;&gt;버튼 클릭 시 !isLoggedIn으로 상태가 반전 &amp;rarr; UI도 자동 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1468&quot; data-start=&quot;1465&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1476&quot; data-start=&quot;1470&quot; data-ke-size=&quot;size16&quot;&gt;✅ 정리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1621&quot; data-start=&quot;1477&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1522&quot; data-start=&quot;1477&quot;&gt;useState는 함수형 컴포넌트에서 상태를 저장&amp;middot;업데이트하는 기본 훅&lt;/li&gt;
&lt;li data-end=&quot;1554&quot; data-start=&quot;1523&quot;&gt;상태 변경 시 자동 렌더링 &amp;rarr; DOM 조작 불필요&lt;/li&gt;
&lt;li data-end=&quot;1590&quot; data-start=&quot;1555&quot;&gt;다양한 타입(숫자, 문자열, 배열, 객체 등) 저장 가능&lt;/li&gt;
&lt;li data-end=&quot;1621&quot; data-start=&quot;1591&quot;&gt;이벤트&amp;middot;폼 입력&amp;middot;토글 UI 등에서 가장 자주 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>REACT</category>
      <category>React</category>
      <category>useState</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/153</guid>
      <comments>https://jdkblog.tistory.com/153#entry153comment</comments>
      <pubDate>Sun, 28 Sep 2025 10:14:52 +0900</pubDate>
    </item>
    <item>
      <title>[REACT] 핵심특징 7가지</title>
      <link>https://jdkblog.tistory.com/152</link>
      <description>&lt;h1 data-end=&quot;164&quot; data-start=&quot;140&quot;&gt;⚛️ React의 7가지 핵심 특징 정리&lt;/h1&gt;
&lt;h2 data-end=&quot;214&quot; data-start=&quot;166&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ 컴포넌트 기반 구조 (Component-Based Architecture)&lt;/h2&gt;
&lt;p data-end=&quot;385&quot; data-start=&quot;216&quot; data-ke-size=&quot;size16&quot;&gt;React는 UI를 작고 독립적인 &lt;b&gt;컴포넌트(Component)&lt;/b&gt; 단위로 쪼개어 개발합니다.&lt;br /&gt;각각의 컴포넌트는 자신의 상태(state)와 UI를 관리하며, 조합하여 복잡한 화면을 쉽게 구성할 수 있습니다.&lt;br /&gt;이 방식은 &lt;b&gt;재사용성&lt;/b&gt;, &lt;b&gt;유지보수성&lt;/b&gt;, &lt;b&gt;협업 효율성&lt;/b&gt;을 모두 높여줍니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;function&amp;nbsp;Header()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;lt;h1&amp;gt;안녕하세요!&amp;lt;/h1&amp;gt;; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;function&amp;nbsp;App()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Header&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;컴포넌트&amp;nbsp;조합으로&amp;nbsp;화면&amp;nbsp;구성&amp;lt;/p&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;); &lt;br /&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;560&quot; data-start=&quot;557&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;589&quot; data-start=&quot;562&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ 가상 DOM (Virtual DOM)&lt;/h2&gt;
&lt;p data-end=&quot;738&quot; data-start=&quot;591&quot; data-ke-size=&quot;size16&quot;&gt;React는 브라우저 DOM을 직접 조작하지 않고, 메모리에 가상의 DOM(Virtual DOM)을 만들어 변경 사항만 비교(diff)한 후&lt;br /&gt;&lt;b&gt;필요한 부분만 최소한으로 업데이트&lt;/b&gt;합니다.&lt;br /&gt;이로 인해 불필요한 렌더링을 줄이고 &lt;b&gt;성능이 대폭 향상&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;function&amp;nbsp;Counter()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[count,&amp;nbsp;setCount]&amp;nbsp;=&amp;nbsp;React.useState(0); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;{count}&amp;lt;/h2&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;button&amp;nbsp;onClick={()&amp;nbsp;=&amp;gt;&amp;nbsp;setCount(c&amp;nbsp;=&amp;gt;&amp;nbsp;c&amp;nbsp;+&amp;nbsp;1)}&amp;gt;+1&amp;lt;/button&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;); &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;955&quot; data-start=&quot;952&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;994&quot; data-start=&quot;957&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ 단방향 데이터 흐름 (One-Way Data Flow)&lt;/h2&gt;
&lt;p data-end=&quot;1096&quot; data-start=&quot;996&quot; data-ke-size=&quot;size16&quot;&gt;React는 부모 &amp;rarr; 자식 방향으로만 데이터가 흐르는 &lt;b&gt;단방향 데이터 플로우&lt;/b&gt; 구조를 가집니다.&lt;br /&gt;데이터 흐름이 단순해 &lt;b&gt;예측 가능성이 높고&lt;/b&gt;, &lt;b&gt;디버깅이 쉽습니다.&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;function&amp;nbsp;Child({&amp;nbsp;text&amp;nbsp;})&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;lt;p&amp;gt;{text}&amp;lt;/p&amp;gt;; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;function&amp;nbsp;Parent()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;lt;Child&amp;nbsp;text=&quot;단방향&amp;nbsp;데이터&amp;nbsp;흐름&amp;nbsp;예제&quot;&amp;nbsp;/&amp;gt;; &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1237&quot; data-start=&quot;1234&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1269&quot; data-start=&quot;1239&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ 선언적 UI (Declarative UI)&lt;/h2&gt;
&lt;p data-end=&quot;1391&quot; data-start=&quot;1271&quot; data-ke-size=&quot;size16&quot;&gt;React는 명령형 방식으로 DOM을 직접 조작하지 않고, &lt;b&gt;&amp;ldquo;무엇을 보여줄지&amp;rdquo;를 선언&lt;/b&gt;합니다.&lt;br /&gt;상태(state)가 변경되면 React가 알아서 UI를 다시 렌더링해주므로 코드가 간결하고 유지보수가 쉽습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;function&amp;nbsp;App()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[loggedIn,&amp;nbsp;setLoggedIn]&amp;nbsp;=&amp;nbsp;React.useState(false); &lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;lt;div&amp;gt;{loggedIn&amp;nbsp;?&amp;nbsp;&quot;로그인&amp;nbsp;성공!&quot;&amp;nbsp;:&amp;nbsp;&quot;로그인이&amp;nbsp;필요합니다&quot;}&amp;lt;/div&amp;gt;; &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1551&quot; data-start=&quot;1548&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1591&quot; data-start=&quot;1553&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ Hooks를 통한 상태 관리 (Hooks &amp;amp; State)&lt;/h2&gt;
&lt;p data-end=&quot;1730&quot; data-start=&quot;1593&quot; data-ke-size=&quot;size16&quot;&gt;useState, useEffect 같은 &lt;b&gt;Hooks&lt;/b&gt;를 사용하면 함수형 컴포넌트에서도 상태 관리와 생명주기 제어가 가능합니다.&lt;br /&gt;복잡한 상태는 Redux, Zustand, Recoil 등의 라이브러리와 연동하여 관리할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;function&amp;nbsp;Timer()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[sec,&amp;nbsp;setSec]&amp;nbsp;=&amp;nbsp;React.useState(0); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;React.useEffect(()&amp;nbsp;=&amp;gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;id&amp;nbsp;=&amp;nbsp;setInterval(()&amp;nbsp;=&amp;gt;&amp;nbsp;setSec(s&amp;nbsp;=&amp;gt;&amp;nbsp;s&amp;nbsp;+&amp;nbsp;1),&amp;nbsp;1000); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;clearInterval(id);&amp;nbsp;//&amp;nbsp;cleanup &lt;br /&gt;&amp;nbsp;&amp;nbsp;},&amp;nbsp;[]); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;lt;div&amp;gt;{sec}초&amp;lt;/div&amp;gt;; &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1995&quot; data-start=&quot;1992&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2047&quot; data-start=&quot;1997&quot; data-ke-size=&quot;size26&quot;&gt;6️⃣ 풍부한 생태계 &amp;amp; 커뮤니티 (Rich Ecosystem &amp;amp; Community)&lt;/h2&gt;
&lt;p data-end=&quot;2185&quot; data-start=&quot;2049&quot; data-ke-size=&quot;size16&quot;&gt;React는 라우팅(react-router), 상태 관리, UI 라이브러리(Material UI, Chakra UI) 등 다양한 생태계를 갖추고 있으며&lt;br /&gt;전 세계적으로 커뮤니티가 활발하여 &lt;b&gt;문제 해결 속도가 빠르고 자료가 풍부&lt;/b&gt;합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;import&amp;nbsp;{&amp;nbsp;BrowserRouter,&amp;nbsp;Routes,&amp;nbsp;Route,&amp;nbsp;Link&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react-router-dom&quot;; &lt;br /&gt;&lt;br /&gt;function&amp;nbsp;App()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;BrowserRouter&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;nav&amp;gt;&amp;lt;Link&amp;nbsp;to=&quot;/about&quot;&amp;gt;About&amp;lt;/Link&amp;gt;&amp;lt;/nav&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Routes&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Route&amp;nbsp;path=&quot;/about&quot;&amp;nbsp;element={&amp;lt;div&amp;gt;About&amp;nbsp;Page&amp;lt;/div&amp;gt;}&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Routes&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/BrowserRouter&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;); &lt;br /&gt;} &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2500&quot; data-start=&quot;2497&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2544&quot; data-start=&quot;2502&quot; data-ke-size=&quot;size26&quot;&gt;7️⃣ 다양한 플랫폼 지원 (Cross-Platform Support)&lt;/h2&gt;
&lt;p data-end=&quot;2648&quot; data-start=&quot;2546&quot; data-ke-size=&quot;size16&quot;&gt;React는 웹(React DOM)뿐 아니라 모바일(React Native), 데스크톱(Electron), SSR(Next.js) 등&lt;br /&gt;&lt;b&gt;다양한 플랫폼&lt;/b&gt;에서 활용할 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;import&amp;nbsp;{&amp;nbsp;View,&amp;nbsp;Text,&amp;nbsp;Button&amp;nbsp;}&amp;nbsp;from&amp;nbsp;&quot;react-native&quot;; &lt;br /&gt;&lt;br /&gt;export&amp;nbsp;default&amp;nbsp;function&amp;nbsp;MobileApp()&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;View&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Text&amp;gt;Hello&amp;nbsp;React&amp;nbsp;Native&amp;lt;/Text&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Button&amp;nbsp;title=&quot;확인&quot;&amp;nbsp;onPress={()&amp;nbsp;=&amp;gt;&amp;nbsp;{}}&amp;nbsp;/&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/View&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;); &lt;br /&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2888&quot; data-start=&quot;2885&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2905&quot; data-start=&quot;2890&quot; data-ke-size=&quot;size26&quot;&gt;  한눈에 보는 요약&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;특징설명장점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3249&quot; data-start=&quot;2907&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3249&quot; data-start=&quot;2947&quot;&gt;
&lt;tr data-end=&quot;3000&quot; data-start=&quot;2947&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2960&quot; data-start=&quot;2947&quot;&gt;  컴포넌트 기반&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2981&quot; data-start=&quot;2960&quot;&gt;UI를 재사용 가능한 단위로 구성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3000&quot; data-start=&quot;2981&quot;&gt;유지보수성 &amp;uarr;, 재사용성 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3038&quot; data-start=&quot;3001&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3017&quot; data-start=&quot;3001&quot;&gt;⚡ Virtual DOM&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3030&quot; data-start=&quot;3017&quot;&gt;변경 부분만 렌더링&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3038&quot; data-start=&quot;3030&quot;&gt;성능 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3084&quot; data-start=&quot;3039&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3055&quot; data-start=&quot;3039&quot;&gt;  단방향 데이터 흐름&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3072&quot; data-start=&quot;3055&quot;&gt;부모 &amp;rarr; 자식 데이터 전달&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3084&quot; data-start=&quot;3072&quot;&gt;예측 가능성 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3128&quot; data-start=&quot;3085&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3097&quot; data-start=&quot;3085&quot;&gt;  선언적 UI&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3116&quot; data-start=&quot;3097&quot;&gt;상태 기반 자동 UI 업데이트&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3128&quot; data-start=&quot;3116&quot;&gt;코드 간결성 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3169&quot; data-start=&quot;3129&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3140&quot; data-start=&quot;3129&quot;&gt;  Hooks&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3159&quot; data-start=&quot;3140&quot;&gt;상태&amp;middot;생명주기 제어 및 확장성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3169&quot; data-start=&quot;3159&quot;&gt;재사용성 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3207&quot; data-start=&quot;3170&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3179&quot; data-start=&quot;3170&quot;&gt;  생태계&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3198&quot; data-start=&quot;3179&quot;&gt;라우팅&amp;middot;UI&amp;middot;상태관리 등 풍부&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3207&quot; data-start=&quot;3198&quot;&gt;생산성 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3249&quot; data-start=&quot;3208&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3220&quot; data-start=&quot;3208&quot;&gt;  멀티 플랫폼&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3240&quot; data-start=&quot;3220&quot;&gt;웹 / 모바일 / 데스크톱 지원&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3249&quot; data-start=&quot;3240&quot;&gt;확장성 &amp;uarr;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>REACT</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/152</guid>
      <comments>https://jdkblog.tistory.com/152#entry152comment</comments>
      <pubDate>Sun, 28 Sep 2025 09:33:33 +0900</pubDate>
    </item>
    <item>
      <title>개인정보처리방침</title>
      <link>https://jdkblog.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보처리방침 양식을 찾으시는군요. 플레이스토어 통과를 목표로 하는 효과적인 개인정보처리방침은 단순히 빈칸을 채우는 양식보다는, 앱의 실제 데이터 처리 방식을 정확히 반영하는 맞춤형 문서여야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 일반적인 개인정보처리방침에 포함되어야 할 필수적인 내용들을 바탕으로, &lt;b&gt;플레이스토어 앱을 위한 개인정보처리방침 양식&lt;/b&gt;의 큰 틀과 각 섹션에 포함되어야 할 핵심 내용을 아래와 같이 정리해 드립니다. 이 양식을 기반으로 귀하의 앱에 맞게 내용을 상세히 채우고 수정하는 작업이 필요합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[sssSoft] 개인정보처리방침&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 개인정보처리방침은 [sssSoft] (이하 &quot;저희&quot; 또는 &quot;앱&quot;)이 [날짜]부터 사용자로부터 수집하고 사용하는 개인정보에 대한 내용을 설명합니다. 저희는 사용자의 개인정보를 소중히 여기며, 관련 법령 및 규정을 준수하고 투명하게 개인정보를 처리하기 위해 최선을 다하고 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 수집하는 개인정보의 종류 및 수집 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희 앱은 원활한 서비스 제공 및 개선을 위해 다음과 같은 개인정보를 수집할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가. 직접 수집 정보 (사용자가 직접 제공하는 정보)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;회원가입/계정 정보:&lt;/b&gt; [이름, 이메일 주소, 전화번호, 프로필 사진, 소셜 로그인 정보 (예: Google, Apple ID), 생년월일, 성별 등 앱에서 수집하는 특정 계정 정보를 명시하세요.]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;예시: 이메일 주소 (회원 인증 및 비밀번호 찾기), 프로필 사진 (다른 사용자에게 표시되는 프로필), 닉네임 (서비스 내 식별 목적)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결제 정보:&lt;/b&gt; [인앱 결제 등이 있는 경우, 실제로 앱에서 결제 정보를 직접 수집하는지 여부를 명시하세요. 보통 결제는 제3자 결제대행사(PG사)를 통해 이루어지므로, 이 경우 PG사를 명시하고 직접 수집하지 않음을 밝혀야 합니다.]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;예시: 저희 앱은 직접 결제 정보를 수집 및 저장하지 않으며, 모든 결제는 [결제대행사 이름, 예: Google Play Billing]를 통해 처리됩니다.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용자 생성 콘텐츠:&lt;/b&gt; [앱 내에서 사용자가 직접 작성하거나 업로드하는 콘텐츠 유형을 명시하세요. 예: 채팅 메시지, 게시물, 댓글, 사진, 동영상, 음성 녹음 등]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;예시: 채팅 메시지 (앱 내 소통 기능), 게시물 (사용자 간 정보 공유), 사진 (프로필 설정)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고객 지원 문의:&lt;/b&gt; [서비스 이용 중 문의사항을 접수할 때 제공되는 정보. 예: 문의 내용, 연락처 정보 등]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나. 자동 수집 정보 (앱 사용 과정에서 자동으로 생성 및 수집되는 정보)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기기 정보:&lt;/b&gt; [기기 모델, 운영체제 버전, 고유 기기 식별자 (예: 광고 ID, 기기 ID), IP 주소, 기기 언어 설정, 앱 버전 등]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;예시: 기기 식별자 (서비스 오류 분석 및 통계), IP 주소 (보안 및 지역 서비스 제공)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용 기록:&lt;/b&gt; [앱 사용 빈도, 기능 사용 기록, 서비스 이용 시간, 접속 로그, 앱 충돌 정보 등]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;예시: 앱 사용 기록 (서비스 개선 및 사용자 경험 분석), 오류 로그 (버그 수정 및 안정성 확보)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;위치 정보:&lt;/b&gt; [사용자 동의하에 수집하는 경우에만 명시하세요. GPS 기반 위치, 네트워크 기반 (Wi-Fi, 셀룰러) 위치 등]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;예시: 정확한 위치 (위치 기반 서비스 제공, 예: 주변 상점 찾기), 대략적인 위치 (맞춤형 콘텐츠 제공)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;쿠키 및 유사 기술:&lt;/b&gt; [웹뷰를 사용하거나 웹 기반 기능이 있는 경우에만 명시하세요. 쿠키, 웹 비콘 등]
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;예시: 쿠키 (사용자 로그인 상태 유지 및 맞춤형 콘텐츠 제공)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 개인정보의 수집 및 이용 목적&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희는 수집한 개인정보를 다음의 목적으로 활용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서비스 제공 및 운영:&lt;/b&gt; [앱의 핵심 기능을 제공하고, 계정을 관리하며, 사용자 요청에 응답하고, 기술 지원을 제공합니다.]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서비스 개선 및 개발:&lt;/b&gt; [앱의 성능을 분석하고, 버그를 수정하며, 새로운 기능 및 서비스를 개발하여 사용자 경험을 향상시킵니다.]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;맞춤형 서비스 제공:&lt;/b&gt; [사용자의 이용 패턴을 분석하여 개인화된 콘텐츠, 추천 서비스, 맞춤 광고 등을 제공합니다.]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;마케팅 및 광고 (해당하는 경우):&lt;/b&gt; [이벤트 및 프로모션 안내, 맞춤형 광고 게재 등]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 및 부정 이용 방지:&lt;/b&gt; [서비스의 보안을 유지하고, 불법적이거나 승인되지 않은 활동을 방지합니다.]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;법적 의무 준수:&lt;/b&gt; [관련 법률 및 규정을 준수하고, 법적 요청에 응답합니다.]&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 개인정보의 제3자 제공 및 공유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희는 사용자의 동의 없이 개인정보를 외부에 제공하지 않습니다. 단, 서비스 제공을 위해 다음과 같이 개인정보를 제3자에게 제공하거나 공유할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[제3자 서비스 이름, 예: Google Analytics for Firebase]:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;제공 목적:&lt;/b&gt; [앱 사용 통계 분석, 서비스 개선]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제공 정보 유형:&lt;/b&gt; [기기 정보, 사용 기록, 앱 충돌 데이터 (개인 식별 불가능한 형태로)]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관련 정책:&lt;/b&gt; [해당 제3자 서비스의 개인정보처리방침 URL]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[제3자 서비스 이름, 예: AdMob (Google) / Facebook Audience Network (Meta)]:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;제공 목적:&lt;/b&gt; [맞춤형 광고 제공, 광고 효과 측정]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제공 정보 유형:&lt;/b&gt; [광고 ID, 기기 정보, 앱 사용 기록]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관련 정책:&lt;/b&gt; [해당 제3자 서비스의 개인정보처리방침 URL]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[결제대행사 이름, 예: Google Play Billing]:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;제공 목적:&lt;/b&gt; [결제 처리 및 정산]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제공 정보 유형:&lt;/b&gt; [결제 관련 정보 (신용카드 번호 등 민감 정보는 보통 직접 수집하지 않음), 거래 내역]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관련 정책:&lt;/b&gt; [해당 결제대행사 또는 플랫폼의 개인정보처리방침 URL]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;법적 의무:&lt;/b&gt; 관련 법률에 의거하거나 수사 목적으로 법률에서 정한 절차와 방법에 따라 수사기관의 요청이 있는 경우 개인정보를 제공할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 개인정보의 보관 및 파기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가. 보관 기간:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 개인정보는 원칙적으로 서비스 이용 목적이 달성되거나, 법률에 따른 보관 기간이 만료될 때까지 보관됩니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;예시: 회원 탈퇴 시, 모든 개인정보는 [즉시 또는 5일 이내, 30일 이내 등 구체적인 기간] 파기됩니다. 단, 관련 법령에 따라 보존해야 하는 정보는 해당 법령이 정한 기간 동안 보관됩니다.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나. 파기 절차 및 방법:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개인정보는 목적 달성 후 별도의 DB로 옮겨져(종이의 경우 별도 서류함) 관계 법령에 따라 일정 기간 저장된 후 파기됩니다.&lt;/li&gt;
&lt;li&gt;전자적 파일 형태로 저장된 개인정보는 기록을 재생할 수 없는 기술적 방법을 사용하여 삭제하며, 종이 문서에 저장된 개인정보는 분쇄기로 분쇄하거나 소각하여 파기합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 사용자 및 법정대리인의 권리 및 행사 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 (만 14세 미만 아동의 경우 법정대리인)는 언제든지 다음의 권리를 행사할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개인정보 열람 요구:&lt;/b&gt; 본인 또는 법정대리인의 개인정보에 대한 열람을 요구할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오류 등이 있을 경우 정정 요구:&lt;/b&gt; 개인정보에 오류가 있는 경우 정정을 요구할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;삭제 요구:&lt;/b&gt; 회원 탈퇴 등을 통해 개인정보의 삭제를 요구할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;처리 정지 요구:&lt;/b&gt; 개인정보 처리에 대한 정지를 요구할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 권리 행사는 [앱 내 설정 메뉴, 이메일 ([개인정보 보호 책임자 이메일 주소]), 또는 서면]을 통해 가능하며, 저희는 요청에 대해 지체 없이 조치하겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 개인정보의 안전성 확보 조치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희는 사용자의 개인정보를 안전하게 보호하기 위해 다음과 같은 조치를 취하고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기술적 조치:&lt;/b&gt; 개인정보 암호화, 보안 프로그램 설치 및 주기적 업데이트, 백업 시스템 운영 등&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관리적 조치:&lt;/b&gt; 개인정보 취급 직원의 최소화 및 교육, 접근 권한 관리, 내부 관리 계획 수립 및 시행 등&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 아동의 개인정보 보호&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희 앱은 원칙적으로 만 14세 미만의 아동을 대상으로 하지 않습니다. 만약 만 14세 미만 아동의 개인정보가 수집된 사실을 인지하게 될 경우, 해당 정보를 즉시 삭제할 것입니다. 만약 아동의 개인정보가 필요하다면, 관련 법령에 따라 법정대리인의 동의를 얻을 것입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. 개인정보 보호 책임자 및 연락처&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호와 관련하여 문의사항이나 불만사항이 있으시면 아래 연락처로 문의해 주시기 바랍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;회사/개인 개발자명:&lt;/b&gt; [귀하의 회사명 또는 개인 개발자 이름]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개인정보 보호 책임자:&lt;/b&gt; [이름 또는 직책, 예: 개인정보 보호 관리자]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이메일:&lt;/b&gt; [문의용 이메일 주소]&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9. 개인정보처리방침 변경&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 개인정보처리방침은 법령, 정책 또는 보안 기술의 변경에 따라 내용이 변경될 수 있으며, 변경 사항은 최소 7일 전에 [앱 내 공지, 웹사이트 공지 등 변경 고지 방법 명시]를 통해 사용자에게 고지됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;공고일:&lt;/b&gt; [2025년 7월 25일]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시행일:&lt;/b&gt; [2025년 7월 25일]&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 양식을 채우면서 다음 사항을 꼭 기억하세요:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정확성:&lt;/b&gt; 앱이 실제로 수집하고 사용하는 데이터를 정확하게 기재해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;투명성:&lt;/b&gt; 모호한 표현 없이, 사용자에게 모든 정보를 명확하게 전달해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최신성:&lt;/b&gt; 앱 기능이 변경되거나 새로운 SDK를 추가할 때마다 개인정보처리방침을 업데이트해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전문가 검토:&lt;/b&gt; 가능하면 법률 전문가의 검토를 받아 법적 문제 발생 가능성을 최소화하는 것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 양식이 플레이스토어 정책을 준수하는 개인정보처리방침을 작성하는 데 도움이 되기를 바랍니다.&lt;/p&gt;</description>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/151</guid>
      <comments>https://jdkblog.tistory.com/151#entry151comment</comments>
      <pubDate>Thu, 3 Jul 2025 15:53:41 +0900</pubDate>
    </item>
    <item>
      <title>페이스북앱 인스타그램앱 GOOGLE앱 안에 브라우저 체크</title>
      <link>https://jdkblog.tistory.com/149</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;//페이스북앱 인스타그램앱&amp;nbsp;따로처리하기&lt;/p&gt;&lt;p&gt;var ua = navigator.userAgent || navigator.vendor || window.opera;&lt;/p&gt;&lt;p&gt;if( (ua.indexOf(&quot;FBAN&quot;) &amp;gt; -1) || (ua.indexOf(&quot;FBAV&quot;) &amp;gt; -1) ||&amp;nbsp;(ua.indexOf('Instagram') &amp;gt; -1) ||&amp;nbsp;(ua.indexOf('GSA') &amp;gt; -1) ){&lt;/p&gt;&lt;p&gt;처리구문&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;</description>
      <category>JAVASCRIPT</category>
      <category>app browser</category>
      <category>facebook app browser</category>
      <category>instagram app browser</category>
      <category>javascript</category>
      <category>인스타그램앱</category>
      <category>인스타그램앱웹</category>
      <category>자바스크립트</category>
      <category>페이스북앱</category>
      <category>페이스북앱웹</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/149</guid>
      <comments>https://jdkblog.tistory.com/149#entry149comment</comments>
      <pubDate>Sat, 18 Apr 2020 10:59:29 +0900</pubDate>
    </item>
    <item>
      <title>jqxGrid 셀클릭시 이벤트 및 체크박스제어 및 event.args 일부</title>
      <link>https://jdkblog.tistory.com/147</link>
      <description>&lt;p&gt;//셀클릭시 이벤트&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;$(jqxGid셀렉터).on(&quot;cellclick&quot;, function (event){&lt;/p&gt;&lt;p style=&quot;margin-left: 8em;&quot;&gt;//값을 가져옵니다.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;var bool = $(jqxGid셀렉터).jqxGrid('getcellvalue', event.args.rowindex, &quot;columnName&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;console.log(&quot;bool :&quot;+bool);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if(bool){&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;alert(&quot;11&quot;);&lt;/p&gt;&lt;p style=&quot;margin-left: 12em;&quot;&gt;//값을 변경합니다.(고정값, row수, columnName, 값&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;$(jqxGid셀렉터).jqxGrid('setcellvalue', event.args.rowindex, 'columnName', false);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}else{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;alert(&quot;22&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;$(jqxGid셀렉터).jqxGrid('setcellvalue', event.args.rowindex, 'columnName', true);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;});&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;var column = event.args.column;&lt;/p&gt;&lt;p&gt;var rowindex = event.args.rowindex; // 몇번째줄인지&lt;/p&gt;&lt;p&gt;var columnindex = event.args.columnindex; // 몇번째 칼럼인지&lt;/p&gt;</description>
      <category>jqxGrid</category>
      <category>jqxgrid</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/147</guid>
      <comments>https://jdkblog.tistory.com/147#entry147comment</comments>
      <pubDate>Thu, 2 Apr 2020 17:37:16 +0900</pubDate>
    </item>
    <item>
      <title>레이어팝업으로 PDF 파일 띄우기</title>
      <link>https://jdkblog.tistory.com/143</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. HTML&lt;/p&gt;&lt;p&gt;&amp;lt;embed src=&quot;파일명&quot; width=&quot;600&quot; height=&quot;500&quot; alt=&quot;pdf&quot; pluginspage=&quot;http://www.adobe.com/products/acrobat/readstep2.html&quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;lt;style&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;#overlay_t { background-color: #000; bottom: 0; left: 0; opacity: 0.5; filter: alpha(opacity = 50); /* IE7 &amp;amp; 8 */ position: fixed; right: 0; top: 0; z-index: 99; display:none;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;#popup_layer { width:400px; margin-bottom:30px; background:#fff; border:solid 1px #ccc; position:absolute; top:260px; left:50%; margin-left:-200px; box-shadow: 0px 1px 20px #333; z-index:100; display:none;}&lt;/p&gt;&lt;p&gt;&amp;lt;/style&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. script&lt;/p&gt;&lt;p&gt;$(document).ready(function(){&lt;/p&gt;&lt;p&gt;$('#popup_layer, #overlay_t').show();&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;$('#overlay_t, .close').click(function(e){&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; e.preventDefault();&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $('#popup_layer, #overlay_t').hide();&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;&amp;nbsp; &amp;nbsp; });&amp;nbsp;&lt;/p&gt;</description>
      <category>CSS</category>
      <category>css</category>
      <category>CSS 레이어팝업</category>
      <category>PDF</category>
      <category>레이어 팝업</category>
      <category>레이어팝업</category>
      <category>레이어팝업 PDF</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/143</guid>
      <comments>https://jdkblog.tistory.com/143#entry143comment</comments>
      <pubDate>Tue, 10 Mar 2020 09:44:33 +0900</pubDate>
    </item>
    <item>
      <title>Linux Centos 인터넷 연결</title>
      <link>https://jdkblog.tistory.com/139</link>
      <description>&lt;p&gt;안녕하세요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Linux Centos 인터넷 설정입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 800px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998CE2465CA86B9345&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998CE2465CA86B9345&quot; width=&quot;800&quot; height=&quot;600&quot; filename=&quot;internat1.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 800px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9998C14A5CA86BAB33&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9998C14A5CA86BAB33&quot; width=&quot;800&quot; height=&quot;600&quot; filename=&quot;internat2.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;파일명은 약간 다를 수도 있습니다.(파일경로는 동일)&lt;/p&gt;&lt;p&gt;vi /etc/sysconfig/network-scripts/ifcfg-eth0&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;onboot=no -&amp;gt; onboot=yes 변경&lt;/p&gt;&lt;p&gt;!:wq (저장)&lt;/p&gt;&lt;p&gt;!;q!(미저장 종료)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;service network restart // 재시작&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 800px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99430A475CA86C9D08&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99430A475CA86C9D08&quot; width=&quot;800&quot; height=&quot;600&quot; filename=&quot;internat4.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;해당 화면에 인터넷 화면도 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;감사하니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <category>centos internet</category>
      <category>Linux</category>
      <category>linux centos</category>
      <category>리눅스</category>
      <category>리눅스 센토스</category>
      <category>리눅스 인터넷</category>
      <category>리눅스 인터넷연결</category>
      <category>센토스 인터넷</category>
      <author>JDK's blog</author>
      <guid isPermaLink="true">https://jdkblog.tistory.com/139</guid>
      <comments>https://jdkblog.tistory.com/139#entry139comment</comments>
      <pubDate>Sat, 6 Apr 2019 18:10:27 +0900</pubDate>
    </item>
  </channel>
</rss>