<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>제뉴어리의 모든것</title>
    <link>https://januaryman.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 21 Jul 2026 11:06:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>제뉴어리맨</managingEditor>
    <image>
      <title>제뉴어리의 모든것</title>
      <url>https://tistory1.daumcdn.net/tistory/4420186/attach/d993b084cf1447b7a815328cca8dc781</url>
      <link>https://januaryman.tistory.com</link>
    </image>
    <item>
      <title>[백준] [Silver1] 24467 - 혼자 하는 윷놀이</title>
      <link>https://januaryman.tistory.com/781</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 원문&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot; style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;오전 4시, 민재는 윷놀이를 하고 싶어졌다. 하지만 다들 자는 시간이라 윷놀이를 같이 할 사람은 없었다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;민재는 윷놀이를 혼자 할 수 있는 방법을 생각해냈다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;혼자 하는 윷놀이에 적용되는 규칙은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;처음에 말은 윷판의 오른쪽 아래에 위치한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;열 번의 차례 안에 말 하나가 완주하면 민재가 승리한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;차례 한 번에는 윷가락 네 개를 던진 후:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;뒷면이 하나인 경우 말을 한 칸 전진시킨다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;뒷면이 둘인 경우 말을 두 칸 전진시킨다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;뒷면이 셋인 경우 말을 세 칸 전진시킨다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;모두 뒷면인 경우 말을 네 칸 전진시킨 뒤, 윷을 추가로 던진다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;모두 앞면인 경우 말을 다섯 칸 전진시킨 뒤, 윷을 추가로 던진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;윷판을 정해진 경로로 한 바퀴를 돌아 윷판의 오른쪽 아래에 도착한 뒤 한 칸 더 움직여야 &amp;nbsp;완주할 수 있다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;혼자 하나의 말로 하는 게임이므로 상대 말을 잡거나 자신의 말을 업는 경우는 없다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;일반적인 윷놀이의 낙과 뒷도 등의 룰은 고려하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;게임이 진행될 윷놀이판은 다음과 같다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUVxoX/btsO3ENAdWL/KT0VODtvkgYbDow60RhulK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUVxoX/btsO3ENAdWL/KT0VODtvkgYbDow60RhulK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUVxoX/btsO3ENAdWL/KT0VODtvkgYbDow60RhulK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUVxoX%2FbtsO3ENAdWL%2FKT0VODtvkgYbDow60RhulK%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;856&quot; height=&quot;862&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;윷판에서 말이 갈 수 있는 길은 그림과 같이 네 가지이다.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csH7mL/btsO3D2awrF/umMG3ZzecwmcvolKSgglc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csH7mL/btsO3D2awrF/umMG3ZzecwmcvolKSgglc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csH7mL/btsO3D2awrF/umMG3ZzecwmcvolKSgglc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsH7mL%2FbtsO3D2awrF%2FumMG3ZzecwmcvolKSgglc1%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;1083&quot; height=&quot;265&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;빈 원으로 표시된 위치에 말이 놓이면 상대적으로 짧은 길로 가야한다. 그 위치에 놓이지 않는다면 상대적으로 먼 길로 가야 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;민재의 승리 여부를 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄부터 민재가 윷가락을 어떻게 던졌는지 순서대로 주어진다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;각 줄에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;0과&lt;span&gt;&amp;nbsp;&lt;/span&gt;1로 이루어진 길이가&lt;span&gt;&amp;nbsp;&lt;/span&gt;4&lt;span aria-hidden=&quot;true&quot;&gt;$4$&lt;/span&gt;인 문자열이 주어진다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;0은 윷가락 뒷면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;1은 윷가락 앞면을 나타낸다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;민재는&amp;nbsp;완주하더라도&lt;span&gt;&amp;nbsp;&lt;/span&gt;10&lt;span aria-hidden=&quot;true&quot;&gt;$10$&lt;/span&gt;턴을&amp;nbsp;모두 진행할 때까지 윷을 계속 던진다. 단,&lt;span&gt;&amp;nbsp;&lt;/span&gt;50&lt;span aria-hidden=&quot;true&quot;&gt;$50$&lt;/span&gt;줄을 초과하는 입력은 주어지지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;마지막 입력은 도, 개, 걸 중 하나로 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;민재가 혼자 하는 윷놀이에서 이겼다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;WIN, 졌다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;LOSE를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1111
