<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발새발</title>
    <link>https://im2ho.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 23 May 2026 11:39:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>칸쵸.</managingEditor>
    <image>
      <title>개발새발</title>
      <url>https://tistory1.daumcdn.net/tistory/6617775/attach/f7c1acce6c1242f0a6fa02e129d1e130</url>
      <link>https://im2ho.tistory.com</link>
    </image>
    <item>
      <title>[Spring] parameter 1 of constructor in required a bean of type 'org.springframework.security.crypto.password.passwordencoder' that could not be found.</title>
      <link>https://im2ho.tistory.com/65</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입 기능을 구현하려는 중...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안을 위해 Spring security에서 제공하는 기능 주 중 하나인 PasswordEncoder를 사용하고자했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #191d1f;&quot;&gt;&lt;span style=&quot;background-color: #191d1f; color: #c7cdd1;&quot;&gt;&lt;span style=&quot;color: #8dcbe2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; org.springframework.security.crypto.password.PasswordEncoder;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 import까지 야무지게 해왔는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #191d1f;&quot;&gt;
&lt;div style=&quot;background-color: #191d1f; color: #c7cdd1;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;***************************&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;APPLICATION FAILED TO START&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;***************************&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;Description:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;Parameter 1 of constructor in com.penpick.users.service.UserService required a bean of type 'org.springframework.security.crypto.password.PasswordEncoder' that could not be found.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;passwordEncoder가 bean으로 등록되지 않아서 생기는 문제같다.&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;고민 좀 하다가 SecurityConfig 파일에 들어가서 @Bean 설정한 메서드를 하나 추가해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #191d1f;&quot;&gt;
&lt;div style=&quot;background-color: #191d1f; color: #c7cdd1;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;@Bean&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #8dcbe2;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d197d9;&quot;&gt;PasswordEncoder&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;passwordEncoder&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;() {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d197d9;&quot;&gt;PasswordEncoder&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;encoder&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #8dcbe2;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;BCryptPasswordEncoder&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #8dcbe2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #79abff;&quot;&gt;encoder&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; }&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BCryptPasswordEncoder 를 Super Class로 하도록 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wjr2C/btsD0GaeKNQ/ZPteiSTBPR6v8u5PCcKLV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wjr2C/btsD0GaeKNQ/ZPteiSTBPR6v8u5PCcKLV0/img.png&quot; data-alt=&quot;DB 저장. 성공적.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wjr2C/btsD0GaeKNQ/ZPteiSTBPR6v8u5PCcKLV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwjr2C%2FbtsD0GaeKNQ%2FZPteiSTBPR6v8u5PCcKLV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;355&quot; height=&quot;120&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DB 저장. 성공적.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>오류잡기</category>
      <category>BCryptPasswordEncoder</category>
      <category>bean</category>
      <category>passwordencoder</category>
      <category>Spring</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/65</guid>
      <comments>https://im2ho.tistory.com/65#entry65comment</comments>
      <pubDate>Thu, 25 Jan 2024 17:23:58 +0900</pubDate>
    </item>
    <item>
      <title>로그인, 로그아웃 상태에 따른 화면 구현에 대한 고찰</title>
      <link>https://im2ho.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1.&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #f3c000;&quot;&gt;개발환경&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;React&lt;/b&gt;로 페이지 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SpringBoot&lt;/b&gt;로 서버 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;기존 코드&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #c5c8c6;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;React&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, { &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;useState&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;useEffect&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'react'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;BrowserRouter&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Router&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Routes&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'react-router-dom'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;axios&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'axios'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'./UserList'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;SignUp&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'./SignUp'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Login&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'./Login'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;App&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setUserEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;useState&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;isAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setIsAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;useState&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;useEffect&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;fetchUserData&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;axios&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'http://localhost:8080/userdata'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;withCredentials&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setUserEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9a9b99;&quot;&gt;// setAuthentication 함수 호출&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setAuthentication&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setIsAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'세션 데이터 불러오기 실패'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;fetchUserData&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; }, []);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9a9b99;&quot;&gt;// setAuthentication 함수를 외부로 분리&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setAuthentication&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;setIsAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setIsAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Router&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;UserList&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;isAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/signup&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;SignUp&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/login&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;Login&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;React &amp;amp; SpringBoot로 회원관리&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Routes&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; element&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;isAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/signup&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; element&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;SignUp&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/login&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; element&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Login&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Routes&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Router&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; );&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;App&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;문제점&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;문제 1)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;없을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;해결:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705750369557&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// isAuthenticated 값이 false인 경우 아무것도 렌더링 하지 않는 if문 추가
  if (!isAuthenticated) {
    return null;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;문제 2)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&amp;nbsp;될&amp;nbsp;경우&amp;nbsp;세션값이&amp;nbsp;존재하는&amp;nbsp;상황에서는&amp;nbsp;의도한&amp;nbsp;화면이&amp;nbsp;구현되나, &lt;br /&gt;문제는&amp;nbsp;로그아웃(세션값X)&amp;nbsp;상태에서&amp;nbsp;화면을&amp;nbsp;렌더링&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;아무것도&amp;nbsp;나오지&amp;nbsp;않는&amp;nbsp;불상사가&amp;nbsp;일어난다 &lt;br /&gt;세션값이 없는 상태에서 렌더링 되는 화면은 어떻게 지정할 것인가...?&lt;br /&gt;&lt;br /&gt;어쩐지&amp;nbsp;모순인&amp;nbsp;상황 &lt;br /&gt;1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 상태(세션값 O) -&amp;gt; 첫 렌더링(세션값 읽어오기 전) : 아무것도 리턴 X -&amp;gt; 세션값 읽어오고 재렌더링 : 로그인 상태에서 보일 요소 등장!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그아웃 상태(세션값x) -&amp;gt; 첫 렌더링(세션값 읽어오기 전) : 아무것도 리턴 X -&amp;gt; 세션값 읽어옴(여전히 값 없음) -&amp;gt; 아무것도 안보임&amp;nbsp; &lt;br /&gt;-&amp;gt; 아니 그럼 로그인은 어케함?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;해결:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어 해결했다!!!! if문과 함께 삼항연산자를 사용해서 해결 완료 ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;최종 코드&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #c5c8c6;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;React&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, { &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;useState&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;useEffect&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'react'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;BrowserRouter&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Router&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Routes&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'react-router-dom'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;axios&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'axios'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'./UserList'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;SignUp&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'./SignUp'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;Login&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'./Login'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;App&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setUserEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;useState&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;isAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setIsAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;useState&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;isLoading&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setIsLoading&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;useState&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;useEffect&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;fetchUserData&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;axios&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'http://localhost:8080/userdata'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;withCredentials&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setUserEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setAuthentication&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;res&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;console&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'세션 데이터 불러오기 실패'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;err&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;finally&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setIsLoading&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;fetchUserData&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; }, []);&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setAuthentication&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;userEmail&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;setIsAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9a9b99;&quot;&gt;// 초기 로딩 중에는 아무것도 반환X&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;isLoading&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9a9b99;&quot;&gt;// 초기 렌더링 시에는 세션값이 있는지 여부에 따라 적절한 화면을 반환&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Router&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;Main&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;isAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #408080;&quot;&gt;null&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ) &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/signup&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;SignUp&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/login&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;Login&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;React &amp;amp; SpringBoot로 회원관리&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Routes&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; element&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;isAuthenticated&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/signup&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; element&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;SignUp&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;/login&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; element&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Login&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Routes&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d0b344;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Router&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; );&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;App&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;~ 요약 ~&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. isLoading : 초기 로딩 중에는 null 반환해서 아무것도 안보이게 하기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. 그리고 세션값을 읽어와서 세션값 유무에 따라 다른 화면이 나타나게 하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. 삼항 연산자를 통해 isAuthenticated 상태에 따라 다른 인터페이스를 렌더링&lt;/p&gt;</description>
      <category>FRONT/React</category>
      <category>react</category>
      <category>springboot</category>
      <category>로그인</category>
      <category>세션</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/64</guid>
      <comments>https://im2ho.tistory.com/64#entry64comment</comments>
      <pubDate>Sat, 20 Jan 2024 20:42:35 +0900</pubDate>
    </item>
    <item>
      <title>멍청한 thymeleaf</title>
      <link>https://im2ho.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;나는... 내 잘못인줄로만 알고 멍청한 나를 자책했지만......&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니 그냥 멍청한 thymeleaf 탓이었음...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멍청한놈......... &lt;span style=&quot;background-color: #ffffff; font-size: 1.62em; letter-spacing: -1px;&quot;&gt; &lt;/span&gt;&lt;/p&gt;</description>
      <category>개발 일기</category>
      <category>Thymeleaf</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/63</guid>
      <comments>https://im2ho.tistory.com/63#entry63comment</comments>
      <pubDate>Mon, 8 Jan 2024 16:53:16 +0900</pubDate>
    </item>
    <item>
      <title>URI / URL / URN</title>
      <link>https://im2ho.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;URI&lt;/b&gt;&lt;/span&gt;(Uniform&amp;nbsp;Resource&amp;nbsp;Identifier)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;두&amp;nbsp;가지&amp;nbsp;유형&amp;nbsp;존재&amp;nbsp;URL&amp;nbsp;URN&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;URL&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;(Uniform&amp;nbsp;Resource&amp;nbsp;Locator)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;URI에&amp;nbsp;속해있는&amp;nbsp;Locator로&amp;nbsp;리소스가&amp;nbsp;어디에&amp;nbsp;있는지를&amp;nbsp;나타냄 &lt;br /&gt;URL은&amp;nbsp;일반적으로&amp;nbsp;프로토콜과&amp;nbsp;호스트명,&amp;nbsp;리소스&amp;nbsp;경로&amp;nbsp;등의&amp;nbsp;요소로&amp;nbsp;구성 &lt;br /&gt;**프로토콜(protocol)&amp;nbsp;:&amp;nbsp;http,&amp;nbsp;https&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; background-color: #f3c000;&quot;&gt;&lt;b&gt;URN&lt;/b&gt;&lt;/span&gt;(Uniform&amp;nbsp;Resource&amp;nbsp;Name)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;자원의&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;nbsp;식별자 &lt;br /&gt;&lt;br /&gt;서적으로&amp;nbsp;따지면&amp;nbsp;ISBN&amp;nbsp;과&amp;nbsp;도서&amp;nbsp;구역의&amp;nbsp;차이인듯&lt;/p&gt;</description>
      <category>코딩지식</category>
      <category>URI</category>
      <category>URL</category>
      <category>URN</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/60</guid>
      <comments>https://im2ho.tistory.com/60#entry60comment</comments>
      <pubDate>Fri, 5 Jan 2024 02:07:42 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 최종 commit을 변경하는 git amend</title>
      <link>https://im2ho.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;~ 상황 가정 ~&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나는 분명 작업 공간에&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt; test1.txt&lt;/span&gt;&lt;/b&gt; 파일을 만들었는데,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;커밋 메시지를 &lt;b&gt;&lt;i&gt;&quot;test3.txt 파일 생성&quot;&lt;/i&gt;&lt;/b&gt;이라고 실수로 잘못 작성해버렸다..!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mM0jz/btsCX6iyfnf/UC9ZeIRPeSRH2gtF9K7SYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mM0jz/btsCX6iyfnf/UC9ZeIRPeSRH2gtF9K7SYK/img.png&quot; data-alt=&quot;작업공간&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mM0jz/btsCX6iyfnf/UC9ZeIRPeSRH2gtF9K7SYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmM0jz%2FbtsCX6iyfnf%2FUC9ZeIRPeSRH2gtF9K7SYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;255&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;작업공간&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsMbZi/btsC6wNl6qq/0lGL6lwQBW7JJfl1j9FhXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsMbZi/btsC6wNl6qq/0lGL6lwQBW7JJfl1j9FhXk/img.png&quot; data-alt=&quot;아차 내 실수!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsMbZi/btsC6wNl6qq/0lGL6lwQBW7JJfl1j9FhXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsMbZi%2FbtsC6wNl6qq%2F0lGL6lwQBW7JJfl1j9FhXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;214&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아차 내 실수!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이전 커밋 기록이 존재한다면 &lt;i&gt;git reset --soft&lt;/i&gt;가 먹히겠지만,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;방금 전의 커밋이 작업 공간 내의 처음이자 마지막 커밋이라면 어떻게 할 것인가?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;??? : .git 폴더를 삭제하고 다시 git init 합니다&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;git amend&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;최종 커밋&lt;/span&gt;을 변경해주는 명령어&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확히 말하자면 &lt;b&gt;&lt;i&gt;git commit --amend -m &quot;변경내용&quot;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;으로 작성하는 것이 맞다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KMdo3/btsC6T2NZz7/HfPS4cGNhVLbBjLYbX3AG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KMdo3/btsC6T2NZz7/HfPS4cGNhVLbBjLYbX3AG1/img.png&quot; data-alt=&quot;변경된 커밋 메시지 확인 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KMdo3/btsC6T2NZz7/HfPS4cGNhVLbBjLYbX3AG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKMdo3%2FbtsC6T2NZz7%2FHfPS4cGNhVLbBjLYbX3AG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;634&quot; height=&quot;266&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;변경된 커밋 메시지 확인 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;다른 방법들&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Master branch에 순서대로 v1 / v2 / v3 / v3-1 / v3-2 라는 커밋이 기록되었다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;막상 커밋을 하고 보니, v3-2라는 메시지가 마음에 들지 않는다... 어떻게 할 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 1)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;git commit --amend -m &quot;변경메시지&quot;&lt;/i&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;v3-2가 브랜치의 Header(마지막 커밋)이기 때문에 적용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 2)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;git reset --soft v3-1 해시코드&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;git commit -m &quot;변경메시지&quot;&lt;/i&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;v3-2 이전에 커밋이 존재하기 때문에 적용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 3)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;git rebase i HEAD~3&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;I (INSERT실행)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;변경메시지 입력&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;esc&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;:wq&lt;/i&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;아싸리 가장 최근 커밋(v3-2)를 기점으로 바로 위 3개 커밋(v3-2, v3-1, v3)까지 &lt;span style=&quot;color: #ee2323;&quot;&gt;합쳐버린다&lt;/span&gt; (위 2개 방법과는 다른 결과)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi에디터에서 변경 메시지를 작성할 수 있다는 것이 특징&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;상황에 따라, 입맛따라 편하고 적당한거 골라서 잘 쓰는게 최고인 것같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정 어려우면 진짜 .git 삭제하고 git init 이 정답이 될지도 (단, 처음이자 마지막 커밋을 수정한다는 가정 하에)&lt;/p&gt;</description>
      <category>Git &amp;amp; GitHub</category>
      <category>git</category>
      <category>git amend</category>
      <category>git reset</category>
      <category>git revase</category>
      <category>vim</category>
      <category>vi에디터</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/59</guid>
      <comments>https://im2ho.tistory.com/59#entry59comment</comments>
      <pubDate>Fri, 5 Jan 2024 01:45:37 +0900</pubDate>
    </item>
    <item>
      <title>HTTP의 정의 및 구조</title>
      <link>https://im2ho.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;HTTP 란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Hypertext Transger Protocol&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트와 서버 간의 통신을 위한 프로토콜로, 주로 웹에서 데이터를 주고 받을 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;HTTP의 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;메서드 / 헤더(Header) / 바디(Body)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;메서드(GET, POST)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GET : 주로 api나 DB에서 데이터를 가지고 오는데 사용&lt;/li&gt;
