<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>미고렝 코딩</title>
    <link>https://migoreng.tistory.com/</link>
    <description>코딩 일기</description>
    <language>ko</language>
    <pubDate>Sun, 5 Jul 2026 12:28:45 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>미고렝</managingEditor>
    <image>
      <title>미고렝 코딩</title>
      <url>https://tistory1.daumcdn.net/tistory/3282243/attach/a75eb233a75d43f7ba2e4321fce30c41</url>
      <link>https://migoreng.tistory.com</link>
    </image>
    <item>
      <title>npx 입력이 귀찮을 때</title>
      <link>https://migoreng.tistory.com/154</link>
      <description>&lt;p&gt;맥북에서 글로벌 npm CLI 패키지를 터미널에서 호출할 때 &lt;code&gt;npx&lt;/code&gt;를 입력하지 않고도 호출할 수 있는 방법이 있습니다. 이를 위해서는 해당 CLI 패키지를 글로벌로 설치하고, 그 경로가 $PATH 환경 변수에 포함되어 있어야 합니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;글로벌로 패키지 설치&lt;/strong&gt;:&lt;br&gt;대부분의 CLI 패키지는 글로벌로 설치했을 때 &lt;code&gt;npx&lt;/code&gt; 없이 바로 사용할 수 있습니다. 다음 명령어로 글로벌 설치를 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm install -g &amp;lt;패키지이름&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예를 들어, &lt;code&gt;create-react-app&lt;/code&gt;을 글로벌로 설치하려면:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm install -g create-react-app&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;패키지의 경로가 $PATH에 포함되어 있는지 확인&lt;/strong&gt;:&lt;br&gt;글로벌로 설치한 npm 패키지의 바이너리 경로가 &lt;code&gt;$PATH&lt;/code&gt; 환경 변수에 포함되어 있어야 합니다. 일반적으로 npm은 글로벌 패키지를 &lt;code&gt;~/npm-global/bin&lt;/code&gt;이나 &lt;code&gt;/usr/local/bin&lt;/code&gt;에 설치합니다.&lt;/p&gt;