0011
1111
0011
1111
0011
1111
0011
1111
0011
1111
0011
1111
0011
1111
0011
1111
0011
1111
0011
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;ebnf&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;WIN
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;0110
0011
1010
1101
0011
1101
1010
1010
0111
1101&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;본인 코드&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class B24467 {

    static int line = 1;
    static int currentPos = 0;

    public static void main(String[] args) throws IOException {
        //도,개,걸,윷,모 판정 로직
        //다음 목표 위치 계산 변수
        //도착 여부 확인 로직
        String result = &quot;LOSE&quot;;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));


        int totalCnt = 1;
        boolean oneMore = false;
        for(int i = 0; i &amp;lt; 10; i++){

            System.out.println(&quot;line : &quot; + line);
            System.out.println(&quot;currentPos : &quot; + currentPos);

            oneMore = false;
            if(totalCnt &amp;gt; 50) break;

            String input = br.readLine();

            totalCnt++;

            //모
            if (&quot;1111&quot;.equals(input)) {
                currentPos += 5;
                oneMore = true;
            }
            //윷
            else if(&quot;0000&quot;.equals(input)){
                currentPos += 4;
                oneMore = true;
            }
            else{
                int yootCnt = getYoot(input);
                currentPos += yootCnt;
            }

            if(checkGoal()){
                System.out.println(&quot;도착&quot;);
                result = &quot;WIN&quot;;
            }

            organizePosition();

            if(oneMore) i--;
        }

        System.out.println(result);
    }

    public static void organizePosition(){

        if(line == 1 &amp;amp;&amp;amp; currentPos == 5) { // 1 -&amp;gt; 5
            line = 5;
            currentPos = 0;
        }
        else if(line == 5 &amp;amp;&amp;amp; currentPos == 3) { // 5 -&amp;gt; 8
            line = 8;
            currentPos = 0;
        }
        else if((line == 5 &amp;amp;&amp;amp; currentPos &amp;gt;= 4) &amp;amp;&amp;amp; (line == 5 &amp;amp;&amp;amp; currentPos &amp;lt;= 5)){ // 5 -&amp;gt; 7
            line = 7;
            currentPos = currentPos - 3;
        }
        else if(line == 5 &amp;amp;&amp;amp; currentPos &amp;gt;= 6){ // 5 -&amp;gt; 4
            line = 4;
            currentPos = currentPos - 3 - 3;
        }
        else if(line == 1 &amp;amp;&amp;amp; currentPos &amp;gt; 5){ // 1 -&amp;gt; 2
            line = 2;
            currentPos = currentPos - 5;
        }
        else if(line == 2 &amp;amp;&amp;amp; currentPos == 5){ // 2 -&amp;gt; 6
            line = 6;
            currentPos = 0;
        }
        else if(line == 2 &amp;amp;&amp;amp; currentPos &amp;gt; 5){ // 2 -&amp;gt; 3
            line = 3;
            currentPos = currentPos - 5;
        }
        else if(line == 3 &amp;amp;&amp;amp; currentPos &amp;gt;= 5){ // 3 -&amp;gt; 4
            line = 4;
            currentPos = currentPos - 5;
        }
        else if(line == 6 &amp;amp;&amp;amp; currentPos &amp;gt;= 3){ // 6 -&amp;gt; 8
            line = 8;
            currentPos = currentPos - 3;
        }
        else if(line == 7 &amp;amp;&amp;amp; currentPos &amp;gt;= 3){ // 7 -&amp;gt; 4
            line = 4;
            currentPos = currentPos - 3;
        }

    }

    public static boolean checkGoal(){
        return  line == 4 &amp;amp;&amp;amp; currentPos &amp;gt;= 6 ||
                line == 8 &amp;amp;&amp;amp; currentPos &amp;gt;= 4 ||
                line == 6 &amp;amp;&amp;amp; currentPos &amp;gt;= 7;
    }

    public static int getYoot(String input){
        int result = 0;

        for(int i = 0; i &amp;lt; input.length(); i++){
            if(input.charAt(i) == '0') result++;
        }
        return result;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 우측 하단 시작 지점을 기준으로 반시계로 각 라인을 1, 2, 3, 4 라인으로 보고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윷판의 중심지점으로 이어지는 사선의 라인은 5, 6, 7, 8 라인으로 설정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리하여, 각 라인에서 누적된 칸수에 따라 각 라인으로 이동하였음을 변수로 저장하여 최종적으로는 도착지점까지 들어갈 수 있는 경우는 4, 8, 6 라인의 경우만 존재하기 때문에, checkGoal 메소드로 도착여부를 판정한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;public static boolean checkGoal(){
    return  line == 4 &amp;amp;&amp;amp; currentPos &amp;gt;= 6 || 
            line == 8 &amp;amp;&amp;amp; currentPos &amp;gt;= 4 || 
            line == 6 &amp;amp;&amp;amp; currentPos &amp;gt;= 7;
}&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 라인1 에서 라인5로 넘어갈 수 있는 방법은 라인1에서 누적 이동횟수가 5여야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 모가 1번 나오던지, 또는 개 이후 걸이 나와서 총 5의 이동횟수가 딱 채워져야 라인5로 이동 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라인1에서 5를 넘어서는 이동횟수 합이 나온다면 라인5로는 이동이 불가하고 라인2로 이동했다고 판정해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 각 라인으로 이동할 경우 해당 라인에서의 이동횟수로 초기화 해주여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 라인1에서 모가 나와 이동횟수가 5이므로 라인5로 이동시 누적 이동횟수 변수를 0으로 초기화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 만약, 라인1에서 개 이후 모가 나와서 라인1에서의 총 이동횟수가 7인 경우 라인2로 이동하며 7-5(라인1이 가질 수 있는 이동횟수값) 을 하여 라인2에서 2번째 칸에 있음을 저장하고 있어야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bunSWk/btsO2SMkjLA/A1KHeTk1BkuZdGFMYLPE7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bunSWk/btsO2SMkjLA/A1KHeTk1BkuZdGFMYLPE7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bunSWk/btsO2SMkjLA/A1KHeTk1BkuZdGFMYLPE7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbunSWk%2FbtsO2SMkjLA%2FA1KHeTk1BkuZdGFMYLPE7k%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;857&quot; height=&quot;860&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간도 오래걸렸고, 어떻게 보면 모든 경우들은 염두하여 코드를 분기하거기 때문에 좋은 코드라고 할 순 없지만 해결하였음에 뿌듯함을 느끼고 분석능력을 기를 수 있었다.&lt;/p&gt;</description>
      <category>알고리즘/백준</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/781</guid>
      <comments>https://januaryman.tistory.com/781#entry781comment</comments>
      <pubDate>Thu, 3 Jul 2025 16:53:03 +0900</pubDate>
    </item>
    <item>
      <title>2024-08-18 MySql 관련 공부</title>
      <link>https://januaryman.tistory.com/778</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Distinct와&amp;nbsp;Group&amp;nbsp;By의&amp;nbsp;차이&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Distinct는 단순히 중복을 제거한다는 의미가 강함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Group by는 중복이라는 개념보다는 그룹화하여, 그룹화된 내부적으로 집계 혹은 통계를 내는 용도라고 생각하면 될듯.&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SELECT 시 COUNT를 사용하여 특정필드의 값이 존재하는 ROW의 갯수 세기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhwwby/btsI7n5fOBS/SSi3dczuFNXbIVKZQ9dmVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhwwby/btsI7n5fOBS/SSi3dczuFNXbIVKZQ9dmVK/img.png&quot; data-alt=&quot;현재 테이블 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhwwby/btsI7n5fOBS/SSi3dczuFNXbIVKZQ9dmVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhwwby%2FbtsI7n5fOBS%2FSSi3dczuFNXbIVKZQ9dmVK%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;318&quot; height=&quot;179&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현재 테이블 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 테이블이 위와 같을때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;select count(*) from buy where temp is not null;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;와 같이 사용하여 temp 필드의 값이 null 아닌 row의 갯수를 구할수도 있지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;select&amp;nbsp;count(temp)&amp;nbsp;from&amp;nbsp;buy;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;와 같이 구할 수도 있다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;MySQL 프로시저 관련 공부 쿼리 내용&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1723909579807&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 아래 쿼리를 실행하기 위한 대상 테스트 테이블

CREATE TABLE `buy` (
  `ai` int NOT NULL AUTO_INCREMENT,
  `city` varchar(45) NOT NULL,
  `address` varchar(45) DEFAULT NULL,
  `temp` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`ai`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb3;

-- 더미 데이터
-- 	1	경기	삼정동1	유일값
-- 	2	경기	구룡동2	
-- 	3	서울	삼정동1	
-- 	4	부산	이룡포4	
-- 	5	충남	이룡포2	



# 프로시저 생성 1
USE alone_sql; -- db 선택
DROP PROCEDURE IF EXISTS auto_10_row_proc; -- 존재하다면 프로시저 날리기, 괄호 없어야함

-- 구분자 $$ 로 번경, sql의 끝과 프로시저 끝을 구분하기 위함
DELIMITER $$ 

CREATE PROCEDURE auto_10_row_proc()
BEGIN
	SELECT * FROM buy;
END $$

-- 구분자 ;로 되돌리기
DELIMITER ; 
# ~ 프로시저 생성 1

# 프로시저 1 실행
call auto_10_row_proc();




# 프로시저 생성 2
USE alone_sql; -- db 선택
DROP PROCEDURE IF EXISTS select_row_where_city_proc; -- 존재하다면 프로시저 날리기, 괄호 없어야함

-- 구분자 $$ 로 번경, sql의 끝과 프로시저 끝을 구분하기 위함
DELIMITER $$ 

CREATE PROCEDURE select_row_where_city_proc(in cityName varchar(10))
BEGIN
	select * from buy where city = cityName;
END $$

-- 구분자 ;로 되돌리기
DELIMITER ; 
# ~ 프로시저 생성 2


# 프로시저 2 실행
call select_row_where_city_proc('서울');




# 프로시저 생성 3 (출력매개변수)
USE alone_sql; -- db 선택
DROP PROCEDURE IF EXISTS get_maxAi_from_buy; -- 존재하다면 프로시저 날리기, 괄호 없어야함

-- 구분자 $$ 로 번경, sql의 끝과 프로시저 끝을 구분하기 위함
DELIMITER $$ 

CREATE PROCEDURE get_maxAi_from_buy(out maxAi INT)
BEGIN
	-- max() 인자로 들어 온 컬럼들 중 최고값을 리턴
	select max(ai) into maxAi from buy;
END $$

-- 구분자 ;로 되돌리기
DELIMITER ; 
# ~ 프로시저 생성 3


# 프로시저 3 실행
call get_maxAi_from_buy(@maxAi);
select concat(&quot;최고 ai값 =&amp;gt; &quot;, @maxAi);




# 프로시저 생성 4 
USE alone_sql; -- db 선택
drop procedure if exists print_message;

delimiter $$
create procedure print_message(
	in ai_id INT
)
BEGIN
	declare cityName varchar(10);
    select city into cityName from buy where ai = ai_id;
	if cityName = '경기' or cityName = '서울' then
		select '수도권에 사시는 군요' as '메시지';
	else
		select '지방 사시는 군요' as '메시지';
	end if;
    -- end if 써주어야 하며 세미클론도 꼭 써주도록
END $$

delimiter ;
call print_message(1);




# 별개 내용
SHOW PROCEDURE STATUS; -- 등록 된 프로시저 목록 조회&lt;/code&gt;&lt;/pre&gt;</description>
      <category>MySql</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/778</guid>
      <comments>https://januaryman.tistory.com/778#entry778comment</comments>
      <pubDate>Sun, 18 Aug 2024 00:46:41 +0900</pubDate>
    </item>
    <item>
      <title>@RequestParam과 @RequestBody 사용법</title>
      <link>https://januaryman.tistory.com/774</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring의 Controller에서 데이터를 받는 방식으로 가장 많이 쓰이는 두가지 어노테이션이다.&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;b&gt;@RequestParam&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1719754371341&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(value = &quot;/registerProduct&quot;)
    @ResponseBody
	public String registerProduct(Model model, HttpSession session, @RequestParam Map&amp;lt;String, Object&amp;gt; paramMap) {
 		return service.createProduct(paramMap);
	}&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;위와 같이 보통 Map을 이용하여 프론트엔드단에서 보낸 데이터를 전달 받으며, 꼭 Map이 아니라 String타입의 하나의 변수여도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@RequestParam(&quot;name&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 직접 변수와 매핑할 key도 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;명심할점은 프론트엔드에서 보내는 body의 내용이 아니라, 폼 데이터 혹은 ajax 통신시 javascript 객체 자체 변환하여 생성된 쿼리스트링의 데이터를 매핑하는 것이라는 점이다. 그러므로 프론트엔드에서 전송할때 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;데이터를 json형식으로 직렬화 할 필요가 없다.&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;@RequestParam 에 데이터를 담으려면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; http://localhost:8080/users?name=홍길동&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과 같은 형식으로 전송되어야 한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@RequestParam으로 받을 수 있는 프론트엔드단의 전송 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;form 데이터 submit&lt;/li&gt;
&lt;li&gt;ajax 통신시 javascript 객체 자체&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;@RequestBody&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1719754925775&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@PostMapping(&quot;/registerProduct&quot;)
	@ResponseBody
	public ResponseEntity&amp;lt;Object&amp;gt; registerProduct(Model model, HttpSession session, @RequestBody ProductDTO epmoDTO) {

		User uSession = (User) session.getAttribute(&quot;UserInfo&quot;);
		Integer userCd = uSession.getUSER_CD();
		epmoDTO.setRegUserCd(userCd);
 		return service.createDeliveryProduct(epmoDTO);
	}&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;위와같이 @RequestBody는 본문(body)의 내용 자바객체로 변환해주는 어노테이션이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;즉, 본문은 하나이므로 파라미터 중 1개에만 사용 가능한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 프론트엔드단에서 전송하는 본문의 데이터 형식이 JSON, XML, 텍스트와 같이 정해진 규격이여야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 Json 데이터를 받는데 많이 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 프론트엔드단에서는 보낸 데이터를 Json 직렬화 하여 전송하여야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 JSP 파일에서 ajax 통신시 data를 JSON.stringfy()로 Json 화 하는것이다.!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 중요한점, @RequestBody가 붙은 객체는 자바빈규약을 지켜야 매핑이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;예를들어 변수명은 소문자로 시작해야하고, getter, setter가 존재해야한다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/774</guid>
      <comments>https://januaryman.tistory.com/774#entry774comment</comments>
      <pubDate>Sun, 30 Jun 2024 22:48:33 +0900</pubDate>
    </item>
    <item>
      <title>JSP 지시어</title>
      <link>https://januaryman.tistory.com/771</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;지시어란&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;%@ [내용] %&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형태의 태그를 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP 페이지의 처리방식의 정의를 지정하거나, 추가 기능을 황성화 하는데 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;page&amp;nbsp;&lt;br /&gt;JSP 페이지의 기본설정.&lt;br /&gt;인코딩 방식, 언어 등과 같이 페이지의 기본 정보.&lt;/li&gt;
&lt;li&gt;include&lt;br /&gt;다른 JSP 페이지를 현재 페이지에 포함&lt;/li&gt;
&lt;li&gt;taglib&lt;br /&gt;라이브러리 추가&lt;/li&gt;
&lt;li&gt;errorPage&lt;br /&gt;오류발생시 표시될 JSP 페이지 지정&lt;/li&gt;
&lt;li&gt;info&lt;br /&gt;JSP 페이지에 대한 정보를 제공&lt;/li&gt;
&lt;li&gt;contentType&lt;br /&gt;JSP 페이지의 콘텐츠 유형 지정&lt;/li&gt;
&lt;li&gt;session&lt;br /&gt;HTTP 세션 사용 여부&lt;/li&gt;
&lt;li&gt;buffer&lt;br /&gt;jsp 페이지의 버퍼링 방식 지정&lt;/li&gt;
&lt;li&gt;import&amp;nbsp;&lt;br /&gt;java 클래스 또는 라이브러리 가져옴&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>웹 지식/JSP</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/771</guid>
      <comments>https://januaryman.tistory.com/771#entry771comment</comments>
      <pubDate>Sun, 23 Jun 2024 23:36:51 +0900</pubDate>
    </item>
    <item>
      <title>스프링 앱의 기본 url 설정시 알고 있어야 하는 개념</title>
      <link>https://januaryman.tistory.com/765</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 프로젝트를 이클립스에서 생성하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 앱의 기본 url을 설정하고 싶다면&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;.settings 폴더 - org.eclipse.wst.common.component 파일 내부에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #008080;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;property&lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #e8e6e3; text-align: start;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f007f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #e8e6e3; text-align: start;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;context-root&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #e8e6e3; text-align: start;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f007f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #e8e6e3; text-align: start;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #ceccf7; color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;CONTEXTTEST&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot; data-darkreader-inline-color=&quot;&quot;&gt;/&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부분에서 value 값을 설정해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 해당 프로젝트를 띄울 WAS 서버를 붙여줄텐데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 최초에 붙여준 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project Explorer 상의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Servers - [해당 WAS서버 (EX: Tomcat v9.0 Server at localhost-config) ] - server.xml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로에 들어가 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span style=&quot;color: #008080;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;Context&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;docBase&lt;/span&gt;=&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;GaonTurTleLatCSM_v2.0.4&quot;&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;path&lt;/span&gt;=&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;/&lt;/span&gt;&lt;span style=&quot;background-color: #ceccf7; color: #2a00ff;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;CONTEXTTEST&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot; &lt;/span&gt;&lt;span style=&quot;color: #7f007f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;reloadable&lt;/span&gt;=&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span style=&quot;color: #7f007f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;source&lt;/span&gt;=&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;org.eclipse.jst.jee.server:GaonTurTleLatCSM_v2.0.4&quot;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot; data-darkreader-inline-color=&quot;&quot;&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;Host&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 생성이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;span style=&quot;color: #c8c3bc; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;.settings 폴더 - org.eclipse.wst.common.component 상의 내용을 가지고 생성된 데이터인것이다&lt;/span&gt;&lt;span style=&quot;color: #c8c3bc; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c1bcb4;&quot; data-darkreader-inline-color=&quot;&quot;&gt;그렇기 때문에,&lt;/span&gt;&lt;span style=&quot;color: #c1bcb4;&quot; data-darkreader-inline-color=&quot;&quot;&gt;이후에&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c1bcb4;&quot; data-darkreader-inline-color=&quot;&quot;&gt;스프링 프로젝트의 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c8c3bc; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;.settings 폴더 - org.eclipse.wst.common.component&lt;span&gt;&amp;nbsp; 경로에서 path를 변경해도 변경된 url로 접속이 불가능하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c8c3bc; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span&gt;새로 적용하고 싶다면 다른 WAS 서버를 선택하거나, 기존에 사용하던 WAS서버를 삭제하고 다시 만들어주어야 한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c8c3bc; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&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;color: #008080;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f7f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;property&lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #e8e6e3; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f007f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #e8e6e3; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;context-root&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #e8e6e3; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f007f;&quot; data-darkreader-inline-color=&quot;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;background-color: #181a1b; color: #e8e6e3; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #ceccf7; color: #2a00ff;&quot; data-darkreader-inline-bgcolor=&quot;&quot; data-darkreader-inline-color=&quot;&quot;&gt;CONTEXTTEST&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot; data-darkreader-inline-color=&quot;&quot;&gt;/&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c8c3bc; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&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;color: #c8c3bc; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://fun-coding-study.tistory.com/242&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://fun-coding-study.tistory.com/242&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Spring</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/765</guid>
      <comments>https://januaryman.tistory.com/765#entry765comment</comments>
      <pubDate>Thu, 6 Jun 2024 15:42:59 +0900</pubDate>
    </item>
    <item>
      <title>이클립스 - 검색하여 찾은 파일의 경로를 Project Explorer에 펼치기</title>
      <link>https://januaryman.tistory.com/763</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이클립스로 작업 중 특정 코드의 내용은 기억이 나지만, 해당 코드가 있는 파일의 경로는 기억이 나지 않을 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴때, 해결 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Ctrl + H : 전체 프로젝트 목록을 대상으로 문자열 검색 단축키&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 상위 탭중 File Search 탭 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Containing text 입력란에 찾고자 하는 문자열 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 하단 Search 버튼 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Search View가 활성화 되면서 어떤 파일에 해당 문자열이 존재하는지 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Project Explorer View에서&amp;nbsp; Link with Editor 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q7orV/btsHQ123X0P/X0fzyzi8SxD8b8U9cPodTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q7orV/btsHQ123X0P/X0fzyzi8SxD8b8U9cPodTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q7orV/btsHQ123X0P/X0fzyzi8SxD8b8U9cPodTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ7orV%2FbtsHQ123X0P%2FX0fzyzi8SxD8b8U9cPodTK%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;324&quot; height=&quot;347&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 다시 Search View에서 발견된 파일 중 경로가 알고싶은 파일에서 오른쪽 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Show In -&amp;gt; Project Explorer 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Project Explorer 창에서 해당 경로가 펼쳐짐&lt;/p&gt;</description>
      <category>이클립스</category>
      <category>Eclipse</category>
      <category>검색</category>
      <category>경로찾기</category>
      <category>이클립스</category>
      <category>찾기</category>
      <category>파일찾기</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/763</guid>
      <comments>https://januaryman.tistory.com/763#entry763comment</comments>
      <pubDate>Thu, 6 Jun 2024 14:32:45 +0900</pubDate>
    </item>
    <item>
      <title>외부의 정적 리소스 요청시 Spring의 WebMvcConfigurer를 이용한 처리 방법</title>
      <link>https://januaryman.tistory.com/747</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;WebMvcConfigurer 란&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring 프레임워크의 인터페이스로써 Spring MVC 처리에 대한 구성 설정을 가능하게 해주는 인터페이스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트로부터 전송받아 저장한 이미지를 외부에서 url로 요청할 경우, 해당 이미지를 전송해주기 위함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;사전 필요과정&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트로 부터 이미지 전송을 받아 이미지를 특정 공간에 저장한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이미지를 저장할때, DB에 해당 이미지가 저장된 경로를 필드에 저장한다 (전체 경로일 필요 없다. 정적 리소스를 저장할 root 경로 이후의 경로만 저장해둔다)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;처리 방법&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WebMvcConfigurer 를 구현한 클래스 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1715165380142&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void  addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(&quot;/images/diary/**&quot;) // 웹에서 접근할 url 경로
                .addResourceLocations(&quot;file:/C:/emotion-diary/images/diary/&quot;);// 실제 파일이 존재하는 경로
    }
}&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트에서 &lt;br /&gt;http://[Spring Boot앱이 구동중인 서버 도메인].com:8080/image/diary/3/벚꽃사진.jpeg&lt;br /&gt;과 같이 spring boot 백엔드 서버로 요청을 한다&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;WebMvcConfigurer 은 /images/diary/ 라고 들어오는 요청에 대해서는 file:/C:/emotion-diary/images/diary/ 의 경로에 매핑하여 취급한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;만약 http://localhost:8080/images/diary/3/벚꽃사진.jpeg 이라는 요청이 들어온다면,&lt;br /&gt;file:/C:/emotion-diary/images/diary/3/벚꽃사진.jpeg 로 매핑이 되는것이고,&amp;nbsp;&lt;br /&gt;실제 백엔드 서버의 C:/emotion-diary/images/diary/3/ 경로 안에는 벚꽃사진.jpeg라는 파일이 존재해야 하는것이다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;그리고 DB에는 /images/diary/3/벚꽃사진.jpeg 라는 경로가 저장되어 있으면 되고, 이 정보를 클라이언트에게 알려주면 위와 같이 url로 이미지를 요청할 수 있게 되는 것이다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Spring Boot</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/747</guid>
      <comments>https://januaryman.tistory.com/747#entry747comment</comments>
      <pubDate>Wed, 8 May 2024 19:58:33 +0900</pubDate>
    </item>
    <item>
      <title>Spring Data JPA 쿼리 메소드 간단 정리</title>
      <link>https://januaryman.tistory.com/746</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;쿼리 메소드란&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Spring Data JPA 에서 제공하는 기능으로, 엔티티에 대해 처리할 쿼리 내용을 규칙에 따라 메소드의 명칭과 파라미터로로 정의하여 작업내용을 처리하는 메소드를 생성하는 기능.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메소드명칭과 파라미터로 인해 쿼리 자동 생성&lt;/li&gt;
&lt;li&gt;파라미터로 인한 동적 조건 설정 가능&lt;/li&gt;
&lt;li&gt;JPQL에 대한 직접 작성 필요 없이 쿼리 자동 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시 1&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1715163416598&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface UserRepository extends Repository&amp;lt;User, Long&amp;gt; {

  List&amp;lt;User&amp;gt; findByEmailAddressAndLastname(String emailAddress, String lastname);
}


위에 메소드를 아래와 같이 쿼리화 하여 처리
select u from User u where u.emailAddress = ?1 and u.lastname = ?2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시 2&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1715163981841&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Repository
public interface DiaryRepository extends JpaRepository&amp;lt;Diary, Long&amp;gt; {
    
    //RegDate가 fromDate ~ toDate 사이의 값이면서, Member가 member이며, Emotion의 값이 emotion값과 같거나 작은 모든 데이터를 pageable 형식에 맞게 페이지화 하여 가져올것 
    Page&amp;lt;Diary&amp;gt; findAllByRegDateBetweenAndMemberAndEmotionLessThanEqual(LocalDateTime fromDate, LocalDateTime toDate, Pageable pageable, Member member, Integer emotion);
}&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;참조&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Spring Boot/JPA</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/746</guid>
      <comments>https://januaryman.tistory.com/746#entry746comment</comments>
      <pubDate>Wed, 8 May 2024 19:27:58 +0900</pubDate>
    </item>
    <item>
      <title>reducer 사용 법</title>
      <link>https://januaryman.tistory.com/734</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;준비&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711785611282&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useReducer } from &quot;react&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 예&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711785683394&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { useReducer } from &quot;react&quot;; //reducer 사용하기 위해 import 시킴


//reducer의 실제 내용 정의
//state : 현재 state값
//action : dispatch로 reducer 호출할때 전달받은 인자
//리턴값 : 최종적으로 변경시킬 state 값
const reducer = (state, action) =&amp;gt; { 
  let newState = [];
  switch (action.type) {
    case &quot;INIT&quot;:
      return action.data;
    case &quot;CREATE&quot;:
      newState = [action.data, ...state];
      break;
    case &quot;EDIT&quot;:
      newState = state.map((it) =&amp;gt;
        it.id === action.targetId ? { ...action.data } : it
      );
      break;
    case &quot;REMOVE&quot;:
      newState = state.filter((it) =&amp;gt; it.id !== action.targetId);
      break;
    default:
      return state;
  }

  localStorage.setItem(&quot;diary&quot;, JSON.stringify(newState));
  return newState;
};


function App() {
	//reducer 생성, 
    //data : reducer가 관리하는 state
    //dispatch : reducer를 호출하는 명칭, 아래에서 dispatch()호출을 하지만 실제 구동되는 함수 내용은 위에 reducer 내용임
   	//reducer : 위에서 정의한 reducer를 설정
    //[] : 초기 값
  const [data, dispatch] = useReducer(reducer, []); 

:
:

 useEffect(() =&amp;gt; {
    const localData = JSON.parse(localStorage.getItem(`diary`));

    if (localData) {
      dispatch({ 		//reducer 호출, 인자로 전달 되는 객체는 모두 reducer에서 action 인자로 받게 된다.
        type: &quot;INIT&quot;,
        data: localData,
      });
    }
  }, []);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;간략 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reducer는 결국 state 값을 변경시키기 위한 방법 중 하나이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reducer라는 state 값을 변경시키는 함수를 정의하고 해당 함수를 dispatch로 호출하여 실행시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 dispatch가 리턴해야 하는 값은 수정할 state 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 유용 사이트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://goddaehee.tistory.com/311&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://goddaehee.tistory.com/311&lt;/a&gt;&lt;/p&gt;</description>
      <category>리액트</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/734</guid>
      <comments>https://januaryman.tistory.com/734#entry734comment</comments>
      <pubDate>Sat, 30 Mar 2024 17:10:47 +0900</pubDate>
    </item>
    <item>
      <title>csp, csrf, cors 대하여</title>
      <link>https://januaryman.tistory.com/729</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;csp (contents-security-policy) 컨텐츠 보안 정책&lt;/b&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;script는&amp;nbsp;특정한&amp;nbsp;사이트에서만&amp;nbsp;받고,&amp;nbsp;object&amp;nbsp;태그에서&amp;nbsp;사용되는&amp;nbsp;src는&amp;nbsp;특정&amp;nbsp;사이트에서만&amp;nbsp;받아라&amp;nbsp;등,&amp;nbsp;컨텐츠를&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;도메인&amp;nbsp;정보를&amp;nbsp;말한다.&amp;nbsp;(서버에서&amp;nbsp;클라이어트에게&amp;nbsp;보내는&amp;nbsp;응답의&amp;nbsp;헤더에&amp;nbsp;넣어&amp;nbsp;줌)&lt;br /&gt;ex)&amp;nbsp;script-src&amp;nbsp;'self';&amp;nbsp;object-src&amp;nbsp;&lt;a href=&quot;https://trustedplugins.example.com;&quot;&gt;https://trustedplugins.example.com;&lt;/a&gt;&amp;nbsp;report-uri&amp;nbsp;/csp-report-endpoint/&lt;br /&gt;self는&amp;nbsp;자기&amp;nbsp;자신&amp;nbsp;도메인을&amp;nbsp;말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;csrf (Cross-Site Request Forgery) 사이트간 요청 위조&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이트간&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;공격을&amp;nbsp;말한다.&lt;br /&gt;사용자가&amp;nbsp;공격자로부터&amp;nbsp;받은&amp;nbsp;이메이&amp;nbsp;안에&amp;nbsp;특정&amp;nbsp;컨텐츠를&amp;nbsp;눌렀는데,&amp;nbsp;해당&amp;nbsp;컨텐츠의&amp;nbsp;액션이&amp;nbsp;특정&amp;nbsp;은행&amp;nbsp;사이트의&amp;nbsp;내&amp;nbsp;계좌에서&amp;nbsp;출금을&amp;nbsp;하는&amp;nbsp;api를&amp;nbsp;호출한다거나&amp;nbsp;하는&amp;nbsp;공격을&amp;nbsp;말한다.&lt;br /&gt;그리고 spring security 사용시 해당 보안정책을 disabled 하는 이유는, 주로 restAPI 호출을 담당하는 CSR 환경에서는 요청을 받는 백엔드 서버의 도메인과 브라우저상의 페이지가 보여지는 클라이언트의 도메인이 다르기 때문에 애초에 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;cors (Cross-Origin Resource Sharing) 교차 출처 리소스 공유&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로&amp;nbsp;다른&amp;nbsp;도메인간의&amp;nbsp;리소스&amp;nbsp;공유&amp;nbsp;예외적으로&amp;nbsp;혹은&amp;nbsp;전부&amp;nbsp;허용해&amp;nbsp;주는&amp;nbsp;것을&amp;nbsp;말한다. &lt;br /&gt;즉,&amp;nbsp;웹사이트&amp;nbsp;A에서&amp;nbsp;이번에&amp;nbsp;로드될&amp;nbsp;페이지의&amp;nbsp;게시글에&amp;nbsp;포함된&amp;nbsp;동영상의&amp;nbsp;출처인&amp;nbsp;웹사이트&amp;nbsp;B로&amp;nbsp;요청을&amp;nbsp;보낸다. &lt;br /&gt;이때,&amp;nbsp;브라우저는&amp;nbsp;B로&amp;nbsp;보내는&amp;nbsp;요청의&amp;nbsp;헤더에&amp;nbsp;Access-Control-Allow-Origin&amp;nbsp;를&amp;nbsp;추가하여&amp;nbsp;보낸다.&amp;nbsp;(당신의&amp;nbsp;사이트에서&amp;nbsp;접근이&amp;nbsp;가능한&amp;nbsp;도메인은&amp;nbsp;무엇인가요?라고&amp;nbsp;묻는&amp;nbsp;것) &lt;br /&gt;B사이트는&amp;nbsp;A사이트가&amp;nbsp;보낸&amp;nbsp;요청의&amp;nbsp;응답의&amp;nbsp;헤더에&amp;nbsp;Access-Control-Allow-Origin&amp;nbsp;의&amp;nbsp;값을&amp;nbsp;보내서,&amp;nbsp;어떤&amp;nbsp;도메인이&amp;nbsp;접근&amp;nbsp;가능한지&amp;nbsp;혹은&amp;nbsp;전부(*)&amp;nbsp;가능한지&amp;nbsp;알려&amp;nbsp;줌. &lt;br /&gt;해당&amp;nbsp;응답을&amp;nbsp;받은&amp;nbsp;브라우저가&amp;nbsp;Access-Control-Allow-Origin&amp;nbsp;를&amp;nbsp;확인하여&amp;nbsp;A사이트가&amp;nbsp;해당되지&amp;nbsp;않는다면&amp;nbsp;에러&amp;nbsp;발생. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>웹 지식</category>
      <author>제뉴어리맨</author>
      <guid isPermaLink="true">https://januaryman.tistory.com/729</guid>
      <comments>https://januaryman.tistory.com/729#entry729comment</comments>
      <pubDate>Tue, 26 Mar 2024 17:54:17 +0900</pubDate>
    </item>
  </channel>
</rss>