<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>console.log</title>
    <link>https://muna76.tistory.com/</link>
    <description>혼자 공부 끄적 &amp;amp; 선기록 후검색</description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 09:23:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>문앵</managingEditor>
    <image>
      <title>console.log</title>
      <url>https://tistory1.daumcdn.net/tistory/4631608/attach/84914c990b9e4117accef64d3fc74365</url>
      <link>https://muna76.tistory.com</link>
    </image>
    <item>
      <title>20260407</title>
      <link>https://muna76.tistory.com/374</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;예전에&lt;span&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 블로그에 글을 쓴다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원래는 여러 종류의 글을 잡다하게 많이 썼었는데, 쓸 일이 없어지다 보니 잘 안쓰게 된 것 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그에는, 코딩을 하면서 만나는 이런 저런 에러, 문법, 개념 등등을 정리하거나 기록했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그 글을 열심히 올렸던 이유는 내가 나중에 찾아보려는 의도도 있었지만,&lt;/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;내가 처음에 코딩을 접하고 배우기 시작 했을 때, 블로그 너머의 누군가한테서 도움을 많이 받았고 그럴때마다 고마움이 컸기 때문이다.&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: #333333; text-align: start;&quot;&gt;하루종일 해결 못해서 애먹던것들을, 구글링해서 쫌쫌따리 찾아보고 여러 포스팅들을 보고 해결했을때.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&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;그런데 ai 의 기능이 좋아지게 되면서 ai가 그 선생님 역할을 대신하게 되었다.&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;요즘 내 근황은 ai 가 나타난 시대의 기술 블로그와 같다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의미가 없어진것 같다 ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 더 좋은 실력을 가지고 싶고 더 좋은 회사로 계속 이직하고싶다는 욕심이 컸었는데, 점점 뭔가 하고자 하는 의욕도 잘 안생기는것 같고 지금 회사에서 하고 있는 사업에 흥미도 재미도 없고 의미도 잘 모르겠고 코딩도 그냥 ai 돌리기... 인생의 노잼 시기인걸까? 쓸데 없는데 돈만 많이 쓰고 저축도 잘 안하는것 같다.&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: #333333; text-align: start;&quot;&gt;현재 시점에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;좀 더 고민해서 새로운 뭔가에 도전하거나 전환점이 필요한 시기같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;26년이 된지도 벌써 4개월째인데, 아직도 맨날 게임만 하고 운동도 제대로 안하고 친구들이랑 놀러 다니기만 하는데 에너지 충전이 안되고 닳기만 하는 이 기분 ...ㅋㅋ&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;4월달에는 게임 좀 줄이고, 운동 좀 더 하고, 독서하고, 건강하게 먹고, 많이 자기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화이팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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>일기 | 회고</category>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/374</guid>
      <comments>https://muna76.tistory.com/374#entry374comment</comments>
      <pubDate>Tue, 7 Apr 2026 16:18:06 +0900</pubDate>
    </item>
    <item>
      <title>면접(보고 온 사람) 보고 온 후기</title>
      <link>https://muna76.tistory.com/371</link>
      <description>&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends2&quot; data-emoticon-name=&quot;009&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/009.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/009.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 삼구님(39kg)과 회사 근처에서 점심식사를 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이쪽에 면접을 보러 오셨던 삼구님은 만나자마자 면접이 망했다며 씩씩대셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머리부터 발끝까지 정장으로 풀 착장을 맞추신 삼구님은 앙상한 주먹을 꽉 쥐시면서 눈으로 살기를 뿜으셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇년동안 이렇게 입고 면접 온 사람 처음이라고 면접관이 꼽을 줬다며 불쾌해 하셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대략적인 면접 후기를 들었는데, 개인적으로는 꽤나 잘 답변했다는 생각이 들었다.&lt;/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;A : 웹이 동작하는 방식을 설명해봐라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;39 : (웹을 모르지만 대강 이런거 아닐까요 라고 대답합)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A : 대충 맞다&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;A : 캐싱 전략을 어떻게 하면 좋을지 설명해봐라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;39 : (웹에선 안해봤지만 앱에선 대충 이러니까 웹에서 이렇지않을까요 라고 대답함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A : 대충 맞다&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;A : 갑자기 닷넷 시키면 어떡할거냐&lt;br /&gt;39 : (속마음 : @$$%$~씨~%%) 닷넷 경험이 없기때문에 시간을 하루 주고 다음날까지 완성하라고 하면 못하겠지만 시간을 주면 감사히 공부할 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A : (대충맞다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접 후기도 듣고 삼구님이 으르렁대는걸 구경하면서 밥을 먹으니 시간이 후딱 지나갔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼구님은 갑자기 주먹을 불끈 쥐신다던가, 난데없이 허공을 보고 &quot;그럴수 있지&quot; 라고 598348번정도 외치셨던것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덕분에 재밌는 점심시간이었다! 감사합니다 삼구님!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빵도 잘먹을게요!&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>일기 | 회고</category>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/371</guid>
      <comments>https://muna76.tistory.com/371#entry371comment</comments>
      <pubDate>Tue, 4 Nov 2025 16:20:17 +0900</pubDate>
    </item>
    <item>
      <title>[React] useRef / forwardRef</title>
      <link>https://muna76.tistory.com/369</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일반 ref와 forwardRef의 차이를 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref는 보통 포커스나 스크롤이벤트 등 가상 돔을 패스하고 직접 내가 돔노드에 접근하고 싶을 때 쓴다.&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;그럼 forwardRef는 어떤 상황에서 써야 하나?&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;부모 컴포넌트에서 자식 컴포넌트로 ref 를 전달할때 쓴다. ( 이때 ref 는 자식 컴포넌트를 가리키고 있는 상태가 됨 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 ref 를 전달하면 되는거 아닌가? 라고 생각했지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref는 리액트 내부적으로 만든 특수한 프로퍼티이기 때문에 그냥 컴포넌트간 전달이 막혀있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( console.log()에 찍으면 undefined가 뜸 )&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;forwardRef는 컴포넌트간 전달을 할수 있도록 만들어져있다. 그래서 부모 컴포넌트에서 자식 컴포넌트의 돔에 직접 접근할때 사용할 수 있는것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 방법은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; useRef &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1760513945238&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {CustomInput} from &quot;../customInput.jsx&quot;;

function App(){
	const ref = useRef(null);
    
    return (
		&amp;lt;&amp;gt;
        	&amp;lt;input ref={ref}/&amp;gt; // 이건 가능. ref가 가리키는건 input 돔
            &amp;lt;CustomInput ref={ref}/&amp;gt; // 이건 불가능. 
            // CustomInput 에서 prop 으로 받아와도 undefined가 찍힌다
        &amp;lt;/&amp;gt;
    )
}

...

export function CustomInput({ref}){
	console.log(ref); // =undefined
	return &amp;lt;input/&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;&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;lt; forwardRef &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1760514726967&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {CustomInput} from &quot;../customInput.jsx&quot;;

function App(){
	const ref = useRef(null);
    
    return (
		&amp;lt;&amp;gt;
            &amp;lt;CustomInput ref={ref}/&amp;gt; // 이렇게 사용하고 ref가 가리키는 돔은 CustomInput의 input
        &amp;lt;/&amp;gt;
    )
}

...

export const CustomInput =forwardRef((props, ref)=&amp;gt;{
	return &amp;lt;input ref={ref}/&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ useInperativeHandle&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;forwardRef와 함께 쓰이는 고급 기능.&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;이렇게 되면 불필요한 리렌더링이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리렌더가 일어나는 이유는 총 세가지인데 챗지피티에 따르면 하위 표와 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;props 변경&lt;/td&gt;
&lt;td&gt;React의 렌더링 데이터 변경&lt;/td&gt;
&lt;td&gt;✅ 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state 변경&lt;/td&gt;
&lt;td&gt;React의 렌더링 데이터 변경&lt;/td&gt;
&lt;td&gt;✅ 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;부모 렌더링&lt;/td&gt;
&lt;td&gt;Virtual DOM 재비교 필요&lt;/td&gt;
&lt;td&gt;✅ 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;br /&gt;그런데 useInperativeHandle로 정의된 함수는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref.current.method() 호출 -&amp;gt; JS 레퍼런스 호출이기 때문에 React와는 무관하고 따라서 리렌더가 발생하지 않고 함수만 호출하게 되는것.&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;useImperativeHandle의&amp;nbsp;진짜&amp;nbsp;의의는?&lt;br /&gt;&lt;br /&gt;단순히&amp;nbsp;부모가&amp;nbsp;자식&amp;nbsp;함수&amp;nbsp;&amp;ldquo;호출&amp;nbsp;가능&amp;rdquo;하게&amp;nbsp;해주는&amp;nbsp;게&amp;nbsp;아니라,&lt;br /&gt;그 호출이 React 렌더 사이클에 영향을 주지 않고 독립적으로 동작하도록 하는 것이다.&lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;useImperativeHandle을&amp;nbsp;통해&amp;nbsp;만든&amp;nbsp;API는&lt;br /&gt;렌더를 발생시키지 않으면서 컴포넌트의 내부 동작만 수행할 수 있다.&lt;br /&gt;(대표&amp;nbsp;예:&amp;nbsp;.focus(),&amp;nbsp;.open(),&amp;nbsp;.close())&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용법은&lt;/p&gt;
&lt;pre id=&quot;code_1760515911121&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { forwardRef, useImperativeHandle, useRef } from &quot;react&quot;;

const CustomInput = forwardRef((props, ref) =&amp;gt; {
  const inputRef = useRef();

  useImperativeHandle(ref, () =&amp;gt; ({
    focus: () =&amp;gt; inputRef.current.focus(),
    clear: () =&amp;gt; (inputRef.current.value = &quot;&quot;)
  }));

  return &amp;lt;input ref={inputRef} /&amp;gt;;
});

function App() {
  const ref = useRef();

  return (
    &amp;lt;&amp;gt;
      &amp;lt;CustomInput ref={ref} /&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; ref.current.focus()}&amp;gt;포커스&amp;lt;/button&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; ref.current.clear()}&amp;gt;초기화&amp;lt;/button&amp;gt;
    &amp;lt;/&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;/p&gt;</description>
      <category>React.js</category>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/369</guid>
      <comments>https://muna76.tistory.com/369#entry369comment</comments>
      <pubDate>Wed, 15 Oct 2025 17:12:53 +0900</pubDate>
    </item>
    <item>
      <title>[node.js] nvm 노드 버전 관리 (feat. nvm-windows, 버전 수동설치)</title>
      <link>https://muna76.tistory.com/366</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;나는 노드 버전을 관리할때 nvm을 사용한다.&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;a href=&quot;https://github.com/coreybutler/nvm-windows/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/coreybutler/nvm-windows/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756178488258&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; coreybutler/nvm-windows&quot; data-og-description=&quot;A node.js version management utility for Windows. Ironically written in Go. - coreybutler/nvm-windows&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/coreybutler/nvm-windows/releases&quot; data-og-url=&quot;https://github.com/coreybutler/nvm-windows/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/klomb/hyZCYO80Np/vTAghYx027JYauoHtVmRj1/img.jpg?width=841&amp;amp;height=469&amp;amp;face=0_0_841_469,https://scrap.kakaocdn.net/dn/yOabO/hyZCYay4pV/PMLzExi3V5dnWLxoDPftuk/img.jpg?width=841&amp;amp;height=469&amp;amp;face=0_0_841_469,https://scrap.kakaocdn.net/dn/S9Tn1/hyZDaWlUYo/c0HNWWiM6iZ10Q9O0YpDXK/img.png?width=1180&amp;amp;height=447&amp;amp;face=0_0_1180_447&quot;&gt;&lt;a href=&quot;https://github.com/coreybutler/nvm-windows/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/coreybutler/nvm-windows/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/klomb/hyZCYO80Np/vTAghYx027JYauoHtVmRj1/img.jpg?width=841&amp;amp;height=469&amp;amp;face=0_0_841_469,https://scrap.kakaocdn.net/dn/yOabO/hyZCYay4pV/PMLzExi3V5dnWLxoDPftuk/img.jpg?width=841&amp;amp;height=469&amp;amp;face=0_0_841_469,https://scrap.kakaocdn.net/dn/S9Tn1/hyZDaWlUYo/c0HNWWiM6iZ10Q9O0YpDXK/img.png?width=1180&amp;amp;height=447&amp;amp;face=0_0_1180_447');&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;Releases &amp;middot; coreybutler/nvm-windows&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A node.js version management utility for Windows. Ironically written in Go. - coreybutler/nvm-windows&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&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;&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;중간쯤 있는 Assets 에서 다운 받으면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkG89V/btsP7fFJG17/xnVkT7zWcky2c6njc1vgE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkG89V/btsP7fFJG17/xnVkT7zWcky2c6njc1vgE0/img.png&quot; data-alt=&quot;nvm-setup.exe&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkG89V/btsP7fFJG17/xnVkT7zWcky2c6njc1vgE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkG89V%2FbtsP7fFJG17%2FxnVkT7zWcky2c6njc1vgE0%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;272&quot; height=&quot;226&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nvm-setup.exe&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;그래서 그냥&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹에서 수동 설치를 하고 nvm에서 인식하도록 설정해주도록 하는 방법을 선택했다. 어쨌든 설치만 하면 되는거 아니겠어!?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 다운로드를 받아준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nodejs.org/ko/download&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756178686054&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;Node.js &amp;mdash; Node.js&amp;reg; 다운로드&quot; data-og-description=&quot;Node.js&amp;reg; is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/ko/download&quot; data-og-url=&quot;https://nodejs.org/ko/download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5hQe2/hyZC9pCl2z/8cVljNq32XxQp5IWnqm8S0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bfmjyb/hyZDavg47L/uVyZLGiDjWcfoUaNc6WYh1/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/ko/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5hQe2/hyZC9pCl2z/8cVljNq32XxQp5IWnqm8S0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bfmjyb/hyZDavg47L/uVyZLGiDjWcfoUaNc6WYh1/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256');&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;Node.js &amp;mdash; Node.js&amp;reg; 다운로드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js&amp;reg; is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.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;
&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;이떄 msi 버전이 있고 zip 버전이 있는데 -&amp;gt; &lt;b&gt;무조건 zip 으로 받아야한다.&lt;/b&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;msi -&amp;gt; path 설정부터 npm 포함 해서 알아서 쫙 설치해주는 설치 마법사같은거임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zip -&amp;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;nvm은 자기 경로에서 각 버전별로 지정된 폴더명이 있고 그 안에서 관리하는 시스템이라, 파일을 넣어주고 경로 심볼릭링크 등 직접 설정해줘야하는데, 마법사로 설치하면 설정이 꼬일수가 있다.&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;일단 zip 파일 받아주고&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;nvm 설치 경로 안에&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJMAac/btsP9E0bdtk/5Kajau9JKwg7pd7C0kmZ3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJMAac/btsP9E0bdtk/5Kajau9JKwg7pd7C0kmZ3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJMAac/btsP9E0bdtk/5Kajau9JKwg7pd7C0kmZ3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJMAac%2FbtsP9E0bdtk%2F5Kajau9JKwg7pd7C0kmZ3k%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;756&quot; height=&quot;75&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;75&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 버전 이름으로 넣어주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14버전을 넣어주고&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;전역에서 nvm 을 사용하기 위한 환경변수와 심볼릭 설정도 해주자.&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;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; [Environment]::SetEnvironmentVariable(&quot;NVM_HOME&quot;, &quot;[~~~\nvm 경로]&quot;, &quot;User&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; [Environment]::SetEnvironmentVariable(&quot;NVM_SYMLINK&quot;, &quot;[~~\심볼릭링크 달아줄 경로\nodejs]&quot;, &quot;User&quot;);&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; 이 경로는 보통 C:\Users\myguz\AppData\Local\nodejs 이렇게 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 한번 테스트해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; nvm list&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; nvm use v14.21.3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; node -v&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 나오면 끗&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;nvm use [사용할 버전]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 했는데도 노드 버전이 바뀌지 않는다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러가지 이유가 있을 수 있지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Now using node v22.17.0 (64-bit) 와 같은 식으로 성공 메세지가 나왔는데도 실제 버전은 그대로다?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 심볼릭링크가 갱신되지 않아서 생긴 문제일 가능성이 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 과정으로 수동 갱신해보자&lt;/p&gt;
&lt;pre id=&quot;code_1757398776401&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1) 실행 중인 node가 있으면 종료
Stop-Process -Name node -Force -ErrorAction SilentlyContinue

# 2) 현재 심볼릭 링크(또는 폴더) 제거
Remove-Item -Recurse -Force &quot;C:\nvm4w\nodejs&quot;

# 3) 원하는 버전으로 링크 재생성
nvm use 22.17.0

# 4) 확인
node -v&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;</description>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/366</guid>
      <comments>https://muna76.tistory.com/366#entry366comment</comments>
      <pubDate>Tue, 26 Aug 2025 12:31:55 +0900</pubDate>
    </item>
    <item>
      <title>[REACT]다국어 지원 시스템 (with. react-intl)</title>
      <link>https://muna76.tistory.com/365</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;npm i react-intl&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다국어 지원기능을 만들어주는 라이브러리다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* i18n : internationalization - 다국어 지원 시스템을 의미하는 약어다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;( i로 시작해서 n으로 끝나고 그 사이에 18개 알파벳이 있는 단어를 축약한거라고 한다. g11n - globalization, l10n - localization 등등 다른 축약 표현도 있다. )&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 대표적인 다국어 지원 라이브러리로는&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- react-intl , next-intl, i18next 이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서는 react-intl 을 사용한다. 이게 formatjs와 동일한거라고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;intlProvider로 &amp;lt;App/&amp;gt; 내부 jsx를 감싸주면 파일 전체에서 사용 가능하다. 이부분은 형태가 다양할테니 예시는 생략&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 사용법 (기본 형태)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. formattedMessage&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- jsx 안에서만 사용이 가능함. 적용파일 바뀌면 바로 바뀜.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 간단하게 ui 렌더링만 한다고 했을때 사용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 문법 : &amp;lt;formattedMessage id = &quot;AUTH.LOGIN&quot;/&amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. intl.formatMessage&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 함수나 jsx 안에서 모두 사용 가능.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- useIntl() 을 해줘야 한다는 번거로움이 있음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 문법 : intl.formatMessage({id: &quot;AUTH.LOGIN&quot;})&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 동적 할당 문법&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;CONTACT_ADMIN_WITH_ERRORCODE&quot;:&amp;nbsp;&quot;관리자에게&amp;nbsp;문의하세요.&amp;nbsp;error&amp;nbsp;code:&amp;nbsp;{msg}&quot; &lt;br /&gt;}&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. formatMessage 형태&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;formattedMessage id=&quot;...&quot; values={{ msg : errorCode&amp;nbsp; }} /&amp;gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. intl.formattedMessage() 형태&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;{intl.formatMessage(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;id:&amp;nbsp;&quot;CONTACT_ADMIN_WITH_ERRORCODE&quot;&amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;msg:&amp;nbsp;errorCode&amp;nbsp;}&lt;br /&gt;)} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/365</guid>
      <comments>https://muna76.tistory.com/365#entry365comment</comments>
      <pubDate>Mon, 25 Aug 2025 11:02:58 +0900</pubDate>
    </item>
    <item>
      <title>[회고] 능력 개발 교육원 k-디지털 분야 교직 훈련 과정 회고</title>
      <link>https://muna76.tistory.com/361</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;길고 길었던 과정이 드디어 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 kdt 교직과정이 끝나고 맞이하는 온전히 쉴 수 있는 첫번째 주말인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜인지 새벽 5시부터 계속 깨서 8시쯤에는 완전히 잠이 깨버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 정말 늦잠을 자고싶어서 알람도 다 꺼놨는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐가 그렇게 불안했는지 ㅠ&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암튼.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경 ✨ 축 !!!!!!!!!!!!!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길고 길었던 kdt 교직과정이 끝났다!!!!&lt;br /&gt;&lt;br /&gt;과정이 끝난 직후에 회고를 쓰고 싶었는데 계속 미루다가 이제야 쓴다. ^ㅡ^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 처음에 이 수업을 신청할 때는 별 생각이 없었다.&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;그렇게 만만하게 봤다가 된통 후회하게 되었지만.. 하지만 &lt;span style=&quot;color: #333333; text-align: start;&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 들고서 느낀 점은 크게 세가지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 여러명 앞에서 말하는 연습이 필요하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 인맥을 쌓기 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 인내심 수련이 필요하다면 이 과정을 들을것&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;1. 여러명 앞에서 말하는 연습이 필요하다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 수업의 마지막에는 pbl 수업이라는 과목을 수료하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;pbl 수업이란 problem based learning 의 약자인데, 쉽게 생각해서 말그대로 문제 해결에 중점을 둔 수업이다.&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;이 pbl 과목을 통해서 수업 계획서를 만들고, 그걸 발표를 하는게 이 교육과정의 최종 관문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외에도 팀플을 하면서 자잘하게 발표를 해야하는 상황이 종종 생긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주제를 명확히 주지 않거나, 준비할 시간을 충분히 주지 않고 그냥 말해야 하는 상황에서도. 말을 잘하는 사람이 정말 많다는걸 알게 되었다. 억양과 톤과 발성부터 다르고... 저런 사람이 강사 할 수 있는거구나 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 발표할 때 청중을 못 쳐다보고 자신감도 없는 편인데, 선생님께서 이런 발표가 어렵고 눈을 마주치지 못하는 사람은 경험 부족 준비 부족이라고 하셨다. 발표도 많이 해봐야 느는거라고.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 인맥을 쌓기 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수업은 정보통신 계열에서 일하시는 분들이 모여있고 그 중에서도 강사로 일하시는분이나 강사를 하길 희망하시는 분들이 많이 있었다. 나랑 같이 들은 랩스 여인들 &amp;amp; 몇몇을 제외하고서는 거의 대부분 나이대가 있는 분들이 대부분이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 분들은 어디 크고 좋은 대감집에서 한자리씩 하는 분들이 많았따. 아무래도 직장을 다니면서 주말 이틀을 내리 희생하면서까지 교육을 받으려는 의지를 가진 부지런한 사람들이라면 ... 그럴 가능성이 높을 것이다.&amp;nbsp; 이사님과 나 단둘이서 개발해야하는 회사가 있다는 사실 조차 모른채로 살아가시는 분들이었다... 세상이 넓다는걸 다들 아셔야 할텐데..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암튼 그 중에서 강사를 구하거나 뭐 주변에 누가 사람 구한다더라~ 하는 얘기를 종종 듣기도 했다. 물론 본격적으로 컨택을 한 사람은 못 봤지만 충분히 가능할 것 같았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 만약 좀 활발한 성격이었으면 여기 아저씨들이랑 다 친해져서 나중에 사람 구할때 연락 주라고 할 수 있을것만 같은 그런 느낌이었다.&lt;/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 인내심 수련이 필요하다면 이 과정을 들을것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내게 이 과정을 수료하면서 얻은 가장 큰게 뭐냐고 묻는다면, 제일 먼저 인내심이라고 할 것같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의를 할때 마인드, 실전에서 겪는 여러 문제들, 학습 교구, 강의 방식의 다양한 개념 등등 지식적으로 배운것은 많다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 교육을 모두 이수하고 나니, 나한테 남은 것은 타고 남은 재와 같은 인내심이었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 9 to 6 로 일하는것과는 전혀 다르다. 자유가 없고 계속 지식이 머릿속으로 들어오고 자리에 가만히 앉아서 그 정보를 계속 받아들여야하는... 마치 학생때로 돌아간것만 같은 느낌이었는데. 정말 버티기 힘들었다 ㅋㅋㅋㅋㅋㅋ 물론 45~50분마다 쉬는시간이 있지만.. 힘든게 어느정도냐면 수업중에도 잠깐 정신을 놓으면 바로 잠드는 정도였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교육 막바지에 갈수록 &lt;span style=&quot;color: #333333; text-align: start;&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨간펜 드릴까요? 파란 펜 드릴까요? 했더니 빨간 휴지 줄까~ 파란 휴지줄까~ 무표정으로 무심코 드립 날리시고선 본인도 어이없으셨는지 헛웃음을 지으시던 ㅋㅋㅋㅋㅋ 정말 피곤하셨나보다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 이것도 수료했는데 이젠 뭔들 못할까라는 생각도 들고.. 이제 이틀도 필요 없고 일주일에 하루 정도만 쉬어도 너무 꿀 같을 것 같다는 생각을 했다. ( 끝난 직후에만 ^^* 지금은 일주일에 7번 쉬고싶음 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;케이디티야 고마워~ 사실 안고마워 급식 맛있었어 마지막날 삼계탕 잘먹었어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일기 | 회고</category>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/361</guid>
      <comments>https://muna76.tistory.com/361#entry361comment</comments>
      <pubDate>Sat, 26 Jul 2025 11:06:55 +0900</pubDate>
    </item>
    <item>
      <title>[tanstack-query/react-query] API 중복 호출 문제 (feat. enabled 옵션)</title>
      <link>https://muna76.tistory.com/356</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필터가 여러개 있는 검색 기능을 수정하던 중 문제를 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색하기 버튼을 누르니&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;api 요청을 두번 따닥!&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;문제가 뭘까 소스 코드를 계속 봤다. 이거저거 고쳐봐도 모르겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴때 드는 생각이 이런 문제는 원인을 어떻게 명확하게 추측할 수 있지? 였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차라리 에러메세지가 뜨면 뭐 때문에 에러가 난건지 추적이 가능한데.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우는 에러가 나는것도 아니고... 내가 하나하나 콘솔을 찍어보면서 추척하거나 코드를 뜯어 보고 유추 해보는 수 밖에는 없는게 너무 답답했다. 왜냐?? 아무리 봐도 모르겠기 때무네!!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 커서를 붙들고 하루종일 잡도리를 했더니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;죙일 헛소리만 하다가 오후 느즈막히 뭔가 그럴싸한 답변을 내놨다.&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;react-query의 enable 옵션이 !!param 으로 되어있기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. param 변경시 자동으로 한번 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. useEffect 의존성에 포함된 param 으로 한번 더 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 총 두번 호출이라는것.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;* useQuery의 enabled 옵션 특&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- useQuery는 GET 요청 특화 메소드로, 기본적으로 컴포넌트가 렌더링 될때 자동호출이다 .&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- enabled 는 디폴트 설정이 true이고, true 이면 useQuery 자동호출 하라는 뜻이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 하지만 자동 실행되는걸 막아주고 싶어 + 내가 원하는 시점에 호출하고싶어 =&amp;gt; 이럴때 사용하면 좋다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(enabled : false + refetch 수동 호출)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- enabled : !!param 이런식으로 특정 값을 설정해주면, param값이 없을때는 자동호출 안해주다가, param 값이 일단 한번 들어오면 그 뒤로는 자동호출을 해주는 구조다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 한번 수정을 해봤따.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enabled : false 로 주면 끝.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 컴포넌트 마운트시에는 어차피 useEffect 의존성이 있기 때문에.. 그냥 두면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘된다. ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩 에러 모음/react</category>
      <category>Enabled</category>
      <category>react-qeury</category>
      <category>refetch</category>
      <category>tanstack-query</category>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/356</guid>
      <comments>https://muna76.tistory.com/356#entry356comment</comments>
      <pubDate>Thu, 10 Jul 2025 17:41:10 +0900</pubDate>
    </item>
    <item>
      <title>react state update &amp;amp; call api in a method with new state</title>
      <link>https://muna76.tistory.com/355</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;* 상태를 업데이트 했는데 이전 상태값으로 요청이 가는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://muna76.tistory.com/351&quot;&gt;https://muna76.tistory.com/351&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1752021182603&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;setState를 했는데 바로 직전 상태값이 나와요&quot; data-og-description=&quot;setState() 는 상태를 업데이트하는 함수인데, 이걸 이용해서 값을 업데이트 하고자 할때내가 원하는 시점에 상태값이 변하지 않고 이전 상태값을 유지하는 상황을 종종 겪었다. 예를 들면..어떤 &quot; data-og-host=&quot;muna76.tistory.com&quot; data-og-source-url=&quot;https://muna76.tistory.com/351&quot; data-og-url=&quot;https://muna76.tistory.com/351&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Vf79S/hyZjiTFUIe/koMpnltEqHfpPv3m5JkfN0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cKtr57/hyZjaVEHKb/eOjZyR2xXVJ4xCCg2vvAnK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bol4Pj/hyZjwxFBb7/Uf8MPznD6c94MVK3KYbQN0/img.jpg?width=1080&amp;amp;height=1153&amp;amp;face=0_0_1080_1153&quot;&gt;&lt;a href=&quot;https://muna76.tistory.com/351&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://muna76.tistory.com/351&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Vf79S/hyZjiTFUIe/koMpnltEqHfpPv3m5JkfN0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cKtr57/hyZjaVEHKb/eOjZyR2xXVJ4xCCg2vvAnK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bol4Pj/hyZjwxFBb7/Uf8MPznD6c94MVK3KYbQN0/img.jpg?width=1080&amp;amp;height=1153&amp;amp;face=0_0_1080_1153');&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;setState를 했는데 바로 직전 상태값이 나와요&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;setState() 는 상태를 업데이트하는 함수인데, 이걸 이용해서 값을 업데이트 하고자 할때내가 원하는 시점에 상태값이 변하지 않고 이전 상태값을 유지하는 상황을 종종 겪었다. 예를 들면..어떤&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;muna76.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 버전 2라고 할 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;리액트에서는 setState를 한다고 해서 상태값이 바로 변경되는것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 3가지 단계로 업데이트가 되는데,&amp;nbsp; &lt;br /&gt;1. 트리거 &lt;br /&gt;2. 렌더링 &lt;br /&gt;3. 커밋&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;결과가&amp;nbsp;이전과&amp;nbsp;같으면&amp;nbsp;React는&amp;nbsp;DOM을&amp;nbsp;건드리지&amp;nbsp;않는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 포스팅에서는 useEffect를 사용해서 비동기적으로 업데이트되는 상태값을 동기적으로 실행 되는것처럼 보이게 하는! 방법을 사용했는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 적용한 것은 플래그를 활용한 방법이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법은 간단하다&lt;/p&gt;
&lt;div style=&quot;background-color: #1a1a1a; color: #d8dee9;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82d2ce;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #aa9bf5;&quot;&gt;pendingSearch&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #efb080;&quot;&gt;setPendingSearch&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d6d6dd;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ebc88d;&quot;&gt;useState&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;(false);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #82d2ce;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #efb080;&quot;&gt;onKeyDownEnter&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d6d6dd;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #d6d6dd;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #82d2ce;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #83d6c5;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #d6d6dd;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d6d6dd;&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; null) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aa9bf5;&quot;&gt;searchForm&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #efb080;&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #e394dc;&quot;&gt;'searchText'&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #d6d6dd;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;, () &lt;/span&gt;&lt;span style=&quot;color: #82d2ce;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; { // 상태 업데이트 커스텀 훅&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ebc88d;&quot;&gt;setPendingSearch&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;(true);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; };&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #1a1a1a; color: #d8dee9;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ebc88d;&quot;&gt;useEffect&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;(() &lt;/span&gt;&lt;span style=&quot;color: #82d2ce;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #83d6c5;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #aa9bf5;&quot;&gt;pendingSearch&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;) { // 플래그로 조건을 걸어서 동기적으로 코드 실행&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ebc88d;&quot;&gt;handleSubmitSearch&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #ebc88d;&quot;&gt;setPendingSearch&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;(false);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; &amp;nbsp;} // &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;커스텀 훅&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;&amp;nbsp; }, &lt;/span&gt;&lt;span style=&quot;color: #d6d6dd;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #aa9bf5;&quot;&gt;pendingSearch&lt;/span&gt;&lt;span style=&quot;color: #d6d6dd;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #d8dee9;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&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;1. 플래그값을 만들어서 이벤트 핸들러에서 -&amp;gt; 상태값 업데이트 후 플래그를 true로 바꿔준다(여기도 콜백함수로 넣어줬음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 플래그값을 의존성으로 가지고 있고 상태 업데이트 후 실행하고싶은 useEffect 함수를 작성해준다. 플래그값이 변경시 작동하도록 하는 구조!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약 : 플래그 하나 만들어서 상태값 업데이트 여부 확인용으로 써라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해주면 안전하게 상태값 업데이트 후 실행된다.&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;그냥 useEffect 의존성에 searchForm을 넣어줘도 되지만 그렇게 하면 검색 조건이 바뀔 때 마다 계속 호출이 가기때무네&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 상황을 막아야하는 경우 플래그값으로 컨트롤해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끗&lt;/p&gt;</description>
      <category>React.js</category>
      <category>react.js</category>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/355</guid>
      <comments>https://muna76.tistory.com/355#entry355comment</comments>
      <pubDate>Wed, 9 Jul 2025 12:20:36 +0900</pubDate>
    </item>
    <item>
      <title>면접 준비 - 3년차 프론트엔드 개발자의 면접 예상 문답</title>
      <link>https://muna76.tistory.com/352</link>
      <description>&lt;h2 data-end=&quot;128&quot; data-start=&quot;108&quot; data-ke-size=&quot;size26&quot;&gt;1. 기술 스택 관련 질문&lt;/h2&gt;
&lt;h3 data-end=&quot;193&quot; data-start=&quot;130&quot; data-ke-size=&quot;size23&quot;&gt;Q. React 기반의 프로젝트 중 가장 기억에 남는 것은? 어떤 기술적 도전이 있었고 어떻게 해결했나요?&lt;/h3&gt;
&lt;p data-end=&quot;200&quot; data-start=&quot;194&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;425&quot; data-start=&quot;201&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;425&quot; data-start=&quot;203&quot; data-ke-size=&quot;size16&quot;&gt;가장 기억에 남는 건 OOO프로젝트입니다. 체크박스와 input을 많이 사용하는 화면이 있었는데, 처음엔 사용자가 인풋을 조작할 때 마다 상태를 각각 관리하다 보니 코드가 길어지고 유지보수가 어려워졌습니다. 그래서 특정 시점에 부모 DOM 기준으로 필요한 input 값을 한 번에 가져오는 방식으로 리팩토링했습니다. 단순히 작동만 시키는 게 아니라 DX(개발자 경험)를 고려해 구조 개선한 경험이라 의미가 컸습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;479&quot; data-start=&quot;432&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;479&quot; data-start=&quot;432&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;479&quot; data-start=&quot;432&quot; data-ke-size=&quot;size23&quot;&gt;Q. Spring Boot로 개발한 경험이 있으신데, 어떤 구조로 설계했나요?&lt;/h3&gt;
&lt;p data-end=&quot;486&quot; data-start=&quot;480&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;709&quot; data-start=&quot;487&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;709&quot; data-start=&quot;489&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 Controller-Service-Repository 구조를 따랐고, MyBatis와 연동해 도메인 중심으로 Mapper를 나눴습니다. Admin 기능에서 API가 많아지는 경우, 기능 단위로 패키지를 나누고, 공통 응답 형식(ResponseDto)을 정해서 일관성을 유지했습니다. Thymeleaf 기반 화면도 있었는데, JS 모듈과 연동되는 구조는 간결하게 만들려고 노력했습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;768&quot; data-start=&quot;716&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;768&quot; data-start=&quot;716&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;768&quot; data-start=&quot;716&quot; data-ke-size=&quot;size23&quot;&gt;Q. AWS EC2, Nginx, PM2 기반의 운영 경험에서 기억에 남는 에피소드는?&lt;/h3&gt;
&lt;p data-end=&quot;775&quot; data-start=&quot;769&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;966&quot; data-start=&quot;776&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;966&quot; data-start=&quot;778&quot; data-ke-size=&quot;size16&quot;&gt;실제 운영 서버에서 업로드 기능이 작동하지 않아 원인을 파악했는데, Nginx 설정에서 body 사이즈 제한이 걸려 있었던 게 원인이었습니다. 경험이 없었다면 코드 쪽만 계속 디버깅했을 것 같은데, 다양한 영역을 경험해본 덕분에 빠르게 원인을 찾을 수 있었습니다. 이때부터는 기능뿐만 아니라 인프라 조건까지 고려하면서 개발하게 됐습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;992&quot; data-start=&quot;973&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;992&quot; data-start=&quot;973&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;992&quot; data-start=&quot;973&quot; data-ke-size=&quot;size26&quot;&gt;2. 프로젝트 경험 중심&lt;/h2&gt;
&lt;h3 data-end=&quot;1046&quot; data-start=&quot;994&quot; data-ke-size=&quot;size23&quot;&gt;Q. ㅁㅁㅁ 프로젝트에서 로그 설계를 주도했다고 했는데, 어떤 방식으로 설계하셨나요?&lt;/h3&gt;
&lt;p data-end=&quot;1053&quot; data-start=&quot;1047&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;1232&quot; data-start=&quot;1054&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1232&quot; data-start=&quot;1056&quot; data-ke-size=&quot;size16&quot;&gt;중요한 사용자 행동(ex. 결제, 포인트 적립)이 누락되면 이슈 추적이 어려워서, 요청 파라미터, 응답 결과, 사용자 ID, 타임스탬프 등을 포함한 로그 구조를 설계하고 JSON 포맷으로 저장하도록 했습니다. 이후 장애가 발생했을 때 정확한 시간대와 사용자 흐름을 바로 추적할 수 있었고, 대응 속도도 빨라졌습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1279&quot; data-start=&quot;1239&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;1279&quot; data-start=&quot;1239&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;1279&quot; data-start=&quot;1239&quot; data-ke-size=&quot;size23&quot;&gt;Q. 공공 과제 프로젝트에서 협업 중 어려웠던 점과 해결 방법은?&lt;/h3&gt;
&lt;p data-end=&quot;1286&quot; data-start=&quot;1280&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;1472&quot; data-start=&quot;1287&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1472&quot; data-start=&quot;1289&quot; data-ke-size=&quot;size16&quot;&gt;정부 과제는 요구사항 변경이 잦고, 문서화가 중요했기 때문에 기획 부서와의 소통이 특히 중요했습니다. 초반엔 API 명세서 없이 구두로 요구사항이 전달돼 문제가 생겼는데, 직접 Notion을 활용해 명세서를 작성하고 공유하는 흐름을 주도했습니다. 이후 커뮤니케이션 오류가 줄고, QA 시에도 일관성 있게 테스트할 수 있었습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;1496&quot; data-start=&quot;1479&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;1496&quot; data-start=&quot;1479&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;1496&quot; data-start=&quot;1479&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;1496&quot; data-start=&quot;1479&quot; data-ke-size=&quot;size26&quot;&gt;3. 회사/직무 관련&lt;/h2&gt;
&lt;h3 data-end=&quot;1554&quot; data-start=&quot;1498&quot; data-ke-size=&quot;size23&quot;&gt;Q. OOO의 철학 &amp;ldquo;감시보다 예방&amp;rdquo;에 공감한다고 했는데, 어떤 경험에서 그렇게 느꼈나요?&lt;/h3&gt;
&lt;p data-end=&quot;1561&quot; data-start=&quot;1555&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;1746&quot; data-start=&quot;1562&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1746&quot; data-start=&quot;1564&quot; data-ke-size=&quot;size16&quot;&gt;과거 운영 중인 시스템에서 야간에 장애가 발생한 적이 있는데, 그 경험 이후부터는 기능이 완성되었는지를 넘어서, 어떤 상황에서 깨질 수 있는지를 먼저 생각하게 됐습니다. OOO가 사고를 예방하는 기술을 만든다는 점은, 단순히 기능 구현이 아닌 &amp;lsquo;예측하고 대비하는 개발&amp;rsquo;을 지향한다는 점에서 저와 방향성이 맞다고 느꼈습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;1799&quot; data-start=&quot;1753&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;1799&quot; data-start=&quot;1753&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;1799&quot; data-start=&quot;1753&quot; data-ke-size=&quot;size23&quot;&gt;Q. React Native, Next.js는 경험이 없으신데 괜찮으신가요?&lt;/h3&gt;
&lt;p data-end=&quot;1806&quot; data-start=&quot;1800&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;2004&quot; data-start=&quot;1807&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2004&quot; data-start=&quot;1809&quot; data-ke-size=&quot;size16&quot;&gt;React 기반의 구조와 원리를 익숙하게 다루고 있고, 실제로 TanStack Query나 상태관리 등도 직접 적용해봤습니다. Next.js는 SSR 개념을 따로 공부하면서 개인 프로젝트에서 적용해본 경험이 있고, React Native는 웹프로그래밍 교육 수강시 팀프로젝트에서 사용해본 경험이 있습니다. 기본적인 컴포넌트 구조나 Expo 등을 적용해본 경험이 있기 때문에,&lt;br /&gt;실무에서 적용하는게 필요한 상황이 생긴다면 빠르게 학습할 수 있을 것이라고 생각합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;2028&quot; data-start=&quot;2011&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;2028&quot; data-start=&quot;2011&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;2028&quot; data-start=&quot;2011&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;2028&quot; data-start=&quot;2011&quot; data-ke-size=&quot;size26&quot;&gt;4. 성향/역량 검증&lt;/h2&gt;
&lt;h3 data-end=&quot;2058&quot; data-start=&quot;2030&quot; data-ke-size=&quot;size23&quot;&gt;Q. 문제가 생겼을 때 본인의 해결 방식은?&lt;/h3&gt;
&lt;p data-end=&quot;2065&quot; data-start=&quot;2059&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;2260&quot; data-start=&quot;2066&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2260&quot; data-start=&quot;2068&quot; data-ke-size=&quot;size16&quot;&gt;먼저 문제를 현상 중심이 아닌 '원인' 기준으로 분해하려고 합니다. 최근에 API 응답 속도가 느린 현상이 있었는데, 단순히 쿼리만 의심하지 않고, 네트워크, 로직 처리 시간, DB index 여부 등을 나눠서 확인했어요. 그래서 원인이 DB 쿼리의 조건 누락이었던 걸 찾아낸 적 있습니다. 무작정 고치기보다, 구조적으로 이해하려고 노력합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;2293&quot; data-start=&quot;2267&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;2293&quot; data-start=&quot;2267&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;2293&quot; data-start=&quot;2267&quot; data-ke-size=&quot;size23&quot;&gt;Q. 주말이나 야근 근무에 대한 생각은?&lt;/h3&gt;
&lt;p data-end=&quot;2300&quot; data-start=&quot;2294&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;2458&quot; data-start=&quot;2301&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2458&quot; data-start=&quot;2303&quot; data-ke-size=&quot;size16&quot;&gt;시스템의 안정성이나 이슈 대응은 개발자의 책임 중 하나라고 생각하고, 실제로 이전 회사에서도 운영 이슈로 인해 주말에 야외에서 수정한 적도 있습니다. 다만 반복되는 야근이 아닌, 예방 중심의 개발을 지향하기 때문에 구조 개선이나 문서화로 이런 상황을 줄이려고 노력합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;2483&quot; data-start=&quot;2465&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;2483&quot; data-start=&quot;2465&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;2483&quot; data-start=&quot;2465&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;2483&quot; data-start=&quot;2465&quot; data-ke-size=&quot;size26&quot;&gt;5. 기타/확장형 질문&lt;/h2&gt;
&lt;h3 data-end=&quot;2517&quot; data-start=&quot;2485&quot; data-ke-size=&quot;size23&quot;&gt;Q. 경영학 전공이 개발에 도움이 된 적이 있나요?&lt;/h3&gt;
&lt;p data-end=&quot;2524&quot; data-start=&quot;2518&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;2707&quot; data-start=&quot;2525&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2707&quot; data-start=&quot;2527&quot; data-ke-size=&quot;size16&quot;&gt;비즈니스 목표나 고객 관점에서 시스템을 바라보는 데 큰 도움이 됐습니다. 단순히 화면을 그리는 게 아니라, 왜 이 기능이 필요한가부터 먼저 고민하게 되고, 다른 부서와의 커뮤니케이션도 더 원활하게 할 수 있었습니다. 실제로 정부 과제에서는 과제 요건 문서도 함께 만들며, 기술과 행정의 간극을 줄이는데 기여했습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-end=&quot;2740&quot; data-start=&quot;2714&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;2740&quot; data-start=&quot;2714&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;2740&quot; data-start=&quot;2714&quot; data-ke-size=&quot;size23&quot;&gt;Q. 최근 관심 갖고 공부 중인 기술은?&lt;/h3&gt;
&lt;p data-end=&quot;2747&quot; data-start=&quot;2741&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;A.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;2900&quot; data-start=&quot;2748&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2900&quot; data-start=&quot;2750&quot; data-ke-size=&quot;size16&quot;&gt;Next.js의 App Router 구조와 SSR 개념에 관심이 많아서, 개인 프로젝트에 적용해보고 있습니다. 특히 React 서버 컴포넌트, 캐싱 전략, 라우트 기반 렌더링 등의 구조를 이해하고 적용하는 과정을 통해, 프론트 단에서의 성능 최적화도 고려하고 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;93&quot; data-end=&quot;143&quot;&gt;&amp;lt; 예상 질문 모음 &amp;gt;&lt;br /&gt;&lt;br /&gt;1. 기술 스택 관련 질문 (React, Spring Boot, Java 등)&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;144&quot; data-end=&quot;159&quot;&gt;&lt;b&gt;프론트엔드 경험 관련&lt;br /&gt;&lt;/b&gt;1. React 기반의 프로젝트 중 가장 기억에 남는 것은? 어떤 기술적 도전이 있었고 어떻게 해결했나요?&lt;br /&gt;2. React Query(TanStack Query)를 사용하셨던데, 이를 선택한 이유와 사용 경험을 설명해주세요.&lt;br /&gt;3. 상태관리 라이브러리는 어떤 걸 사용해봤나요? Context API, Zustand, Redux 중 어떤 걸 선호하나요?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;354&quot; data-end=&quot;371&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;백엔드 및 Java 관련&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 1.12em; letter-spacing: 0px; text-align: center;&quot;&gt;1. Java와 Node.js를 둘 다 써보셨는데, 각각의 장단점은 무엇이라 생각하시나요?&lt;br /&gt;2. &lt;/span&gt;&lt;b&gt;&lt;/b&gt;Spring Boot로 개발한 경험이 있으신데, 어떤 구조로 설계했나요? MVC 패턴에 대한 이해를 설명해주세요&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;489&quot; data-end=&quot;500&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;협업 및 환경&lt;br /&gt;&lt;/b&gt;1. gitBlit으로 사내 Git 서버를 구축하셨다고 했는데, 이를 선택한 이유와 구축 과정에서의 이슈는 없었나요?&lt;br /&gt;2. AWS EC2, Nginx, PM2 등 서버 인프라에 관여했던 경험 중 어려웠던 점과 해결 방법은?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;625&quot; data-end=&quot;628&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;630&quot; data-end=&quot;656&quot;&gt;2. 프로젝트 경험/성과 중심 질문&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;657&quot; data-end=&quot;669&quot;&gt;&lt;b&gt;OOO 프로젝트&lt;br /&gt;&lt;/b&gt;1. OOO 리뉴얼 작업에서 복잡했던 input 상태 관리 개선 경험을 설명해 주세요. 왜 해당 방식으로 개선했나요?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;736&quot; data-end=&quot;751&quot;&gt;&lt;b&gt;&lt;br /&gt;ㅁㅁㅁ / 정부과제&lt;br /&gt;&lt;/b&gt;1. ㅁㅁㅁ 프로젝트에서 로그 설계를 주도했다고 하셨는데, 구체적으로 어떤 방식으로 설계하셨나요?&lt;br /&gt;2. 정부 과제 어플 개발 시 블록체인 연계 관련된 기술 이슈나 보안 고려사항은 어떤 게 있었나요?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;863&quot; data-end=&quot;869&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;공통&lt;br /&gt;&lt;/b&gt;1. 주도적으로 문제 해결한 경험 중 가장 성과가 컸던 일은 무엇인가요?&lt;br /&gt;2. 협업 부서나 외주업체와의 소통 과정에서 발생한 갈등이나 조율 경험이 있다면?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;956&quot; data-end=&quot;959&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;961&quot; data-end=&quot;991&quot;&gt;3. OOO 회사/직무 관련 예상 질문&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;992&quot; data-end=&quot;1001&quot;&gt;&lt;b&gt;지원 동기&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1002&quot; data-end=&quot;1121&quot;&gt;
&lt;li data-start=&quot;1002&quot; data-end=&quot;1058&quot;&gt;&quot;감시보다 예방&quot;이라는 철학이 본인과 맞다고 하셨는데, 구체적으로 어떤 경험에서 그렇게 느꼈나요?&lt;/li&gt;
&lt;li data-start=&quot;1059&quot; data-end=&quot;1121&quot;&gt;OOO의 프로젝트(안전, 공공 관련)를 보며 어떤 가치를 느끼셨고, 어떤 기여를 할 수 있을 것 같나요?&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot; data-start=&quot;1123&quot; data-end=&quot;1133&quot;&gt;&lt;b&gt;&lt;br /&gt;업무 이해도&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1134&quot; data-end=&quot;1218&quot;&gt;
&lt;li data-start=&quot;1134&quot; data-end=&quot;1187&quot;&gt;React-Native, Next.js 사용 경험이 없는데, 해당 기술에 대한 학습 계획은?&lt;/li&gt;
&lt;li data-start=&quot;1188&quot; data-end=&quot;1218&quot;&gt;웹 퍼블리싱 관련 이해도나 경험은 어느 정도인가요?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;1220&quot; data-end=&quot;1223&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;1225&quot; data-end=&quot;1246&quot;&gt;4. 성향/역량 검증 질문&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1247&quot; data-end=&quot;1390&quot;&gt;
&lt;li data-start=&quot;1247&quot; data-end=&quot;1288&quot;&gt;업무 중 문제가 생겼을 때, 평소 어떤 방식으로 접근해서 해결하시나요?&lt;/li&gt;
&lt;li data-start=&quot;1289&quot; data-end=&quot;1332&quot;&gt;성실함을 강조하셨는데, 스스로 그것이 가장 잘 드러났다고 생각하는 경험은?&lt;/li&gt;
&lt;li data-start=&quot;1333&quot; data-end=&quot;1390&quot;&gt;야근이나 주말 근무 경험을 이야기해주셨는데, 워라밸과 일의 몰입 사이에서 어떻게 균형을 잡으시나요?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-start=&quot;1392&quot; data-end=&quot;1395&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot; data-start=&quot;1397&quot; data-end=&quot;1421&quot;&gt;5. 기타 기본 및 확장형 질문&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;1422&quot; data-end=&quot;1534&quot;&gt;
&lt;li data-start=&quot;1422&quot; data-end=&quot;1468&quot;&gt;프론트엔드 경력 3년차라고 했는데, 그 중에서 가장 성장을 실감한 시기는?&lt;/li&gt;
&lt;li data-start=&quot;1469&quot; data-end=&quot;1505&quot;&gt;최근 기술적으로 관심을 가지고 있는 주제나 공부 중인 기술은?&lt;/li&gt;
&lt;li data-start=&quot;1506&quot; data-end=&quot;1534&quot;&gt;경영학 전공이 개발자로서 어떤 장점이 되었나요?&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>일기 | 회고</category>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/352</guid>
      <comments>https://muna76.tistory.com/352#entry352comment</comments>
      <pubDate>Mon, 30 Jun 2025 12:58:47 +0900</pubDate>
    </item>
    <item>
      <title>setState를 했는데 바로 직전 상태값이 나와요</title>
      <link>https://muna76.tistory.com/351</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;setState() 는 상태를 업데이트하는 함수인데, 이걸 이용해서 값을 업데이트 하고자 할때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 원하는 시점에 상태값이 변하지 않고 이전 상태값을 유지하는 상황을 종종 겪었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 셀렉박스에 onChange 이벤트를 걸어서 gu() 함수를 실행시킨다고 쳐보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gu() 안에서 setState(e.target.value) 를 해주고 ,&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;내 의도대로 동작하지 않고, state는 이전 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;이건 react 내부적으로 setState를 처리하는 방식과 관련있다.&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;우선 setState함수는 비동기함수가 아니다. 근데 비동기처럼 작동을 한다(?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;State updates in React are asynchronous because they are batched and deferred for performance reasons.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 공식 문서:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://react.dev/reference/react/useState&quot;&gt;https://react.dev/reference/react/useState&lt;/a&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;먼저 setState() 함수를 호출하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 리액트는 이 함수를 업데이트큐에 집어넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이벤트 루프가 끝날때까지 이 업데이트 함수들을 업데이트 큐에 다 모아뒀다가(= 스케줄링=작업순위 관리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.그 컴포넌트의 렌더링을 트리거 하면서 모아둔 setState() 함수들을 한번에 실행하고(=batching)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 바뀐 state값으로 화면을 그려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정은 컴포넌트별로 진행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 통해서 우리가 업데이트 된 상태를 화면에서 볼 수 있게 되는것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 처음 예시 상황에서 state는 이벤트 루프가 끝나기 전에 실행되는 코드일 것으로, 업데이트가 되지 않은 상태값일 것이다.&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;상태 업데이트는 따로 해두고, 그 값을 직접 가져와서 쓰거나 useEffect를 사용해서 상태 변화를 감지한 뒤 써야 할 것 같다.&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;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>React.js</category>
      <author>문앵</author>
      <guid isPermaLink="true">https://muna76.tistory.com/351</guid>
      <comments>https://muna76.tistory.com/351#entry351comment</comments>
      <pubDate>Fri, 20 Jun 2025 17:38:58 +0900</pubDate>
    </item>
  </channel>
</rss>