&lt;p&gt;다음 명령어로 &lt;code&gt;$PATH&lt;/code&gt;에 경로가 포함되어 있는지 확인합니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;echo $PATH&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약 포함되어 있지 않다면, 다음과 같이 추가할 수 있습니다. 예를 들어 &lt;code&gt;~/.zshrc&lt;/code&gt; 또는 &lt;code&gt;~/.bash_profile&lt;/code&gt;에 다음 줄을 추가합니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;export PATH=$PATH:~/npm-global/bin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그런 다음, 터미널을 다시 시작하거나 다음 명령어를 실행하여 설정을 적용합니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;source ~/.zshrc  # zshrc를 사용하는 경우
source ~/.bash_profile  # bash_profile을 사용하는 경우&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이제 글로벌로 설치된 CLI 패키지를 &lt;code&gt;npx&lt;/code&gt; 없이 바로 사용할 수 있을 것입니다. 예를 들어, &lt;code&gt;create-react-app my-app&lt;/code&gt;과 같이 명령어를 실행할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이 방법으로 문제가 해결되지 않거나 추가적인 설정이 필요하면, 말씀해 주세요. 더 도와드리겠습니다!&lt;/p&gt;</description>
      <category>OS</category>
      <category>npx</category>
      <category>npx global variable</category>
      <category>npx skip</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/154</guid>
      <comments>https://migoreng.tistory.com/154#entry154comment</comments>
      <pubDate>Tue, 11 Jun 2024 16:17:27 +0900</pubDate>
    </item>
    <item>
      <title>AI와 통화기능 구현</title>
      <link>https://migoreng.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AI와 통화기능을 구현하기 위해 다음과 같은 스텝들이 필요했다.&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. 변환된 텍스트를 AI프롬프트에 입력 후 스트림 형식의 텍스트 데이터 받기.&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;4. audio/mpeg 형식의 파일을 응답받은 클라이언트는 플레이 가능 즉시 재생.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 유저로 하여금 심심하지 않게 모든 오디오에 대해 비주얼라이져를 통해 소리를 시각적으로 표현.&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. 나의 목소리를 텍스트로 변환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이부분은 web api에서 제공하는 SpeechRecognition 객체를 이용하여 구현하였다. 처음에는 매우 동작이 잘 되어 안심을 했지만, 모바일에서는 잘 되지 않는 문제가 발생하였는데, 이것은 나중에 비주얼라이저와 같이 실행할 경우에 안되는것을 알아냈다. 또한 특정 모바일에서 인식 간격이 너무 짧아 말을 천천히하면 중간에 speechend 리스터가 호출되어 버려서 프롬프트가 짤리는 현상이 발생했다. 이 문제는 추후에 버튼을 추가해 버튼을 누르기 전까지는 계속 인식을 하도록 변경하는 방향으로 했다. 당장 AI를 손 볼 시간은 없기 때문에..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 변환된 텍스트를 AI프롬프트에 입력 후 스트림 형식의 텍스트 데이터 받기. / 3. 스트림 형식의 텍스트 데이터를 음성으로 변환 후 스트림 형식으로 클라이언트로 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트림 형식의 텍스트 데이터는 기존에는 라이브러리를 사용해서 처리하고 있었다. 하지만 라이브러리에서 토큰 마다 이벤트 함수가 호출되기는 하는데, 이것을 바로 바로 음성으로 변환을 해버리면 단어가 짤리는 경우도 있고, 무엇보다 요청을 너무 많이 해버리게 된다. 따라서 이걸 문장 단위로 짤라서 음성 변환 요청을 하려고 시도를 했는데, 구조적으로 라이브러리에서 제공하는 토큰 콜백함수만으로 이를 구현하기가 매우 힘들었다. 왜냐면 비동기적으로 스트림형태의 데이터를 받고 있는데 이를 문장단위로 짜른 변수를 음성으로 변환하고, 또 음성으로 변환되는 스트림형태의 오디오 데이터를 클라이언트에게 순차적으로 보내주어야 했기 때문이다. 이를 해결하기 위해 결국 ReadableStream의 pipeThrough 메서드를 사용해야 한다는 것을 깨달았고, 결국 라이브러리를 분석하여 스트림형태의 데이터를 텍스트로 변환하는 부분만 추출하여 3개의 트랜스포머를 만들어서 순차적으로 텍스트 변환, 문장 생성, 문장 음성 변환 단계를 거친 후 클라이언트에게 성공적으로 데이터를 전달 해줄 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. audio/mpeg 형식의 파일을 응답받은 클라이언트는 플레이 가능 즉시 재생. / &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;유저로 하여금 심심하지 않게 모든 오디오에 대해 비주얼라이져를 통해 소리를 시각적으로 표현.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이부분은 자바스크립트 객체인 Audio객체를 통해 손쉽게 구현할 수 있었다. 해당 객체가 URL을 통해 audio 형식의 데이터를 받으면 자동으로 실시간 스트리밍 기능을 제공하기 때문에 큰 어려움은 없었다. 문제는 비주얼라이저였는데, 처음 사용했던 라이브러리는 나의 마이크로 입력되는 소리는 손쉽게 비주얼라이징 했지만, 서버로 부터 응답받은 오디오를 비주얼라이징 객체에 넘겨주려고했는데 Audio 객체의 play 메서드와 충돌이 일어났다. 결국 해결방법을 찾지 못한 채 다른 라이브러리인 audiomotion-analyzer를 사용해보았는데, 일단 데스크톱에서는 매우 잘 동작했다. 하지만 모바일에서는 SpeechRecognition과 비주얼라이저를 같이 사용하면 작동을 안하는 현상이 있어서, 모바일 기기에서는 마이크 입력할 때는 비주얼라이저를 꺼주었다. 아이폰에서는 잘 동작을 했지만 안드로이드에서만 이러한 현상이 나타났는데, 이는 라이브러리가 어떻게 동작하는지와 안드로이드 환경의 SpeechRecognition이 동작하는 원리를 알아야 할거 같아서 일단 미래의 내가 해결하기로 했다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 개발을 통해 stream형태의 데이터를 어떻게 다룰지 감을 잡은 거 같다.&lt;/p&gt;</description>
      <category>웹 개발/Problems</category>
      <category>buffer</category>
      <category>call with ai</category>
      <category>openai stream</category>
      <category>Stream</category>
      <category>talkdocu</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/153</guid>
      <comments>https://migoreng.tistory.com/153#entry153comment</comments>
      <pubDate>Tue, 4 Jun 2024 17:37:36 +0900</pubDate>
    </item>
    <item>
      <title>ReadableStream 활용하기</title>
      <link>https://migoreng.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ReadableStream은 fetch함수를 실행하여 얻은 response 객체의 body의 타입으로, fs 모듈에서 제공하는 클래스이며 파일을 읽고 쓰는데에 적합하다. Readable 클래스는 파일을 읽고 쓰는 필요가 없을 경우에 사용하며 메모리 위에서만 존재하고 stream 모듈에서 제공하는 클래스이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nodejs 환경에서 다른 서버로 부터 받은 응답을 바로 나의 클라이언트에게 전달 해주는 메서드인 pipe를 활용하기 위해, ReadableStream객체의 getReader 메서드를 통해 데이터(버퍼)를 추출해내서 Readable객체에 push를 해줘야 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1716517146221&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fetch('https://example.com', {
	method: 'GET',
	headers: {
		'Content-Type': 'application/json',
	},
})
	.then((response) =&amp;gt; {
		console.log('response: ', response);
		if (!response.ok) throw response.body;
		return response.body;
	})
	.then((body) =&amp;gt; {
		if (!body) return null;
		const reader = body.getReader();
		const stream = new Readable({
			async read(this) {
				const { value, done } = await reader.read();
				if (done) {
					this.push(null);
				}
				this.push(value);
			},
		});
		//another way
		// while(true){
		// 	const {done, value} = await reader.read()
		// 	if(done){
		// 		stream.push(null)
		// 		break;
		// 	}
		// 	stream.push(value)
		// }
		stream.on('data', (chunk) =&amp;gt; {
			console.log('on data chunk: ', chunk);
		});
		stream.pipe(res);
	})
	.catch((err) =&amp;gt; {
		console.log('err: ', err);
	});&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;br /&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/read&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/read&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716517331845&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;ReadableStreamBYOBReader: read() method - Web APIs | MDN&quot; data-og-description=&quot;The read() method of the ReadableStreamBYOBReader interface is used to read data into a view on a user-supplied buffer from an associated readable byte stream. A request for data will be satisfied from the stream's internal queues if there is any data pres&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/read&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/read&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NTebU/hyV9OWrpeM/6TaPubqMp0uQV9gqQLKMC0/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/read&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamBYOBReader/read&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NTebU/hyV9OWrpeM/6TaPubqMp0uQV9gqQLKMC0/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ReadableStreamBYOBReader: read() method - Web APIs | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The read() method of the ReadableStreamBYOBReader interface is used to read data into a view on a user-supplied buffer from an associated readable byte stream. A request for data will be satisfied from the stream's internal queues if there is any data pres&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716517343475&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;ReadableStream: getReader() method - Web APIs | MDN&quot; data-og-description=&quot;The getReader() method of the ReadableStream interface creates a reader and locks the stream to it. While the stream is locked, no other reader can be acquired until this one is released.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bEOWBs/hyV9RFEvac/eQPxMaXaTrNWBIuzUAzqg0/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bEOWBs/hyV9RFEvac/eQPxMaXaTrNWBIuzUAzqg0/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ReadableStream: getReader() method - Web APIs | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The getReader() method of the ReadableStream interface creates a reader and locks the stream to it. While the stream is locked, no other reader can be acquired until this one is released.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WritableStream/getWriter&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/WritableStream/getWriter&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716518930452&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;WritableStream.getWriter() method - Web APIs | MDN&quot; data-og-description=&quot;The getWriter() method of the WritableStream interface returns a new instance of WritableStreamDefaultWriter and locks the stream to that instance. While the stream is locked, no other writer can be acquired until this one is released.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WritableStream/getWriter&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WritableStream/getWriter&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ON5JY/hyV9OhP0sY/WxIjK7OToCiPIcRG2r4kL0/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WritableStream/getWriter&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WritableStream/getWriter&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ON5JY/hyV9OhP0sY/WxIjK7OToCiPIcRG2r4kL0/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;WritableStream.getWriter() method - Web APIs | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The getWriter() method of the WritableStream interface returns a new instance of WritableStreamDefaultWriter and locks the stream to that instance. While the stream is locked, no other writer can be acquired until this one is released.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/67376362/what-is-the-difference-between-createreadstream-and-readable-class&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/questions/67376362/what-is-the-difference-between-createreadstream-and-readable-class&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716518929562&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;What is the difference between &amp;quot;createReadStream&amp;quot; and &amp;quot;Readable&amp;quot; class?&quot; data-og-description=&quot;Can someone explaint Difference between createReadStream and readable in node.js? By my observes they are similar, so what is under the hood difference, and when should each be used? for example co...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/67376362/what-is-the-difference-between-createreadstream-and-readable-class&quot; data-og-url=&quot;https://stackoverflow.com/questions/67376362/what-is-the-difference-between-createreadstream-and-readable-class&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eivt2D/hyV9ZX0gsB/sjxnrc0p3KTKVR51G2AinK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/67376362/what-is-the-difference-between-createreadstream-and-readable-class&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/67376362/what-is-the-difference-between-createreadstream-and-readable-class&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eivt2D/hyV9ZX0gsB/sjxnrc0p3KTKVR51G2AinK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&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;What is the difference between &quot;createReadStream&quot; and &quot;Readable&quot; class?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can someone explaint Difference between createReadStream and readable in node.js? By my observes they are similar, so what is under the hood difference, and when should each be used? for example co...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://web.dev/articles/streams&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://web.dev/articles/streams&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1716518935647&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;Streams - 최종 가이드 &amp;nbsp;|&amp;nbsp; Articles &amp;nbsp;|&amp;nbsp; web.dev&quot; data-og-description=&quot;Streams API를 사용하면 JavaScript가 네트워크를 통해 수신된 데이터 스트림에 프로그래밍 방식으로 액세스하여 원하는 대로 처리할 수 있습니다.&quot; data-og-host=&quot;web.dev&quot; data-og-source-url=&quot;https://web.dev/articles/streams&quot; data-og-url=&quot;https://web.dev/articles/streams?hl=ko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://web.dev/articles/streams&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://web.dev/articles/streams&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Streams - 최종 가이드 &amp;nbsp;|&amp;nbsp; Articles &amp;nbsp;|&amp;nbsp; web.dev&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Streams API를 사용하면 JavaScript가 네트워크를 통해 수신된 데이터 스트림에 프로그래밍 방식으로 액세스하여 원하는 대로 처리할 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;web.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/Study</category>
      <category>Fetch</category>
      <category>javascript</category>
      <category>Readable</category>
      <category>readablestream</category>
      <category>Stream</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/152</guid>
      <comments>https://migoreng.tistory.com/152#entry152comment</comments>
      <pubDate>Fri, 24 May 2024 11:21:23 +0900</pubDate>
    </item>
    <item>
      <title>MongoDB 실행 오류</title>
      <link>https://migoreng.tistory.com/151</link>
      <description>&lt;pre id=&quot;code_1716119874441&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew tap mongodb/brew