&lt;li&gt;POST : DB나 서버에 데이터를 제출하고싶을 때 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;헤더(Header)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 토큰이나 캐시, 사용자 정보와같은 내용을 meta나 데이터 헤더부분을 이용해서 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈에 보이지는 않지만 중요한 정보를 담을 때 자주 사용된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;바디(Body)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 &amp;lt;input /&amp;gt;, &amp;lt;text /&amp;gt;, &amp;lt;textarea /&amp;gt;와 같이 태그의 내용이 DB에 실제로 전송되는 데이터를 포함하는 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;RESTful&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;REST 아키텍처 스타일을 따르는 웹 서비스로,&lt;br /&gt;HTTP와 URI 기반으로 자원에 접근할 수 있도록 제공하는 애플리케이션 개발 인터페이스&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자원(Resource) : url 주소에 담겨있는 모든 정보들&lt;/li&gt;
&lt;li&gt;표현(Representation) : url로 나타내는 자원의 표현법 (JSON, XML 등...&lt;/li&gt;
&lt;li&gt;상태전이(Stateless) : 서버는 요청을 저장하지 않고, 각각의 요청에 담아 정보가 표현된다&lt;/li&gt;
&lt;li&gt;통합 인터페이스(Uniform Interface) : 컴퓨터는 개발자가 지정해준 디자인으로 일관성있게 화면 데이터를 제공&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>코딩지식</category>
      <category>HTTP</category>
      <category>RESTful</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/55</guid>
      <comments>https://im2ho.tistory.com/55#entry55comment</comments>
      <pubDate>Tue, 2 Jan 2024 23:04:07 +0900</pubDate>
    </item>
    <item>
      <title>[ORACLE] cmd 창에서 계정 생성 및 권한 부여하기</title>
      <link>https://im2ho.tistory.com/53</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #191d1f;&quot;&gt;
&lt;div style=&quot;background-color: #191d1f; color: #c7cdd1;&quot;&gt;
&lt;div style=&quot;background-color: #191d1f; color: #c7cdd1;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;SQLPLUS&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;SYS&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;ORACLE&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; AS&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;SYSDBA&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;ALTER&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;SESSION&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;SET&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffc600;&quot;&gt;&quot;_ORACLE_SCRIPT&quot;&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; = TRUE;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;USER&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;아이디&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;IDENTIFIED&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;BY&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;비밀번호&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;// 밑으로는 전부 권한부여 (선택사항)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;GRANT&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;SESSION&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;TO&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; 아이디;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;GRANT &lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;CREATE&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;ANY&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;TABLE&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d25252;&quot;&gt;TO&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bed6ff;&quot;&gt;아이디&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;GRANT&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt; CONNECT, RESOURCE&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;, DBA TO &lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;아이디&lt;/span&gt;&lt;span style=&quot;color: #d8d8d8;&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL/ORACLE</category>
      <category>cmd</category>
      <category>oracle</category>
      <category>계정생성</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/53</guid>
      <comments>https://im2ho.tistory.com/53#entry53comment</comments>
      <pubDate>Tue, 2 Jan 2024 21:49:38 +0900</pubDate>
    </item>
    <item>
      <title>[React] React Hook - useContext</title>
      <link>https://im2ho.tistory.com/51</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;React에는 컴포넌트 간 데이터를 전달하는 대표적인 방법이 두 가지가 있는데,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 중 하나가 바로 &lt;b&gt;props&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;props는 데이터를 간편하게 넘기고 받을 수 있다는 장점이 있지만 어떤 상황에서는 굉장히 큰 문제가 된다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 컴포넌트 트리 구조가 굉장히 복잡하고 깊을 경우&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 위의 상황에서 자식 컴포넌트로 데이터를 전달하는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;소규모의 리액트 앱이라든지, 혹은 데이터 전달을 원하는 자식 컴포넌트가&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: center;&quot;&gt;부모 컴포넌트 바로 밑에&lt;/span&gt;&amp;nbsp;존재한다면 별 문제는 되지 않을 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 &lt;i&gt;자식의, 자식의, 자식의, 자식의, 자식의, ... , 자식의 컴포넌트에게 데이터&lt;/i&gt;를 전달 할 때는 어떻게 할 것인가?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;컴포넌트 전체에 공통적으로 필요한 데이터가 존재할 경우에는 어떻게 할 것인가?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이를테면 현재 로그인 된 사용자 정보, 사이트 테마, 언어 정보 등등 ...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;언제든 앱 내부에서는 수많은 컴포넌트에 쓰일 전역적 데이터가 존재할 수 있기 마련이다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 전역적 데이터를 props로 일일이 단계별로 전달하게 된다면 코드의 복잡도는 물론이고,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어느 한 곳에서 변경사항이 생기는 순간 이에 적용된 컴포넌트를 죄다 쥐잡듯 뒤져 찾아내서 수정해야하는 불상사가 일어난다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 등장한 것이 바로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;context&lt;/b&gt;&lt;/span&gt; API 라고 할 수 있겠다&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;Context&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;앱 내부에서 전역적으로 사용되는 데이터들을 &lt;br /&gt;여러 컴포넌트들끼리 쉽게 공유할 수 있는 방법을 제공해주는 API&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;context를 사용하게 된다면, props로 데이터를 일일이 전달하지 않아도 해당 데이터를 지닌 상위 컴포넌트는 하위 컴포넌트가 &lt;span style=&quot;color: #ee2323;&quot;&gt;트리 어디에 위치해있든지&lt;/span&gt; 상관 없이 데이터에 바로 접근 할 수 있도록 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 컴포넌트 트리 구조를 가진 앱이 있다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PHRIZ/btsCOCvaFHz/PCbiZ5rYrOT1UBHPAakBak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PHRIZ/btsCOCvaFHz/PCbiZ5rYrOT1UBHPAakBak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PHRIZ/btsCOCvaFHz/PCbiZ5rYrOT1UBHPAakBak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHRIZ%2FbtsCOCvaFHz%2FPCbiZ5rYrOT1UBHPAakBak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;248&quot; height=&quot;414&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 App이 지니고 있는 데이터를 C, E 컴포넌트에서 필요로 하는 상황이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;props를 사용한다면 데이터 전달을 어떻게 할 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xvIw5/btsCP6CQ043/ULBk07xbHh79hjY8r095qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xvIw5/btsCP6CQ043/ULBk07xbHh79hjY8r095qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xvIw5/btsCP6CQ043/ULBk07xbHh79hjY8r095qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxvIw5%2FbtsCP6CQ043%2FULBk07xbHh79hjY8r095qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;427&quot; height=&quot;375&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보다시피 트리의 가장 하단에 존재하는 C,E에서만 데이터가 필요함에도 불구하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 전달 과정에서 불필요하게 모든 중간 컴포넌트를 거쳐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. &lt;span style=&quot;background-color: #f3c000;&quot;&gt;useContext&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;context로 공유한 데이터를 쉽게 받아올 수 있도록 도와주는 hook&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 context를 사용할 경우는 어떻게 될 것인가?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;C와 E 컴포넌트에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;useContext&lt;/b&gt;&lt;/span&gt; hook을 사용하면 다른 컴포넌트를 거칠 필요가 없이 직접적으로 데이터를 받아올 수 있기에 아주 편리하다!&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;따라서 이번 글에서는 useContext를 활용한 간단한 테마변경 코드를 작성해보겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떤 페이지를 만들 것인가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;header, content, footer로 구성되며&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;footer에 있는 mode 버튼을 통해 light / dark 모드 적용이 가능한 페이지&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어떻게 만들 것인가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. context를 생성하는 별도의 컴포넌트 사용&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. header, content, footer에서 useContext를 사용하여 context 받아오기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. ThemeContext.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704123987741&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {createContext} from 'react';

//기본값 null
export const ThemeContext = createContext(null);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;createContext를 이용해 ThemeContext를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. App.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704125110117&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React,{useState} from 'react';
import '../../css/App.css';
import Page from './Page';
import { ThemeContext } from './ThemeContext';

export default function App() {
    
    const [isDark, setIsDark] = useState(false);
    
    return(
        //prop으로 value를 받음 &amp;gt; 전달하고자하는 데이터를 넣어준다
        //ThemeContext.Prodiver가 감싸는 모든 하위 component는 value로 집어넣어준 요소에 접근 가능해진다
        &amp;lt;ThemeContext.Provider value={{isDark, setIsDark}} &amp;gt;
            &amp;lt;Page /&amp;gt;
        &amp;lt;/ThemeContext.Provider&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- useState를 사용해서 isDark 기본값 false(light모드)로 세팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ThemeContext를 import 하고, ThemeContext.Provider를 통해 트리 안에 포함된 컴포넌트에 value를 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Headr.js &amp;amp; Content.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704125640127&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useContext } from &quot;react&quot;;
import { ThemeContext } from &quot;./ThemeContext&quot;;

//props로 isDark 받아옴
export default function Header() {

    const {isDark} = useContext(ThemeContext);

    return(
        &amp;lt;header className=&quot;header&quot;
            style={{
                backgroundColor : isDark ? 'black' : 'lightgray',
                color : isDark ? 'white' : 'black',
            }}
        &amp;gt;
            &amp;lt;h1&amp;gt;Welcome Page&amp;lt;/h1&amp;gt;
        &amp;lt;/header&amp;gt;
    )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1704125648656&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useContext } from &quot;react&quot;;
import { ThemeContext } from &quot;./ThemeContext&quot;;

export default function Content(){

    const {isDark} = useContext(ThemeContext);

    return(
        &amp;lt;div
            className=&quot;content&quot;
            style={{
                backgroundColor : isDark ? 'black' : 'white',
                color : isDark ? 'white' : 'black',
            }}
        &amp;gt;
            &amp;lt;p&amp;gt;오늘도 좋은 하루~~^^&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;꽃 한 송이 놓고 갑니다 @/-----&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- useContext를 통해 props로 isDark 받아오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 삼항 연산자를 통해 isDark의 상태에 따라 달라지는 style 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Footer.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704125805229&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useContext } from &quot;react&quot;;
import { ThemeContext } from &quot;./ThemeContext&quot;;

export default function Footer(){
    
    const {isDark, setIsDark} = useContext(ThemeContext);

    const toggleTheme = () =&amp;gt; {
        setIsDark(!isDark);
    };
    
    return(
        &amp;lt;footer
            className=&quot;footer&quot;
            style={{
                backgroundColor : isDark ? 'black' : 'lightgray',
            }}
        &amp;gt;
            &amp;lt;button className=&quot;button&quot; onClick={toggleTheme}&amp;gt;
                Dark Mode
            &amp;lt;/button&amp;gt;
        &amp;lt;/footer&amp;gt;
    )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- toggleTheme 함수를 생성해서 하단 버튼 누를시 isDark의 state 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Page.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704125870248&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from &quot;react&quot;;
import Content from './Content';
import Footer from './Footer';
import Header from './Header';

//isDark, setIsDark를 props로 받아와서 또 다른 자식 컴포넌트에 전달
//Page 자체에서는 isDark를 사용하지 않기 때문에, 단지 그냥 중간 컴포넌트의 역할을 한다
export default function Page() {

    return(
        &amp;lt;div className=&quot;page&quot;&amp;gt;
            &amp;lt;Header /&amp;gt;
            &amp;lt;Content /&amp;gt;
            &amp;lt;Footer /&amp;gt;
        &amp;lt;/div&amp;gt;
    );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- header / content / footer 컴포넌트를 묶어서 한 페이지를 꾸려줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;App.js 실행 결과&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mPZop/btsCU1G8N0x/8YmTQckGkb4rbfvvsyypWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mPZop/btsCU1G8N0x/8YmTQckGkb4rbfvvsyypWK/img.png&quot; data-alt=&quot;light(기본) 모드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mPZop/btsCU1G8N0x/8YmTQckGkb4rbfvvsyypWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmPZop%2FbtsCU1G8N0x%2F8YmTQckGkb4rbfvvsyypWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;375&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;light(기본) 모드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY01ON/btsCUX5Nx41/EXGiNEZjLwcojGKmU4dfd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY01ON/btsCUX5Nx41/EXGiNEZjLwcojGKmU4dfd0/img.png&quot; data-alt=&quot;Dark 모드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY01ON/btsCUX5Nx41/EXGiNEZjLwcojGKmU4dfd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY01ON%2FbtsCUX5Nx41%2FEXGiNEZjLwcojGKmU4dfd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;375&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dark 모드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;css는 따로 적용한거긴한데 그거 아니어도 작동은 잘 합니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 보니까 굳이 Page를 통해서 props를 전달할 필요가 없다는 점에서 context가 굉장히 편해보이고,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;실제로도 그렇긴 하지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;당연하게도 context 사용에도 주의사항이 존재한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;바로 컴포넌트 재사용이 어렵기 때문에 필요에 따라 적절하게 사용을 해야한다는 점..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 단순히 prop drilling을 피하고싶어서 context를 사용하려한다면 컴포넌트 합성 등&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다른 방안을 먼저 고안해보는 것도 방법이 될 수 있겠다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나도 자유자재로 쓰고싶은 hook... 익숙해질 날이 오겠지?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FvOA6/btsCP5qrDYs/YubiCtepJZVsjSC7byGxZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FvOA6/btsCP5qrDYs/YubiCtepJZVsjSC7byGxZk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FvOA6/btsCP5qrDYs/YubiCtepJZVsjSC7byGxZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFvOA6%2FbtsCP5qrDYs%2FYubiCtepJZVsjSC7byGxZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;240&quot; height=&quot;267&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>FRONT/React</category>
      <category>context</category>
      <category>Hook</category>
      <category>props</category>
      <category>react</category>
      <category>useContext</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/51</guid>
      <comments>https://im2ho.tistory.com/51#entry51comment</comments>
      <pubDate>Wed, 27 Dec 2023 01:30:17 +0900</pubDate>
    </item>
    <item>
      <title>[React] React와 DB를 연결하기 위한 환경 설정 (feat.Oracle)</title>
      <link>https://im2ho.tistory.com/50</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;프로젝트 내에서 front, back 나누기&amp;gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;원하는 워크스페이스 내에서 터미널 실행&lt;br /&gt;&lt;b&gt;&lt;i&gt;mkdir&amp;nbsp;폴더명&lt;/i&gt;&amp;nbsp;&lt;/b&gt;(혹은&amp;nbsp;그냥&amp;nbsp;직접&amp;nbsp;만들기) &lt;br /&gt;&lt;br /&gt;폴더&amp;nbsp;client,&amp;nbsp;server&amp;nbsp;만들고 &lt;br /&gt;&lt;b&gt;&lt;i&gt;mkdir&amp;nbsp;server &lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;npx&amp;nbsp;create-react-app&amp;nbsp;client&lt;/i&gt;&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;1)&amp;nbsp;client&amp;nbsp;폴더&amp;nbsp;들어가서 &lt;br /&gt;npm&amp;nbsp;i&amp;nbsp;axios &lt;br /&gt;&lt;br /&gt;2)&amp;nbsp;server&amp;nbsp;폴더&amp;nbsp;들어가서 &lt;br /&gt;npm&amp;nbsp;init&amp;nbsp;(package.json&amp;nbsp;생성)&amp;nbsp;:&amp;nbsp;package&amp;nbsp;세팅 &lt;br /&gt;npm&amp;nbsp;i&amp;nbsp;oracledb&amp;nbsp;express&amp;nbsp;(package.json&amp;nbsp;내에&amp;nbsp;express,&amp;nbsp;oracledb&amp;nbsp;설치&amp;nbsp;확인&amp;nbsp;가능) &lt;br /&gt;npm&amp;nbsp;i&amp;nbsp;cors &lt;br /&gt;&lt;br /&gt;server.js&amp;nbsp;작성&amp;nbsp;완료&amp;nbsp;후&amp;nbsp;server에서&amp;nbsp;npm&amp;nbsp;start실행해서&amp;nbsp;테스트&amp;nbsp;&amp;gt;&amp;nbsp;Server&amp;nbsp;시작&amp;nbsp;:&amp;nbsp;http://localhost:5000 &lt;br /&gt;&lt;br /&gt;백엔드&amp;nbsp;연결&amp;nbsp;확인&amp;nbsp;되면&amp;nbsp;client&amp;nbsp;실행 &lt;br /&gt;npm&amp;nbsp;start&lt;/p&gt;</description>
      <category>FRONT/React</category>
      <category>cors</category>
      <category>express</category>
      <category>OracleDB</category>
      <category>react</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/50</guid>
      <comments>https://im2ho.tistory.com/50#entry50comment</comments>
      <pubDate>Tue, 26 Dec 2023 14:28:31 +0900</pubDate>
    </item>
    <item>
      <title>[Git] commit 무효화하기 (git reset)</title>
      <link>https://im2ho.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전관리의 또 다른 효용 : 과거로 돌아가기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋을 취소하는 명령어 git reset (사용에 주의가 필요함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재의 로그를 취소해서 과거(이전 버전)로 돌아가고싶은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법 1 : reset / 방법 2 : revert&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;특정&amp;nbsp;버전의&amp;nbsp;상태로&amp;nbsp;돌아가고싶다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;git&amp;nbsp;reset&amp;nbsp;커밋id&amp;nbsp;&amp;nbsp;--hard&lt;/b&gt; &lt;br /&gt;&amp;gt;&amp;nbsp;해당&amp;nbsp;커밋&amp;nbsp;이후의&amp;nbsp;버전&amp;nbsp;삭제&amp;nbsp;&amp;amp;&amp;nbsp;해당&amp;nbsp;버전으로&amp;nbsp;복귀 &lt;br /&gt;hard&amp;nbsp;:&amp;nbsp;심플한&amp;nbsp;작동을&amp;nbsp;위해&amp;nbsp;적용한&amp;nbsp;옵션(안전성&amp;nbsp;매우&amp;nbsp;떨어짐)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;그 외에 soft와 mixed 옵션도 존재하는데 잘 쓸 일은 없다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt; git reset 커밋id --soft, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;git reset 커밋id --mixed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;눈으로&amp;nbsp;보기에는&amp;nbsp;log에&amp;nbsp;존재하지&amp;nbsp;않는&amp;nbsp;이후&amp;nbsp;버전이&amp;nbsp;삭제&amp;nbsp;된&amp;nbsp;것처럼&amp;nbsp;보이지만,&amp;nbsp;git은&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;nbsp;==&amp;nbsp;복구&amp;nbsp;가능) &lt;br /&gt;&lt;br /&gt;후에&amp;nbsp;원격저장소&amp;nbsp;github를&amp;nbsp;통해서&amp;nbsp;협업&amp;nbsp;가능 &lt;br /&gt;저장소의&amp;nbsp;버전을&amp;nbsp;인터넷을&amp;nbsp;통해&amp;nbsp;공유 &lt;br /&gt;공유&amp;nbsp;이후에는&amp;nbsp;git&amp;nbsp;reset를&amp;nbsp;절대절대로&amp;nbsp;해서는x &lt;br /&gt;내&amp;nbsp;컴퓨터&amp;nbsp;안에만&amp;nbsp;있는&amp;nbsp;버전에&amp;nbsp;대해서만&amp;nbsp;reset&amp;nbsp;작업을&amp;nbsp;진행하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;git&amp;nbsp;revert&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;reset과&amp;nbsp;달리,&amp;nbsp;해당&amp;nbsp;커밋을&amp;nbsp;취소하면서&amp;nbsp;새로운&amp;nbsp;버전을&amp;nbsp;생성한다 &lt;br /&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;nbsp;잘&amp;nbsp;알아두자&lt;/p&gt;</description>
      <category>Git &amp;amp; GitHub</category>
      <category>git reset</category>
      <category>git revert</category>
      <author>칸쵸.</author>
      <guid isPermaLink="true">https://im2ho.tistory.com/48</guid>
      <comments>https://im2ho.tistory.com/48#entry48comment</comments>
      <pubDate>Mon, 25 Dec 2023 23:41:52 +0900</pubDate>
    </item>
  </channel>
</rss>