<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>RATSENO</title>
    <link>https://ratseno.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 8 May 2026 07:27:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>RATSENO</managingEditor>
    <item>
      <title>Spring Securtiy 정적 자원 접근 허용</title>
      <link>https://ratseno.tistory.com/118</link>
      <description>&lt;pre id=&quot;code_1652745443899&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
                .requestMatchers().hasAnyRole(&quot;ADMIN&quot;).antMatchers(&quot;/&quot;).permitAll()
                .anyRequest().authenticated();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1652745452334&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DEV/SPRING</category>
      <category>resource</category>
      <category>Security</category>
      <category>Spring</category>
      <category>허용</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/118</guid>
      <comments>https://ratseno.tistory.com/118#entry118comment</comments>
      <pubDate>Tue, 17 May 2022 08:58:08 +0900</pubDate>
    </item>
    <item>
      <title>Vue3 프로젝트 생성</title>
      <link>https://ratseno.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Vite&lt;/b&gt;를 사용하여 시작&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;npm init vite-app hello-vue3 # 또는 yarn create vite-app hello-vue3
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;b&gt;vue-cli&lt;/b&gt;를 사용하여 시작&lt;/div&gt;
&lt;pre class=&quot;llvm&quot;&gt;&lt;code&gt;npm install -g @vue/cli # 또는 yarn global add @vue/cli
vue create hello-vue3
# select vue 3 preset&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DEV/JS</category>
      <category>ViTE</category>
      <category>vue-cli</category>
      <category>vue3</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/117</guid>
      <comments>https://ratseno.tistory.com/117#entry117comment</comments>
      <pubDate>Mon, 25 Apr 2022 09:58:18 +0900</pubDate>
    </item>
    <item>
      <title>STS에서 gradle 프로젝트 git에서 import하기</title>
      <link>https://ratseno.tistory.com/115</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC1lfM/btrl4NeTHl2/q5rBAab2T2iZ404ttMY400/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC1lfM/btrl4NeTHl2/q5rBAab2T2iZ404ttMY400/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC1lfM/btrl4NeTHl2/q5rBAab2T2iZ404ttMY400/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC1lfM%2Fbtrl4NeTHl2%2Fq5rBAab2T2iZ404ttMY400%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;552&quot; height=&quot;393&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;gradle 프로젝트를 로컬에 clone한 상태&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck2Vth/btrl43oh6fX/8O6xPVnec1UJOsm9ovld5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck2Vth/btrl43oh6fX/8O6xPVnec1UJOsm9ovld5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck2Vth/btrl43oh6fX/8O6xPVnec1UJOsm9ovld5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck2Vth%2Fbtrl43oh6fX%2F8O6xPVnec1UJOsm9ovld5k%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;482&quot; height=&quot;559&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Package Explore창에서 우클릭 =&amp;gt; Import 클릭&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHxiSz/btrl4yPTUtr/HLpHMg1ihpkQkST86nkz60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHxiSz/btrl4yPTUtr/HLpHMg1ihpkQkST86nkz60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHxiSz/btrl4yPTUtr/HLpHMg1ihpkQkST86nkz60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHxiSz%2Fbtrl4yPTUtr%2FHLpHMg1ihpkQkST86nkz60%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;616&quot; height=&quot;578&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Gradle =&amp;gt; Existing Gradle Project 클릭&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D9ASV/btrl6Oqmtjg/EbzgrJYkDID2IJpVLjxeGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D9ASV/btrl6Oqmtjg/EbzgrJYkDID2IJpVLjxeGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D9ASV/btrl6Oqmtjg/EbzgrJYkDID2IJpVLjxeGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD9ASV%2Fbtrl6Oqmtjg%2FEbzgrJYkDID2IJpVLjxeGK%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;799&quot; height=&quot;488&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에서 clone한 폴더로 선택&lt;/span&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX2WgI/btrl4LOUMfO/PqZcOJdofmJzMSFLeFUAU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX2WgI/btrl4LOUMfO/PqZcOJdofmJzMSFLeFUAU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX2WgI/btrl4LOUMfO/PqZcOJdofmJzMSFLeFUAU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX2WgI%2Fbtrl4LOUMfO%2FPqZcOJdofmJzMSFLeFUAU1%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;709&quot; height=&quot;900&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K99bp/btrl5vSpYrp/MkjUMR49dm4wcXLjIpjbY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K99bp/btrl5vSpYrp/MkjUMR49dm4wcXLjIpjbY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K99bp/btrl5vSpYrp/MkjUMR49dm4wcXLjIpjbY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK99bp%2Fbtrl5vSpYrp%2FMkjUMR49dm4wcXLjIpjbY0%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;716&quot; height=&quot;901&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;finish 클릭&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하기전에 Gradle Project structer에 오류가 출력될수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그를땐&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZUktN/btrl1YO79Ae/00BywILCWoMS2vv4YwQQ80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZUktN/btrl1YO79Ae/00BywILCWoMS2vv4YwQQ80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZUktN/btrl1YO79Ae/00BywILCWoMS2vv4YwQQ80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZUktN%2Fbtrl1YO79Ae%2F00BywILCWoMS2vv4YwQQ80%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;750&quot; height=&quot;718&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Window =&amp;gt; preferences =&amp;gt; gradle 입력.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Java home에 본인의 Java home을 셋팅해주고 다시 시도해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC/TIP</category>
      <category>Gradle</category>
      <category>import</category>
      <category>sts4</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/115</guid>
      <comments>https://ratseno.tistory.com/115#entry115comment</comments>
      <pubDate>Wed, 24 Nov 2021 21:59:44 +0900</pubDate>
    </item>
    <item>
      <title>STS에서 Spring boot 인스턴스 여러개 띄우기</title>
      <link>https://ratseno.tistory.com/114</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;633&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDQdoF/btrhe0KxHMc/CWBbCEcsIGCDQ1yrV1CeSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDQdoF/btrhe0KxHMc/CWBbCEcsIGCDQ1yrV1CeSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDQdoF/btrhe0KxHMc/CWBbCEcsIGCDQ1yrV1CeSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDQdoF%2Fbtrhe0KxHMc%2FCWBbCEcsIGCDQ1yrV1CeSK%2Fimg.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;633&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;474&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X2H8C/btrhestI7TQ/KsPZVVAZATTJmgN2AXreC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X2H8C/btrhestI7TQ/KsPZVVAZATTJmgN2AXreC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X2H8C/btrhestI7TQ/KsPZVVAZATTJmgN2AXreC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX2H8C%2FbtrhestI7TQ%2FKsPZVVAZATTJmgN2AXreC1%2Fimg.png&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;474&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;서버 포트를 9001번으로 설정한 Spring boot application 하나가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;같은 소스로 해당 어플리케이션을 여러개의 인스턴스로 띄우고 싶다(9002번, 9003번...)&lt;/span&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 alignLeft&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;399&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cegJLC/btrhjsTCiLm/NsnMShjdAbBeit1fkkRLh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cegJLC/btrhjsTCiLm/NsnMShjdAbBeit1fkkRLh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cegJLC/btrhjsTCiLm/NsnMShjdAbBeit1fkkRLh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcegJLC%2FbtrhjsTCiLm%2FNsnMShjdAbBeit1fkkRLh0%2Fimg.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;399&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&lt;b&gt;Run&lt;/b&gt; 아이콘 옆에 화살표 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;b&gt;Run Configurations&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 alignLeft&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;869&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bolr13/btrhe0qeyO7/m8rm1fxPAEi5LsTLlv6r70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bolr13/btrhe0qeyO7/m8rm1fxPAEi5LsTLlv6r70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bolr13/btrhe0qeyO7/m8rm1fxPAEi5LsTLlv6r70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbolr13%2Fbtrhe0qeyO7%2Fm8rm1fxPAEi5LsTLlv6r70%2Fimg.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;869&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;Spring Boot App&lt;/b&gt; 우클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;New Configuration&lt;/b&gt; 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;462&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UGH07/btrhfytxsYD/UwvofwiJpz1WkSsJnROYyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UGH07/btrhfytxsYD/UwvofwiJpz1WkSsJnROYyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UGH07/btrhfytxsYD/UwvofwiJpz1WkSsJnROYyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUGH07%2FbtrhfytxsYD%2FUwvofwiJpz1WkSsJnROYyK%2Fimg.png&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;462&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. &lt;b&gt;프로젝트&lt;/b&gt; 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. &lt;b&gt;Main Class&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 alignLeft&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;778&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogQ9I/btrhglHrQK9/DGxMlmwrtrk3vkupQIwCNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogQ9I/btrhglHrQK9/DGxMlmwrtrk3vkupQIwCNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogQ9I/btrhglHrQK9/DGxMlmwrtrk3vkupQIwCNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FogQ9I%2FbtrhglHrQK9%2FDGxMlmwrtrk3vkupQIwCNk%2Fimg.png&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;778&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. &lt;b&gt;Vm arguments&lt;/b&gt;에 &lt;b&gt;-Dserver.port=XXXX&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 alignLeft&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;326&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3zzmA/btrhdwQYzcO/ciPycGrUNPvOkd7ikT7c3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3zzmA/btrhdwQYzcO/ciPycGrUNPvOkd7ikT7c3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3zzmA/btrhdwQYzcO/ciPycGrUNPvOkd7ikT7c3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3zzmA%2FbtrhdwQYzcO%2FciPycGrUNPvOkd7ikT7c3K%2Fimg.png&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;326&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 원하는 인스턴스로 어플리케이션 실행&lt;/p&gt;</description>
      <category>ETC/TIP</category>
      <category>Application</category>
      <category>instance</category>
      <category>Spring</category>
      <category>spring boot</category>
      <category>STS</category>
      <category>여러개</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/114</guid>
      <comments>https://ratseno.tistory.com/114#entry114comment</comments>
      <pubDate>Sun, 10 Oct 2021 19:08:30 +0900</pubDate>
    </item>
    <item>
      <title>Function 생성자 사용하여, 문자열로된 표현식 실행하기</title>
      <link>https://ratseno.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;angular와 vue와 같은 프런트엔드 프레임워크에서 자주 보이는 디렉티브가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;p v-if=&quot;seen&quot;&amp;gt;이제 나를 볼 수 있어요&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저렇게 문자열로 되어있는 조건문을 그냥 js, jQuery를 이용해서 비슷하게 써보고 싶었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;찾아보니 &lt;b&gt;new Function()&lt;/b&gt; 생성자를 이용하여 구현할 수 있을 것 같아 사용해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1621496297732&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset='utf-8'&amp;gt;
  &amp;lt;meta http-equiv='X-UA-Compatible' content='IE=edge'&amp;gt;
  &amp;lt;title&amp;gt;Page Title&amp;lt;/title&amp;gt;
  &amp;lt;meta name='viewport' content='width=device-width, initial-scale=1'&amp;gt;

  &amp;lt;!-- jquery를 사용하기 위해 jquery cdn 사용 --&amp;gt;
  &amp;lt;script
  src=&quot;https://code.jquery.com/jquery-3.6.0.min.js&quot;
  integrity=&quot;sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=&quot;
  crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;!-- &amp;lt;h1 id=&quot;test&quot;&amp;gt;&amp;lt;/h1&amp;gt; --&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div id=&quot;testDiv&quot;&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;li data-expression=&quot;'테스트1'==='테스트1'&quot;&amp;gt;테스트1&amp;lt;/li&amp;gt;
      &amp;lt;li data-expression=&quot;'테스트2'==='테스트1'&quot;&amp;gt;테스트2&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #caece6;&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c5e478;&quot;&gt;data-expression&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d9f5dd;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #ecc48d;&quot;&gt;'테스트1'==='테스트1'&lt;/span&gt;&lt;span style=&quot;color: #d9f5dd;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d6deeb;&quot;&gt;테스트1&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #caece6;&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #caece6;&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c5e478;&quot;&gt;data-expression&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d9f5dd;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #ecc48d;&quot;&gt;'테스트2'==='테스트1'&lt;/span&gt;&lt;span style=&quot;color: #d9f5dd;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d6deeb;&quot;&gt;테스트2&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #caece6;&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color: #7fdbca;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;data-expression=&quot;'테스트2'==='테스트1'&quot;&amp;nbsp;&lt;/b&gt;data속성으로 expression을 생성하고 값으로 조건식인&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ecc48d;&quot;&gt;'테스트1'==='테스트1'&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문자열을 적어주었습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;저 조건식이 실행하여 true일 때 false일 때 style을 변경해 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1621496534860&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset='utf-8'&amp;gt;
  &amp;lt;meta http-equiv='X-UA-Compatible' content='IE=edge'&amp;gt;
  &amp;lt;title&amp;gt;Page Title&amp;lt;/title&amp;gt;
  &amp;lt;meta name='viewport' content='width=device-width, initial-scale=1'&amp;gt;
  &amp;lt;!-- 작성한 test.js  --&amp;gt;
  &amp;lt;script src='./test.js'&amp;gt;&amp;lt;/script&amp;gt;

  &amp;lt;!-- jquery를 사용하기 위해 jquery cdn 사용 --&amp;gt;
  &amp;lt;script
  src=&quot;https://code.jquery.com/jquery-3.6.0.min.js&quot;
  integrity=&quot;sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=&quot;
  crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;!-- &amp;lt;h1 id=&quot;test&quot;&amp;gt;&amp;lt;/h1&amp;gt; --&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div id=&quot;testDiv&quot;&amp;gt;
    &amp;lt;ul&amp;gt;
      &amp;lt;li data-expression=&quot;'테스트1'==='테스트1'&quot;&amp;gt;테스트1&amp;lt;/li&amp;gt;
      &amp;lt;li data-expression=&quot;'테스트2'==='테스트1'&quot;&amp;gt;테스트2&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(function(){
  
  var $div = $(&quot;#testDiv&quot;);
  var $lis = $div.find(&quot;li&quot;);
  
  $lis.each(function(idx, el){
    var $el = $(el);
    //조건식
    var exp = $el.data(&quot;expression&quot;);
    //Function 생성자를 이용하여 Function 생성
    var expFn = new Function('return'+' '+exp);
    // 조건문 함수 실행
    if(expFn()){
      $el.attr('style' ,'color : red;');
    }else{
      $el.attr('style' ,'color : blue;');
    }
  })
});
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;318&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0lSat/btq5nfrJPp3/2u1mHugBoHPWzdzH6kfES1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0lSat/btq5nfrJPp3/2u1mHugBoHPWzdzH6kfES1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0lSat/btq5nfrJPp3/2u1mHugBoHPWzdzH6kfES1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0lSat%2Fbtq5nfrJPp3%2F2u1mHugBoHPWzdzH6kfES1%2Fimg.png&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;318&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정상적으로 조건문이 실행되었습니다. 하지만 보안상 문제가 생길 수도 있기 때문에, 되도록이면 지양하는 것이 좋을 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공식 문서에는 eval()보다는 덜 위험하다고 합니다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1621496663041&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Function - JavaScript | MDN&quot; data-og-description=&quot;Function 생성자는 새 Function 객체를 만듭니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ckQ5Z4/hyKgKFwtpU/JUtqCNMG7ZsWOSh28eXHmK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ckQ5Z4/hyKgKFwtpU/JUtqCNMG7ZsWOSh28eXHmK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Function - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Function 생성자는 새 Function 객체를 만듭니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DEV/JS</category>
      <category>function</category>
      <category>JavaScript</category>
      <category>jQuery</category>
      <category>JS</category>
      <category>문자열</category>
      <category>조건문</category>
      <category>조건식</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/113</guid>
      <comments>https://ratseno.tistory.com/113#entry113comment</comments>
      <pubDate>Thu, 20 May 2021 16:45:16 +0900</pubDate>
    </item>
    <item>
      <title>Url Parameter 사용하기</title>
      <link>https://ratseno.tistory.com/112</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://ratseno.tistory.com/manage/newpost/?type=post&amp;amp;returnURL=%2Fmanage%2Fposts%2F&quot;&gt;https://ratseno.tistory.com/manage/newpost/?type=post&amp;amp;returnURL=%2Fmanage%2Fposts%2F&lt;/a&gt; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp;위의 URL에서 ?(물음표)뒤에 key=value 형식으로 &amp;amp;로 구분되어 사용되는 Url Parameter를 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용하는 간단한 Util을 만들어보겠습니다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;폴더를 하나 새로 생성하고, &lt;b&gt;test.js&lt;/b&gt; 파일을 생성하여 아래 내용을 작성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1621301897663&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;window.UrlUtil = (function(util){

  //Url Parameter Object 반환
  //동일한 이름의 parameter는 value에 list로 반환
  util.urlParameters = (function(){
    var qPos = window.document.URL.indexOf('?');
    var qParams = {};
    if(qPos&amp;gt;-1){
      var qStr = window.document.URL.substr(qPos+1);
      var temp = qStr.split('&amp;amp;');
      var t, key, value;
      for(var i=0; i&amp;lt;temp.length; i++){
        t = temp[i].split('=');
        if(t[0]){
          key = t[0];
        }else{
          continue;
        }
        value = t[1] ? t[1] : &quot;&quot;;
        if(qParams[key] != undefined){
          if(!qParams[key].join){
            var tempVal = qParams[key];
            qParams[key] = [tempVal];
          }
          qParams[key].push((value)? decodeURIComponent(value) : value)
        }else{
          qParams[key] = (value) ? decodeURIComponent(value) : value;
        }
      }
    }
    return qParams;
  });

  //Url parameter value 반환
  //-name : parameter name
  //-defaultValue : 해당 parameter가 없을 때 반환하는 기본값
  util.getUrlParameter = function(name, defaultValue){
    if(!name){
      return defaultValue != undefined ? defaultValue : null;
    }
    return util.urlParameters[name] || (defaultValue != undefined ? defaultValue : null);
  };

  return util;
}({}));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;window.UrlUtil = (function(util){&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;util.XXXXXX = function(){&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return util;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;}({}));&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;브라우저 전역객체인 &lt;b&gt;window 객체&lt;/b&gt;에 &lt;b&gt;UrlUtil&lt;/b&gt;이라는 변수를 셋팅합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;셋팅하는 동시에 &lt;span style=&quot;color: #202122;&quot;&gt;즉시 호출되는 함수 또는 즉시 호출되는 함수 표현식(Immediately Invoked Function Expression 또는 IIFE)를 사용하여 &lt;b&gt;UrlUtil&lt;/b&gt;에 할당합니다. 즉시실행함수의 argument로 선언되어 있는 &lt;b&gt;util&lt;/b&gt;에 &lt;b&gt;{}(객체)&lt;/b&gt;가 할당되고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;이 util이라는 이름의 객체에 &lt;b&gt;util.XXXXXXX&lt;/b&gt; 형식으로 사용할 함수들을 선언하여 할당합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;그리고 &lt;b&gt;return util;&lt;/b&gt; 을 함으로써 즉시실행함수의 내부에서 할당된 메서드들이 &lt;b&gt;window.UrlUtil&lt;/b&gt;로 할당되게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #202122;&quot;&gt;클로저 개념과, 즉시실행함수 키워드로 검색해보시면 많은 도움이 될것 같습니다.&lt;/span&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에 작성한 test.js를 사용하기 위해 &lt;b&gt;test.html&lt;/b&gt;을 생성하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1621302533721&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset='utf-8'&amp;gt;
  &amp;lt;meta http-equiv='X-UA-Compatible' content='IE=edge'&amp;gt;
  &amp;lt;title&amp;gt;Page Title&amp;lt;/title&amp;gt;
  &amp;lt;meta name='viewport' content='width=device-width, initial-scale=1'&amp;gt;
  &amp;lt;!-- 작성한 test.js  --&amp;gt;
  &amp;lt;script src='./test.js'&amp;gt;&amp;lt;/script&amp;gt;

  &amp;lt;!-- jquery를 사용하기 위해 jquery cdn 사용 --&amp;gt;
  &amp;lt;script
  src=&quot;https://code.jquery.com/jquery-3.6.0.min.js&quot;
  integrity=&quot;sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=&quot;
  crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;h1 id=&quot;test&quot;&amp;gt;&amp;lt;/h1&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
$(function(){
  var paramObj = window.UrlUtil.urlParameters();
  $(&quot;#test&quot;).text(JSON.stringify(paramObj));
});
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;1611&quot; data-origin-height=&quot;708&quot; width=&quot;751&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9g7Bw/btq5aq70BLU/p4vNiIgX8RSal1CRn2lDj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9g7Bw/btq5aq70BLU/p4vNiIgX8RSal1CRn2lDj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9g7Bw/btq5aq70BLU/p4vNiIgX8RSal1CRn2lDj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9g7Bw%2Fbtq5aq70BLU%2Fp4vNiIgX8RSal1CRn2lDj1%2Fimg.png&quot; data-origin-width=&quot;1611&quot; data-origin-height=&quot;708&quot; width=&quot;751&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;var paramObj = window.UrlUtil.urlParameters();&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;window 전역 객체에 선언된 UrlUtil을 사용합니다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;var paramObj = UrlUtil.urlParameters();&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞의 window를 생략하여도 무방합니다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;감사합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>DEV/JS</category>
      <category>JavaScript</category>
      <category>jQuery</category>
      <category>JS</category>
      <category>url parameter</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/112</guid>
      <comments>https://ratseno.tistory.com/112#entry112comment</comments>
      <pubDate>Tue, 18 May 2021 10:53:15 +0900</pubDate>
    </item>
    <item>
      <title>두개의 List에서 변경된 항목 필터링</title>
      <link>https://ratseno.tistory.com/111</link>
      <description>&lt;pre id=&quot;code_1620718025644&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        List&amp;lt;Item&amp;gt; asisList = new ArrayList&amp;lt;&amp;gt;();
        asisList.add(new Item(1L,&quot;아이템1&quot;));
        asisList.add(new Item(2L,&quot;아이템2&quot;));
        asisList.add(new Item(3L,&quot;아이템3&quot;));

        List&amp;lt;Item&amp;gt; tobeList = new ArrayList&amp;lt;&amp;gt;();
        tobeList.add(new Item(1L,&quot;아이템1&quot;));
        tobeList.add(new Item(2L,&quot;아이템2입니다.&quot;));//이름 변경
        tobeList.add(new Item(3L,&quot;아이템3입니다.&quot;));//이름 변경

        tobeList.forEach(item1 -&amp;gt; {
            asisList.stream()
                    .filter(item2-&amp;gt; item2.getId()==item1.getId())
                    .map(temp-&amp;gt;{
                        System.out.println(temp);
                        return temp;
                    })
                    .findFirst()
                    .map(temp2-&amp;gt;{
                        System.out.println(&quot;===findFirst===&quot;);
                        System.out.println(temp2.getId());
                        System.out.println(&quot;===============&quot;);
                        return temp2;
                    })
                    .ifPresent(item2-&amp;gt; {
                        if(!item2.getName().equals(item1.getName())){
                            System.out.println(&quot;이름이 &quot;+item2.getName()+&quot;에서 \'&quot;+item1.getName()+&quot;\'으로 변경&quot;);
                        }
                    });
        });
        //이름이 아이템2에서 '아이템2입니다.'으로 변경
		//이름이 아이템3에서 '아이템3입니다.'으로 변경&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Optional&amp;lt;T&amp;gt; findFirst();&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-해당 스트림의 첫번째 요소를 Optional로 반환&lt;/span&gt;&lt;/p&gt;</description>
      <category>DEV/JAVA</category>
      <category>Java</category>
      <category>list</category>
      <category>Stream</category>
      <category>변경</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/111</guid>
      <comments>https://ratseno.tistory.com/111#entry111comment</comments>
      <pubDate>Tue, 11 May 2021 16:33:44 +0900</pubDate>
    </item>
    <item>
      <title>두개의 List에서 삭제된 항목, 추가된 항목 필터링</title>
      <link>https://ratseno.tistory.com/110</link>
      <description>&lt;pre id=&quot;code_1620715868267&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Item&amp;gt; asisList = new ArrayList&amp;lt;&amp;gt;();
asisList.add(new Item(1L,&quot;아이템1&quot;));
asisList.add(new Item(2L,&quot;아이템2&quot;));
asisList.add(new Item(5L,&quot;아이템5&quot;));

List&amp;lt;Item&amp;gt; tobeList = new ArrayList&amp;lt;&amp;gt;();
tobeList.add(new Item(1L,&quot;아이템1&quot;));
tobeList.add(new Item(2L,&quot;아이템2&quot;));
tobeList.add(new Item(3L,&quot;아이템3&quot;));
tobeList.add(new Item(4L,&quot;아이템4&quot;));

//아이템3과, 아이템4과 나와야함
List&amp;lt;Item&amp;gt; addedItemList = new ArrayList&amp;lt;&amp;gt;(tobeList);
addedItemList.removeIf(item1-&amp;gt;asisList.stream().anyMatch(item2-&amp;gt;item2.getId()== item1.getId()));

//아이템5가 나와야함
List&amp;lt;Item&amp;gt; deletedItemList = new ArrayList&amp;lt;&amp;gt;(asisList);
deletedItemList.removeIf(item1-&amp;gt;tobeList.stream().filter(item2-&amp;gt;item2.getId()==item1.getId()).count()&amp;gt;0);

System.out.println(addedItemList);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;default boolean &lt;b&gt;removeIf&lt;/b&gt;(Predicate&amp;lt;? super E&amp;gt; filter)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&lt;span style=&quot;color: #333333;&quot;&gt;Predicate, 람다 표현식으로 전달된 조건문이 true인 경우 해당 요소를 제거&lt;/span&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;boolean &lt;/span&gt;&lt;b&gt;&lt;span&gt;anyMatch&lt;/span&gt;&lt;/b&gt;(Predicate&amp;lt;? &lt;span&gt;super &lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&amp;gt; predicate)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Predicate&lt;/span&gt;, 람다 표현식으로 전달된 조건문이 요소들 중에서 &lt;b&gt;하나라도 true인 경우&lt;/b&gt;, &lt;b&gt;true 반환&lt;/b&gt;&lt;/span&gt;&lt;/span&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Stream&amp;lt;&lt;span&gt;T&lt;/span&gt;&amp;gt; &lt;b&gt;&lt;span&gt;filter&lt;/span&gt;&lt;/b&gt;(Predicate&amp;lt;? &lt;span&gt;super &lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&amp;gt; predicate)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Predicate&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;, 람다 표현식으로 전달된 조건문이 true인 요소들로 이루어진 Stream을 반환.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>DEV/JAVA</category>
      <category>Java</category>
      <category>list</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/110</guid>
      <comments>https://ratseno.tistory.com/110#entry110comment</comments>
      <pubDate>Tue, 11 May 2021 16:07:55 +0900</pubDate>
    </item>
    <item>
      <title>[1]Spring boot + Spring Security + JWT + MySQL(docker)</title>
      <link>https://ratseno.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인증 방식 중의 하나인 토큰(JWT) 인증에 대해서 간단히 정리해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아주 간단하게 JWT를 이용한 인증 프로세스에 대해서 정리하자면&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.username(ID), password를 로그인 API에 전달한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 서버에서는 username, password를 이용하여 해당 회원의 유효성 검증을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 유효한 username, password라면 서버 내 secretKey와 회원 정보를 이용한 JWT를 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 생성된 JWT를 Client(사용자)에게 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5. 사용자는 습득한 JWT를 이용하여 요청하고자 하는 API에 같이 포함하여 호출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;6. 서버에서는 API요청이 들어왔을 때 포함되어있는 JWT의 유효성을 검증한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;7. 유효한 JWT라면 요청한 API에 대한 응답 값을 반환한다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위의 프로세스가 가장 기본적인 프로세스라고 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;역시 직접 만들어보는 것이 이해가 빠르기에 차근차근 만들어보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;378&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/734Hx/btq4p2ODqML/j9q6xfaJ34XKrBOfsZJWvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/734Hx/btq4p2ODqML/j9q6xfaJ34XKrBOfsZJWvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/734Hx/btq4p2ODqML/j9q6xfaJ34XKrBOfsZJWvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F734Hx%2Fbtq4p2ODqML%2Fj9q6xfaJ34XKrBOfsZJWvk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;378&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;완성된 프로젝트의 구성은 위와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;먼저 프로젝트를 생성하겠습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://start.spring.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;start.spring.io/&lt;/a&gt; 를 이용하여 생성하셔도 되며 편한 대로 생성하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;의존성은 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620542520596&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;
	&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
	&amp;lt;parent&amp;gt;
		&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
		&amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt;
		&amp;lt;version&amp;gt;2.4.5&amp;lt;/version&amp;gt;
		&amp;lt;relativePath/&amp;gt; &amp;lt;!-- lookup parent from repository --&amp;gt;
	&amp;lt;/parent&amp;gt;
	&amp;lt;groupId&amp;gt;com.taskagile&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;app&amp;lt;/artifactId&amp;gt;
	&amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;
	&amp;lt;name&amp;gt;jwt-sample&amp;lt;/name&amp;gt;
	&amp;lt;description&amp;gt;Demo project for Spring Boot&amp;lt;/description&amp;gt;
	&amp;lt;properties&amp;gt;
		&amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt;
	&amp;lt;/properties&amp;gt;
	&amp;lt;dependencies&amp;gt;
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt;
		&amp;lt;/dependency&amp;gt;

		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;
		&amp;lt;/dependency&amp;gt;
	
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt;
			&amp;lt;version&amp;gt;0.9.1&amp;lt;/version&amp;gt;
		&amp;lt;/dependency&amp;gt;	
		
		&amp;lt;dependency&amp;gt;
			&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
			&amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt;
			&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
		&amp;lt;/dependency&amp;gt;
		
	&amp;lt;/dependencies&amp;gt;

	&amp;lt;build&amp;gt;
		&amp;lt;plugins&amp;gt;
			&amp;lt;plugin&amp;gt;
				&amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
				&amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;
			&amp;lt;/plugin&amp;gt;
		&amp;lt;/plugins&amp;gt;
	&amp;lt;/build&amp;gt;

&amp;lt;/project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;프로젝트를 생성하고 구동하면 에러가 발생할 것입니다. 의존성에 ORM을 사용하기 위해 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;lt;artifactId&amp;gt;spring-boot-starter-data-jpa&amp;lt;/artifactId&amp;gt;&lt;/b&gt; 와 &lt;b&gt;&amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;&lt;/b&gt;를 추가하였는데&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아직 DB설정을 작성하지 않았기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MySQL을 사용할 것이기 때문에 먼저 MySQL을 세팅하겠습니다. 저는 Docker 사용하여 간단하게 생성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존 로컬 PC에 MySQL이 설치되어 있다면 넘어가셔도 되는 부분입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Docker가 PC에 설치되어 있다면, CMD창을 열고 아래의 명령어를 입력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620542802370&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d --name docker-mysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DB명은 &lt;b&gt;docker-mysql&lt;/b&gt;이고 MYSQL_ROOT_PASSWORD는 &quot;password&quot;, 컨테이너의 3306 포트를 PC의 3306 포트와 연결,&lt;br /&gt;&lt;/span&gt;설치되는 mysql의 이미지는 최신 tag로 mysql 컨테이너를 구동하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boezwY/btq4qz6pZCw/FT1pvwx8ntAloF6R0rSniK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boezwY/btq4qz6pZCw/FT1pvwx8ntAloF6R0rSniK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boezwY/btq4qz6pZCw/FT1pvwx8ntAloF6R0rSniK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboezwY%2Fbtq4qz6pZCw%2FFT1pvwx8ntAloF6R0rSniK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컨테이너가 RUNNING으로 정상적으로 띄워졌습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MySQL Wokrbench 또는 DBeaver와 같은 SQL클라이언트로 해당 컨테이너에 접근하여 확인할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://ratseno.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ratseno.tistory.com/108&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1620543190183&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;docker로 실행한 mysql 8.0 컨테이너에 DBeaver로 접근하기&quot; data-og-description=&quot;docker run -d -p 3306:3306 --name docker-msyql -e MYSQL_ROOT_PASSWORD=password mysql:latest docker로 실행한 mysql 8.0대의 컨테이너에 DBeaver를 이용하여 접근할 경우 추가적인 설정이 필요합니다. auto..&quot; data-og-host=&quot;ratseno.tistory.com&quot; data-og-source-url=&quot;https://ratseno.tistory.com/108&quot; data-og-url=&quot;https://ratseno.tistory.com/108&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cnOmUk/hyJ7VNC81O/kKx6Nqbzl9Oz1IIhZt51d1/img.png?width=711&amp;amp;height=299&amp;amp;face=0_0_711_299,https://scrap.kakaocdn.net/dn/t2Zag/hyJ72svLck/2ZyuPSLeuIZge3WRYPI1S0/img.png?width=711&amp;amp;height=299&amp;amp;face=0_0_711_299,https://scrap.kakaocdn.net/dn/Je9lA/hyJ9JLBb8M/N1gnCb5rqrbOXobhjyEWpk/img.png?width=1258&amp;amp;height=758&amp;amp;face=0_0_1258_758&quot;&gt;&lt;a href=&quot;https://ratseno.tistory.com/108&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ratseno.tistory.com/108&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cnOmUk/hyJ7VNC81O/kKx6Nqbzl9Oz1IIhZt51d1/img.png?width=711&amp;amp;height=299&amp;amp;face=0_0_711_299,https://scrap.kakaocdn.net/dn/t2Zag/hyJ72svLck/2ZyuPSLeuIZge3WRYPI1S0/img.png?width=711&amp;amp;height=299&amp;amp;face=0_0_711_299,https://scrap.kakaocdn.net/dn/Je9lA/hyJ9JLBb8M/N1gnCb5rqrbOXobhjyEWpk/img.png?width=1258&amp;amp;height=758&amp;amp;face=0_0_1258_758');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;docker로 실행한 mysql 8.0 컨테이너에 DBeaver로 접근하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;docker run -d -p 3306:3306 --name docker-msyql -e MYSQL_ROOT_PASSWORD=password mysql:latest docker로 실행한 mysql 8.0대의 컨테이너에 DBeaver를 이용하여 접근할 경우 추가적인 설정이 필요합니다. auto..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;ratseno.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기왕 CMD창을 열었으니, 커멘드 창에서 확인해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620543237096&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it docker-mysql bash&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm83Bu/btq4qAqJ2bK/NLSoaJYJK9Lpl0BDwFhWyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm83Bu/btq4qAqJ2bK/NLSoaJYJK9Lpl0BDwFhWyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm83Bu/btq4qAqJ2bK/NLSoaJYJK9Lpl0BDwFhWyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm83Bu%2Fbtq4qAqJ2bK%2FNLSoaJYJK9Lpl0BDwFhWyK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해당 컨테이너에 접근하여 bash를 실행하고,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NnB72/btq4wvuKJ74/6CyXrYrGVAcApkxEZl9k7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NnB72/btq4wvuKJ74/6CyXrYrGVAcApkxEZl9k7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NnB72/btq4wvuKJ74/6CyXrYrGVAcApkxEZl9k7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNnB72%2Fbtq4wvuKJ74%2F6CyXrYrGVAcApkxEZl9k7K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1620543332776&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mysql -u root -p&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;입력 후 패스워드를 입력하면 mysql을 사용할 수 있습니다.&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 MySql세팅은 끝났으니, DB 연결 설정을 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MHvE4/btq4sqnqYME/Kg5WZqzhl5zAaRRM3GsPX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MHvE4/btq4sqnqYME/Kg5WZqzhl5zAaRRM3GsPX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MHvE4/btq4sqnqYME/Kg5WZqzhl5zAaRRM3GsPX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMHvE4%2Fbtq4sqnqYME%2FKg5WZqzhl5zAaRRM3GsPX1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1620543463014&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.datasource.url=jdbc:mysql://localhost:3306/jwt_test_db?createDatabaseIfNotExist=true&amp;amp;autoReconnect=true&amp;amp;useSSL=false&amp;amp;allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.platform=mysql

spring.jpa.hibernate.ddl-auto=create-drop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;application.properties파일을 생성하고, MySql 정보를 작성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파일 하단에 jpa로 시작하는 세팅이 보입니다. 해당 내용은 hibernate를 사용할 때&amp;nbsp;&lt;span&gt;데이터베이스 초기화 전략을 설정할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;create-drop은 &lt;span&gt;SessionFactory가 시작될 때 drop 및 생성을 실행하고, SessionFactory가 종료될 때 drop을 실행합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;span&gt;로컬에서 개발을 시작할 때 DB를 삭제했다가 다시 생성하여 깨끗하게 실행하고 싶을 때 사용됩니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;span&gt;운영에서 이러한 옵션 값을 사용한다면 큰일이 나겠죠?? 집에서 공부할 때 쓰면 되겠습니다.&lt;/span&gt;&lt;/span&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;span&gt;이제 프로젝트를 구동하면 정상적으로 실행될 것입니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;633&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t57J2/btq4p7WubJj/S3EGMDi5DWeCjDwiTbhXy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t57J2/btq4p7WubJj/S3EGMDi5DWeCjDwiTbhXy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t57J2/btq4p7WubJj/S3EGMDi5DWeCjDwiTbhXy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft57J2%2Fbtq4p7WubJj%2FS3EGMDi5DWeCjDwiTbhXy0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;633&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인증 테스트에 사용될 간단한 API를 호출 테스트도 할 겸 생성하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620544855180&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.ratseno.controller.rest;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleRestController {
	
	@GetMapping(value = &quot;/hello&quot;)
	public String helloWorld() {
		return &quot;hello world!&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Postman 또는 RestClient 아니면 웹브라우저를 이용하여 &lt;span&gt;localhost:8080/hello를 호출해보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;348&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ItkD/btq4rdaQynx/Q1JO5LLxbnr4BWf1xsbOA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ItkD/btq4rdaQynx/Q1JO5LLxbnr4BWf1xsbOA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ItkD/btq4rdaQynx/Q1JO5LLxbnr4BWf1xsbOA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ItkD%2Fbtq4rdaQynx%2FQ1JO5LLxbnr4BWf1xsbOA1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;348&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;추후 인증 프로세스를 작성하게 되면, 해당 API를 호출할 때 JWT가 없으면 인증 오류가 내려올 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;399&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xEZWb/btq4rdhC4np/qCTHvkokMRJB0FCKzFMW3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xEZWb/btq4rdhC4np/qCTHvkokMRJB0FCKzFMW3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xEZWb/btq4rdhC4np/qCTHvkokMRJB0FCKzFMW3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxEZWb%2Fbtq4rdhC4np%2FqCTHvkokMRJB0FCKzFMW3k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;399&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;회원 인증을 하기 위해서는 먼저 회원을 등록하는 API가 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;User에 관련된 Controller, Service, Repository(DAO)등 필요한 Class들을 생성하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620545424811&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.ratseno.dto;

public class UserDTO {

	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;UserDTO는 통신을 위한 데이터 세팅용 Class입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620545519479&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.ratseno.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name = &quot;user&quot;)
public class UserEntity {

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

	@Column
	private String username;

	@Column
	@JsonIgnore
	private String password;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;UserEntity Class는 JPA를 사용할 때 사용되는 Class입니다. @Entity 어노테이션을 통해 해당 클래스가 Entity 클래스임을 나타내며, @Table(name=&quot;user&quot;) 어노테이션을 통하여 user테이블에 맵핑된 클래스임을 나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;application.properties파일에 &lt;a href=&quot;http://spring.jpa.hibernate.ddl-auto=create-drop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;spring.jpa.hibernate.ddl-auto=create-drop&lt;/a&gt; 옵션을 통하여 user 테이블이 자동 생성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620545674977&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.ratseno.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.ratseno.entity.UserEntity;

@Repository
public interface UserRepository extends JpaRepository&amp;lt;UserEntity, Integer&amp;gt; {
	UserEntity findByUsername(String username);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;UserRepository 클래스는 MyBatis를 사용할 때 주로 쓰이는 DAO, Mapper의 개념과 동일하다고 보시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;JpaRepository를 상속받았으며, 위에서 생성한 UserEntity를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620545772299&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.ratseno.service;

import com.ratseno.dto.UserDTO;
import com.ratseno.entity.UserEntity;

public interface UserService {

	public UserEntity userSave(UserDTO userDTO);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1620545790479&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.ratseno.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import com.ratseno.dto.UserDTO;
import com.ratseno.entity.UserEntity;
import com.ratseno.repository.UserRepository;
import com.ratseno.service.UserService;

@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private UserRepository userRepository;

	@Autowired
	private PasswordEncoder passwordEncoder;

	@Override
	public UserEntity userSave(UserDTO userDTO){
		UserEntity findUser = userRepository.findByUsername(userDTO.getUsername());
		UserEntity userEntity = new UserEntity();
		userEntity.setUsername(userDTO.getUsername());
		userEntity.setPassword(passwordEncoder.encode(userDTO.getPassword()));
		return userRepository.save(userEntity);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1620545824921&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.ratseno.controller.rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.ratseno.dto.UserDTO;
import com.ratseno.service.UserService;

@RestController
public class UserController {

	@Autowired
	private UserService userService;

	@PostMapping(value = &quot;/regist&quot;)
	public ResponseEntity&amp;lt;?&amp;gt; saveUser(@RequestBody UserDTO user) throws Exception {
		return ResponseEntity.ok(userService.userSave(user));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;POST localhost:8080/regist로 Body부분에 JSON형식으로 username, password를 담아 전달하게 되면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간단하게 회원등록이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;526&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/56GW8/btq4uHI0lfG/iLQPCwJwy3eXSKTWE1qwK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/56GW8/btq4uHI0lfG/iLQPCwJwy3eXSKTWE1qwK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/56GW8/btq4uHI0lfG/iLQPCwJwy3eXSKTWE1qwK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F56GW8%2Fbtq4uHI0lfG%2FiLQPCwJwy3eXSKTWE1qwK1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;526&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 포스팅에서는 등록된 회원정보로 JWT를 생성하고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;JWT의 유효성을 검증하는 프로세스를 작성해보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;github - &lt;a href=&quot;https://github.com/RATSENO/springboot-jwt-mysql&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/RATSENO/springboot-jwt-mysql&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1620546180848&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;RATSENO/springboot-jwt-mysql&quot; data-og-description=&quot;spring boot + spring security + jwt + mysql(docker) - RATSENO/springboot-jwt-mysql&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/RATSENO/springboot-jwt-mysql&quot; data-og-url=&quot;https://github.com/RATSENO/springboot-jwt-mysql&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ezfIx/hyJ9X4aqjL/JiuPvfC3l0hqrefWrEnYi0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/RATSENO/springboot-jwt-mysql&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/RATSENO/springboot-jwt-mysql&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ezfIx/hyJ9X4aqjL/JiuPvfC3l0hqrefWrEnYi0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;RATSENO/springboot-jwt-mysql&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;spring boot + spring security + jwt + mysql(docker) - RATSENO/springboot-jwt-mysql&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고 - &lt;a href=&quot;https://www.javainuse.com/spring/jwt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.javainuse.com/spring/jwt&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1620546213464&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;What is JWT | JavaInUse&quot; data-og-description=&quot;if (document.getElementById(&amp;quot;here&amp;quot;)) { $(document).ready(function(){ setInterval(function(){ $(&amp;quot;#here&amp;quot;).load(window.location.href + &amp;quot; #here&amp;quot; ); }, 30000); }); } --&amp;gt; &amp;copy; Copyright JavaInUse. All Rights Reserved. Privacy Policy&quot; data-og-host=&quot;www.javainuse.com&quot; data-og-source-url=&quot;https://www.javainuse.com/spring/jwt&quot; data-og-url=&quot;https://www.javainuse.com/spring/jwt&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.javainuse.com/spring/jwt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.javainuse.com/spring/jwt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;What is JWT | JavaInUse&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;if (document.getElementById(&quot;here&quot;)) { $(document).ready(function(){ setInterval(function(){ $(&quot;#here&quot;).load(window.location.href + &quot; #here&quot; ); }, 30000); }); } --&amp;gt; &amp;copy; Copyright JavaInUse. All Rights Reserved. Privacy Policy&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.javainuse.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DEV/SPRING</category>
      <category>docker</category>
      <category>jwt</category>
      <category>MySQL</category>
      <category>SpringBoot</category>
      <category>springsecurity</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/109</guid>
      <comments>https://ratseno.tistory.com/109#entry109comment</comments>
      <pubDate>Sun, 9 May 2021 16:42:27 +0900</pubDate>
    </item>
    <item>
      <title>docker로 실행한 mysql 8.0 컨테이너에 DBeaver로 접근하기</title>
      <link>https://ratseno.tistory.com/108</link>
      <description>&lt;pre id=&quot;code_1620191930674&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -d -p 3306:3306 --name docker-msyql -e MYSQL_ROOT_PASSWORD=password mysql:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmNblw/btq4cG5oNcm/Ny2PGFC2jbUy3fyHsQJ3Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmNblw/btq4cG5oNcm/Ny2PGFC2jbUy3fyHsQJ3Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmNblw/btq4cG5oNcm/Ny2PGFC2jbUy3fyHsQJ3Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmNblw%2Fbtq4cG5oNcm%2FNy2PGFC2jbUy3fyHsQJ3Wk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;docker로 실행한 mysql 8.0대의 컨테이너에 DBeaver를 이용하여 접근할 경우 추가적인 설정이 필요합니다.&lt;/span&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 alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;717&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/salR8/btq4c1VKzoz/E8Cr5owGq56AqVGhAz4nT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/salR8/btq4c1VKzoz/E8Cr5owGq56AqVGhAz4nT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/salR8/btq4c1VKzoz/E8Cr5owGq56AqVGhAz4nT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsalR8%2Fbtq4c1VKzoz%2FE8Cr5owGq56AqVGhAz4nT1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;717&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;711&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsAI4t/btq4buq2fWh/I3AQFxdV2WvFbxu42l3kNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsAI4t/btq4buq2fWh/I3AQFxdV2WvFbxu42l3kNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsAI4t/btq4buq2fWh/I3AQFxdV2WvFbxu42l3kNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsAI4t%2Fbtq4buq2fWh%2FI3AQFxdV2WvFbxu42l3kNk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;711&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HCtam/btq4f1Hg992/9owp6crkZIpihzy5brJOhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HCtam/btq4f1Hg992/9owp6crkZIpihzy5brJOhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HCtam/btq4f1Hg992/9owp6crkZIpihzy5brJOhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHCtam%2Fbtq4f1Hg992%2F9owp6crkZIpihzy5brJOhK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kd6kB/btq4bKmV7Ql/UurA39uDwPeIU3krqunsi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kd6kB/btq4bKmV7Ql/UurA39uDwPeIU3krqunsi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kd6kB/btq4bKmV7Ql/UurA39uDwPeIU3krqunsi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKd6kB%2Fbtq4bKmV7Ql%2FUurA39uDwPeIU3krqunsi0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MU7nY/btq4bmGPao4/g32ZskG0Sgysr5fWmjrKf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MU7nY/btq4bmGPao4/g32ZskG0Sgysr5fWmjrKf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MU7nY/btq4bmGPao4/g32ZskG0Sgysr5fWmjrKf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMU7nY%2Fbtq4bmGPao4%2Fg32ZskG0Sgysr5fWmjrKf0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;autoReconnect=true&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;useSSL=false&lt;/span&gt;&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;allowPublicKeyRetrieval=true&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>DEV/DevOps</category>
      <category>DBeaver</category>
      <category>docker</category>
      <category>MYSQL8.0</category>
      <author>RATSENO</author>
      <guid isPermaLink="true">https://ratseno.tistory.com/108</guid>
      <comments>https://ratseno.tistory.com/108#entry108comment</comments>
      <pubDate>Wed, 5 May 2021 14:25:42 +0900</pubDate>
    </item>
  </channel>
</rss>