brew install mongodb-community@7.0
brew services start mongodb-community@7.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어들을 실행해서 몽고디비를 깔고 실행을 하면, 간혹 서버의 상태가 에러로 표시되는 경우가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1716119933856&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;❯ brew services start mongodb/brew/mongodb-community@6.0

==&amp;gt; Successfully started `mongodb-community@6.0` (label: homebrew.mxcl.mongodb-c
❯ brew services
Name                  Status      User   File
mongodb-community@6.0 error  3584 ihojun ~/Library/LaunchAgents/homebrew.mxcl.mongodb-community@6.0.plist
postgresql@14         none&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나 같은 경우에는 디렉토리 접근 권한이 문제였어서, 이를 해결하기 위해 디렉토리 접근 권한을 변경해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 데이터 디렉토리와 그 안의 모든 파일들의 소유권을 현재 사용자로 변경합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1716119997759&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chown -R `id -un` /opt/homebrew/var/mongodb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데이터&amp;nbsp;디렉토리와&amp;nbsp;그&amp;nbsp;안의&amp;nbsp;모든&amp;nbsp;파일들에&amp;nbsp;적절한&amp;nbsp;권한을&amp;nbsp;부여합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1716120029449&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chmod -R 755 /opt/homebrew/var/mongodb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 로그&amp;nbsp;디렉토리와&amp;nbsp;그&amp;nbsp;안의&amp;nbsp;모든&amp;nbsp;파일들의&amp;nbsp;소유권을&amp;nbsp;현재&amp;nbsp;사용자로&amp;nbsp;변경합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1716120047271&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chown -R `id -un` /opt/homebrew/var/log/mongodb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 로그&amp;nbsp;디렉토리와&amp;nbsp;그&amp;nbsp;안의&amp;nbsp;모든&amp;nbsp;파일들에&amp;nbsp;적절한&amp;nbsp;권한을&amp;nbsp;부여합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1716120075723&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo chmod -R 755 /opt/homebrew/var/log/mongodb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정 한 후 다시 서버를 실행하면 정상적으로 작동하는것을 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: Intel 버전과 M1 버전의 맥북은 경로가 다르니 경로를 확인 할 것.&lt;/p&gt;</description>
      <category>OS/삽질하기</category>
      <category>brew services start error</category>
      <category>Error</category>
      <category>mongodb</category>
      <category>몽고디비</category>
      <category>에러</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/151</guid>
      <comments>https://migoreng.tistory.com/151#entry151comment</comments>
      <pubDate>Sun, 19 May 2024 21:02:41 +0900</pubDate>
    </item>
    <item>
      <title>SSH 접속시 no matching host key type found. Their offer: ssh-rsa 에러</title>
      <link>https://migoreng.tistory.com/150</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 연결 중에 나타난 &quot;no matching host key type found&quot; 에러는 서버가 제공하는 호스트 키 유형과 클라이언트(여기서는 맥북)가 지원하는 키 유형이 일치하지 않을 때 발생합니다. 최근 SSH 프로토콜에서는 보안이 강화되면서 일부 구형 키 유형(예: `ssh-rsa`)이 기본적으로 지원되지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 SSH 클라이언트 설정에서 `ssh-rsa` 키 유형을 명시적으로 허용하는 방법을 시도할 수 있습니다. 맥북에서는 다음 단계를 따라 설정할 수 있습니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 터미널을 열고 SSH 설정 파일을 편집&lt;/b&gt;: Terminal을 열고 아래 명령어로 SSH 설정 파일을 편집합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1715421384307&quot; class=&quot;awk&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo nano /etc/ssh/ssh_config&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;호스트 키 알고리즘 추가: 파일의 적당한 위치에 다음 두 줄을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1715421420321&quot; class=&quot;properties&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 `ssh-rsa` 키 유형을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. **파일 저장 및 종료**: 변경 사항을 저장하고 nano 편집기를 종료합니다(`Ctrl+O`, `Enter`, `Ctrl+X`).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. **SSH 다시 시도**: 이제 다시 SSH로 연결을 시도해보세요.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1715421455526&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh dlghwns0314@dlghwns0314.gabia.io&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정 변경 후에도 문제가 지속된다면, 서버 관리자에게 서버의 SSH 설정을 업데이트하여 보다 현대적인 키 유형을 지원하도록 요청하는 것도 고려할 수 있습니다.&lt;/p&gt;</description>
      <category>웹 개발/Problems</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/150</guid>
      <comments>https://migoreng.tistory.com/150#entry150comment</comments>
      <pubDate>Sat, 11 May 2024 18:58:33 +0900</pubDate>
    </item>
    <item>
      <title>Decimal calculation in Javascript</title>
      <link>https://migoreng.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트를 이용해 실수의 연산을 하다보면 소수점이 이상하게 나타나는 경우가 있다. 컴퓨터는 기본적으로 이진수를 이용하기 때문에 실수를 다루는 방식은 컴퓨팅 언어마다 다르다. Javascript는 모든 숫자를 IEEE 754 표준을 따르는 배정밀도 64 비트 부동 소수점 형식으로 표현하며, 이 형식은 실수를 근사치로 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 0.6 / 0.2 와 같은 연산을 실행 해보면 3이 아닌 2.999999999996 와 같은 예측에서 벗어난 값이 나온다. 이를 해결하기 위해 실수를 정수로 바꾼 후에 연산을 하고 다시 원래 실수로 돌려놓는 방법을 사용한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #c5c8c6;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;findMostDecimal&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;[])&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;maxDecimal&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;numberWithMostDecimals&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;decimalCount&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;countDecimalPlaces&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;decimalCount&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;maxDecimal&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;maxDecimal&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;decimalCount&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;numberWithMostDecimals&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;num&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;numberWithMostDecimals&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 실수들 중에서 가장 소수점 자리가 큰 실수를 알아낸다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #c5c8c6;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;countDecimalPlaces_10&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;isFinite&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #9a9b99;&quot;&gt;//무한대나 NaN인 경우, 0을 반환&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;indexOf&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'.'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #9a9b99;&quot;&gt;//소수점이 없는 경우, 1을 반환. (정수이므로)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;decimalPart&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;substring&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Math&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;pow&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;decimalPart&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&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;div style=&quot;background-color: #1e1e1e; color: #c5c8c6;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;operateDecimals&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value1&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value2&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;operation&lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9b0000;&quot;&gt;Tadjuster_method&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;mostDecimal&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;findMostDecimal&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value2&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;]);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;factor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;countDecimalPlaces_10&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;mostDecimal&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Math&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;floor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;factor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue2&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Math&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ce6700;&quot;&gt;floor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;value2&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;factor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;operation&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'add'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue2&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;factor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'subtract'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue2&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;factor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'multiply'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue2&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;factor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;factor&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'divide'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue1&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;newValue2&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #9a9b99;&quot;&gt;// 나눗셈의 경우, factor로 나눌 필요 없음&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;throw&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #676867;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c7444a;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9aa83a;&quot;&gt;'Invalid operation'&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9872a2;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #6089b4;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c5c8c6;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 정수로 바꾼다음 연산을 진행한 뒤 지수를 다시 나눠주면 원하는 값을 구할 수 있다.&lt;/p&gt;</description>
      <category>웹 개발/Problems</category>
      <category>decimal calculation</category>
      <category>javascript</category>
      <category>실수 연산</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/149</guid>
      <comments>https://migoreng.tistory.com/149#entry149comment</comments>
      <pubDate>Tue, 16 Jan 2024 02:10:16 +0900</pubDate>
    </item>
    <item>
      <title>babel 과 polyfill</title>
      <link>https://migoreng.tistory.com/148</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;바벨(babel)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바벨은 입력과 출력이 모두 자바스크립트 코드인 컴파일러다. 이는 보통의 컴파일러가 고수준의 언어를 저수준의 언어로 변환하는 것과 비교된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기의 바벨은 ES6 코드를 ES5코드로 변환해주는 컴파일러였다. 현재는 바벨을 이용해서 리액트의 JSX문법, 타입스크립트와 같은 정적 타입 언어, 코드 압축, 제안(proposal)단계에 있는 문법 등을 사용할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;폴리필(polyfill)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴리필이란 브라우저가 지원하지 않는 자바스크립트 코드를 지원 가능하도록 변환한 코드를 뜻한다. 하위 브라우저가 지원하는 자바스크립트 코드를 사용해 자바스크립트의 최신 기능을 똑같이 구현하는 방식이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;바벨과 폴리필&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 최신 기능을 모두 사용하면서 오래된 브라우저를 지원하려면 &lt;b&gt;바벨&lt;/b&gt;로 코드 문법을 변환하는 동시에 &lt;b&gt;폴리필&lt;/b&gt;도 사용해야 한다. &lt;b&gt;폴리필은 런타임에 기능을 주입하는 것을 말한다&lt;/b&gt;. 런타임에 기능이 존재하는지 검사해서 기능이 없는 경우에만 주입한다. 바벨을 사용하면 최신 자바스크립트 표준에 추가된 모든 기능을 사용할 수 있다고 오해하기 쉽다. 바벨을 사용하더라도 폴리필에 대한 설정은 별도로 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한가지 예로 ES8에 추가된 String.padStart 메서드는 폴리필을 이용해서 추가할 수 있다. 반면에 async await는 폴리필로 추가할 수 없으며, 컴파일 타임에 코드 변환을 해야한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;core-js 모듈의 폴리필 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;core-js는 바벨에서 폴리필을 위해 공식적으로 지원하는 패키지다. 가장 간단한 사용법은 core-js모듈을 자바스크립트 코드로 불러오는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1646168857731&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'core-js';
//core-js 모듈을 가져오면 해당 모듈의 모든 폴리필이 포함된다. 
//따라서 낮은 버전의 브라우저에서도 프로미스, Object.values, 배열의 includes메서드를 사용할 수 있다.
const p = Promise.resolve(10);
const obj = {
    a: 10,
    b: 20,
    c: 30,
}
const arr=  Object.values(obj);
const exist = arr.includes(20);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1646169667104&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import 'core-js/features/promise';
import 'core-js/features/object/values';
import 'core-js/features/array/includes';
//core-js로 부터 직접 필요한 폴리필만 가져오면 번들 파일의 크기를 줄일 수 있다.
const p = Promise.resolve(10);
const obj = {
     a: 10,
     b: 20,
     c: 30,
};
const arr= Object.values(obj);
const exist = arr.includes(20);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@babel/preset-env 프리셋 이용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@babel/preset-env 프리셋은 실행환경에 대한 정보를 설정해 주면 자동으로 필요한 기능을 주입해준다. 예를 들어, babel, config.js 파일에 다음 내용을 입력하면 특정 버전의 브라우저를 위한 플러그인 만 포함된다.&lt;/p&gt;
&lt;pre id=&quot;code_1646169977875&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const presets= [
   [
      '@babel/preset-env',
      {
         targets: '&amp;gt; 0.25%, not dead',
         //targets 속성으로 지원하는 브라우저 정보를 입력한다.
         //여기서는 시장 점유율이 0.25% 이상이고 업데이트가 종료되지 않은 브라우저를 입력했다.
         //브라우저는 browserlist라는 패키지의 문법을 사용한다.
      },
   ]
];

module.exports= {presets};&lt;/code&gt;&lt;/pre&gt;</description>
      <category>웹 개발/Study</category>
      <category>javascript babel</category>
      <category>javascript polyfill</category>
      <category>자바스크립트 babel</category>
      <category>자바스크립트 폴리필</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/148</guid>
      <comments>https://migoreng.tistory.com/148#entry148comment</comments>
      <pubDate>Wed, 2 Mar 2022 06:39:02 +0900</pubDate>
    </item>
    <item>
      <title>Closure, 클로저 함수</title>
      <link>https://migoreng.tistory.com/147</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_1646067887559&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 클로저를 만드는 형태 1. - 중첩함수
function outerFn() {
  let x = 10;
  return function innerFn(y) { // innerFn 함수는 클로저다.
    return x = x + y;
  }
}
let a = outerFn(); // 외부함수 호출은 한번만. 이제 a 변수는 innerFn 함수를 참조한다.
a(5); // 15;
a(5); // 20;
a(5); // 25;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1646067899272&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 클로저를 만드는 형태 2. - 전역에 선언한 변수를 박스 안에서 함수로 정의하고 전역에서 호출
let globalFunc;
{
  let x = 10;
  globalFunc = function(y) { // globalFunc 함수는 클로저다.
    return x = x + y;
  }
}
globalFunc(5); // 15;
globalFunc(5); // 20;
globalFunc(5); // 25;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 클로저는 내부함수가 외부함수의 맥락(context)에 접근 할 수 있는 것을 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 외부로 전달이 항상&amp;nbsp; return을 의미하는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 클로저는 특정 상황에서 발생하는 &quot;현상&quot;이고 함수는 이 현상이 나타나기 위한 &quot;조건&quot;에 해당한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;장점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 데이터를 보전할 수 있다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로저 함수는 외부 함수의 실행이 끝나더라도 외부 함수 내 변수를 사용 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로저는 이처럼 특정 데이터를 스코프 안에 가두어둔 채로 계속 사용할 수 있게 하는 폐쇄성을 갖는다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 정보의 접근 제한 (캡슐화)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'클로저 모듈 패턴'을 사용해 객체에 담아 여러개의 함수를 리턴하도록 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 정보의 접근을 제한하는 것을 캡슐화라고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 모듈화에 유리하다.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로저 함수를 각각의 변수에 할당하면 각자 독립적으로 값을 사용하고 보존할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 함수의 재사용성을 극대화, 함수 하나를 독립적인 부품의 형태로 분리하는 것을 모듈화라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로저를 통해 데이터와 메소드를 묶어다닐 수 있기에 클로저는 모듈화에 유리하다.&lt;/p&gt;</description>
      <category>웹 개발/Study</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/147</guid>
      <comments>https://migoreng.tistory.com/147#entry147comment</comments>
      <pubDate>Tue, 1 Mar 2022 02:12:35 +0900</pubDate>
    </item>
    <item>
      <title>let, var, const 차이점</title>
      <link>https://migoreng.tistory.com/146</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 변수 선언 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var는 한번 선언한 변수일지라도 중복해서 선언을 할 수 있는 특징이 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1646066754691&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = 1;
console.log(a)//1
var a = 2;
console.log(a)//2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 한번 선언을 한 a 변수 일지라도 var태그를 사용하여 선언 하면 다시 선언을 할 수 있다. 이는 간단한 테스트에는 편리할 수 있으나 코드량이 많아진다면 어디에서 사용했었는지 파악하기가 어렵고 기존의 값이 바뀌어 버그가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 달리 let과 const는 재선언이 불가능하다. 하지만 이 둘에도 차이점이 있는데, 그것은 immutable여부이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let은 변수에 재할당이 가능하고, const는 불가능하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 호이스팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호이스팅(Hoisting)이란, var 선언문이나 function 선언문 등을 해당 스코프의 선두로 옮긴 것처럼 동작하는 특성을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 ES6에서 도입된 let, const를 포함하여 모든 선언(var, let, const function function*, class)을 호이스팅한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, var 로 선언된 변수와 달리 let로 선언된 변수를 선언문 이전에 참조하면 참조 에러(ReferenceError)가 발생한다.&lt;/p&gt;
&lt;pre id=&quot;code_1646067105649&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(foo);//undefined
var foo;

console.log(bar); //Error: Uncaught ReferenceError: bar is not defined
let bar;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 let 로 선언된 변수는 스코프의 시작에서 변수의 선언까지 일시적 사각지대(Temporal Dead Zone; TDZ)에 빠지기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 변수는 선언 단계 &amp;gt; 초기화 단계 &amp;gt; 할당 단계에 걸쳐 생성되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var 으로 선언된 변수는 선언 단계와 초기화 단계가 한번에 이루어진다. 하지만 let으로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1646067304988&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//스코프의 선두에서 선언 단계와 초기화 단계가 실행된다.
//따라서 변수 선언문 이전에 변수를 참조할 수 있다.

console.log(foo);

var foo;
console.log(foo);
foo = 1; //할당문에서 할당 단계가 실행된다.
console.log(foo); //1&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1646067425978&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//스코프의 선두에서 선언단계가 실행된다.
//아직 변수가 초기화(메모리 공간 확보와 undefined로 초기화)되지 않았다.
//따라서 변수 선언문 이전에 변수를 참조할 수 없다.

console.log(foo); //ReferenceError: foo is not defined

let foo; //변수 선언문에서 초기화 단계가 실행된다
console.log(foo); //undefined

foo = 1; //할당문에서 할당 단계가 실행된다.
console.log(foo); //1&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 선언에는 기본적으로 const를 사용하고, 재할당이 필요한 경우에 한정해 let을 사용하는것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 객체를 재할당하는 경우는 생각보다 흔하지 않다. const를 사용하면 의도치 않은 재할당을 방지해 주기 때문에 보다 안전하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/Study</category>
      <category>const</category>
      <category>javascript</category>
      <category>Let</category>
      <category>letvarconst</category>
      <category>var</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/146</guid>
      <comments>https://migoreng.tistory.com/146#entry146comment</comments>
      <pubDate>Tue, 1 Mar 2022 02:00:05 +0900</pubDate>
    </item>
    <item>
      <title>Git repository와 로컬 폴더 연결</title>
      <link>https://migoreng.tistory.com/145</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Git push가 안되는 경우 (fatal: refusing to merge unrelated histories)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 저장소에 있는 프로젝트를&amp;nbsp;깃허브 사이트를 통해 만든 저장소로 push 하는 경우에 이런 메세지가 뜨는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&lt;span&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3&lt;/span&gt;&lt;br /&gt;&lt;span&gt;4&lt;/span&gt;&lt;br /&gt;&lt;span&gt;5&lt;/span&gt;&lt;br /&gt;&lt;span&gt;6&lt;/span&gt;&lt;br /&gt;&lt;span&gt;7&lt;/span&gt;&lt;br /&gt;&lt;span&gt;8&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;C:\Users\gitProject&amp;gt;git&amp;nbsp;push&amp;nbsp;origin&amp;nbsp;master&lt;/span&gt;&lt;br /&gt;&lt;span&gt;To&amp;nbsp;&lt;a href=&quot;https://github.com/userId/userProject.git&quot;&gt;https://github.com/userId/userProject.git&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp;!&amp;nbsp;[rejected]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;master&amp;nbsp;-&amp;gt;&amp;nbsp;master&amp;nbsp;(non-fast-forward)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;error:&amp;nbsp;failed&amp;nbsp;to&amp;nbsp;push&amp;nbsp;some&amp;nbsp;refs&amp;nbsp;to&amp;nbsp;'&lt;a href=&quot;https://github.com/userId/userProject.git'&quot;&gt;https://github.com/userId/userProject.git'&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;hint:&amp;nbsp;Updates&amp;nbsp;were&amp;nbsp;rejected&amp;nbsp;because&amp;nbsp;the&amp;nbsp;tip&amp;nbsp;of&amp;nbsp;your&amp;nbsp;current&amp;nbsp;branch&amp;nbsp;is&amp;nbsp;behind&lt;/span&gt;&lt;br /&gt;&lt;span&gt;hint:&amp;nbsp;its&amp;nbsp;remote&amp;nbsp;counterpart.&amp;nbsp;Integrate&amp;nbsp;the&amp;nbsp;remote&amp;nbsp;changes&amp;nbsp;(e.g.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;hint:&amp;nbsp;'git&amp;nbsp;pull&amp;nbsp;...')&amp;nbsp;before&amp;nbsp;pushing&amp;nbsp;again.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;hint:&amp;nbsp;See&amp;nbsp;the&amp;nbsp;'Note&amp;nbsp;about&amp;nbsp;fast-forwards'&amp;nbsp;in&amp;nbsp;'git&amp;nbsp;push&amp;nbsp;--help'&amp;nbsp;for&amp;nbsp;details.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span style=&quot;background-color: #4f4f4f; color: #ffffff;&quot;&gt;cs&lt;/span&gt;&lt;/a&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;push 전에 먼저 pull을 해서 프로젝트를 병합해 주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&lt;span&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;refusing&amp;nbsp;to&amp;nbsp;merge&amp;nbsp;unrelated&amp;nbsp;histories&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span style=&quot;background-color: #4f4f4f; color: #ffffff;&quot;&gt;cs&lt;/span&gt;&lt;/a&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;pull 명령 실행시 이런 문구와 함께 진행되지 않는다면, 다음의 명령으로 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&lt;span&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;git&amp;nbsp;pull&amp;nbsp;origin&amp;nbsp;브런치명&amp;nbsp;--allow-unrelated-histories&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot;&gt;&lt;span style=&quot;background-color: #4f4f4f; color: #ffffff;&quot;&gt;cs&lt;/span&gt;&lt;/a&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;span style=&quot;background-color: #272727; color: #f0f0f0;&quot;&gt;--allow-unrelated-histories &lt;/span&gt;&amp;nbsp; 이 명령 옵션은 이미 존재하는&amp;nbsp;두 프로젝트의 기록(history)을 저장하는 드문 상황에&amp;nbsp;사용된다고 한다. 즉, git에서는 서로 관련&amp;nbsp;기록이 없는 이질적인 두 프로젝트를 병합할 때 기본적으로&amp;nbsp;거부하는데, 이것을 허용해 주는 것이다.&lt;/p&gt;</description>
      <category>Git</category>
      <category>git</category>
      <author>미고렝</author>
      <guid isPermaLink="true">https://migoreng.tistory.com/145</guid>
      <comments>https://migoreng.tistory.com/145#entry145comment</comments>
      <pubDate>Fri, 20 Aug 2021 03:18:15 +0900</pubDate>
    </item>
  </channel>
</rss>