<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>모든 일에 의문을 제기하고 그 의문을 해결하기 위해 지식을 구하고 공부</title>
    <link>https://grownfresh.tistory.com/</link>
    <description>모든 일에 의문을 제기하고 그 의문을 해결하기 위해 지식을 구하고 공부하고 노력하자.</description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 21:59:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>GROWNFRESH</managingEditor>
    <item>
      <title>react-native 0.72 버전 업데이트 사항(번역)</title>
      <link>https://grownfresh.tistory.com/469</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Symlink 지원, 에러 개선 등&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;이번 릴리즈는 Metro와 에러 핸들링 개선 및 개발 경험 향상과 관련해서 많이 요청된 기능이 더해졌다. 이번 태스크의 대부분은 2022 커뮤니티 설문조사 응답을 반여했다. 설문에 참여해준 모든 분께 감사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;주요 변경사항&lt;/blockquote&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;blockquote data-ke-style=&quot;style2&quot;&gt;유의 변경사항&lt;/blockquote&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&amp;nbsp;주요 변경사항&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메트로의 새로운 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Symlink 지원 (베타 버전)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Symlink 지원은 계속해서 메트로에서 가장 많이 요청되는 기능 중 하나이다. (...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Symlink 지원은 RN이 &lt;u&gt;monorepo 설정과 pnpm과 밀접하게 동작&lt;/u&gt;할 수 있도록 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(...) 우리는 0.73 버전에서 symlink 기능이 기본으로 탑재될 수 있도록 계획하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;패키지 export 지원 (베타 버전)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 export는 &lt;u&gt;package.json &quot;main&quot; 필드를 대체&lt;/u&gt;하는 최신 문법이다. 그리고 npm 패키지가 &lt;u&gt;공용 API를 정의하고 RN을 타겟팅&lt;/u&gt;할 수 있는 새로운 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Metro 설정에서 패키지 Export 지원을 할 수 있도록 하면 당신의 앱은 새로운 &quot;react-native&quot; 커뮤니티 조건을 포함해 더 넓은 JS 생태계와 호환될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;베타기능 가능여부 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 2가지 베타 기능 가능여부를 metro.config.js 에서 설정하면 된다. (홈페이지에 코드 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;새로운 metro.config.js 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RN 0.72 버전에서 RN CLI setup을 컨트롤하는 설정을 변경했다. 템플릿 버전을 맞추기 위해 metro.config.js 파일을 업데이트 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 프로젝트의 기본 RN Metro 설정을 확장하는 것에 대한 컨트롤 키를 이동시킨다. 그리고 남은 기본값을 제거했다. 더하여 'metro get-dependencies' 같은&amp;nbsp; Metro CLI 독립 커맨드가 이제 동작할 것이다.&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개발자 경험 향상&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;부적합한 style 속성에 red box가 보이지 않음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전에는 StyleSheet에 부적합한 style 속성을 제공하면 redbox에 결과가 나왔다. 이것은 높은 수준의 에러 경고를 나타냅니다. 이것은 높은 신호 오류인데요. 상대적으로 위험성이 낮은 에러에 대해 개발자 워크플로우를 방해합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.72에서 &lt;u&gt;부적합한 css 속성을 제공하는 것 같은 실패에 대해 조용히 표시하도록 기대치를 낮췄습니다.&lt;/u&gt; 그리고 빌드타임이나 런타임에 잡히는 몇몇 에러 타입을 업데이트했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Hermes 에러 가독성 개선&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes는 &lt;u&gt;undefined 콜러를 호출&lt;/u&gt;할 때 더 나은 에러 메세지를 추가했다.&lt;/p&gt;
&lt;pre id=&quot;code_1714632666838&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Before: undefined is not a function
// After: x is not a function (it is undefined)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 로그박스는 현재 앱 &lt;u&gt;유저와 관련 없는 Hermes 바이트코드 프레임을 필터링&lt;/u&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;RN CLI 에러 아웃풋 향상&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.72는 &lt;u&gt;RN CLI v11&lt;/u&gt;과 함께 출시됩니다. v11은 중복 감소, 워딩을 명확하게 변경한 것, 스택 추적 감소, 그리고 init, run-android, run-ios 커맨드에 관련 문서에 대한 딥링크를 추가한 것 등의 개선 사항이 포함됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RN CLI 체인지 로그 확인해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;더 빨라진 컴파일 및 Hermes JSON 파싱 속도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes는 &lt;u&gt;큰 사이즈의 객체 리터럴에 대해 컴파일하는 속도를 향상&lt;/u&gt;했다. (...) Herme 사용 알고리즘에서 중복 제거 매커니즘을 향상시키면서 &lt;u&gt;컴파일 속도가 97%까지 빨라졌다&lt;/u&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;JSON 파싱&lt;/u&gt;도 여러 방면에서 최적화됐다. 이는 redux-persist 처럼 &lt;u&gt;JSON에 깊게 의존하는 라이브러리 기능을 향상&lt;/u&gt;시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Hermes에서 더 많은 ES문법 지원&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- {Array, TypedArray, String}.at&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 올바른 형식의 JSON.stringify 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 오류를 하나의 오류로 묶어 나타내는 AggregateError 구현 (Promise.any() 등 여러 오류가 발생하는 경우 유용)&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;새로운 아키텍쳐 업데이트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 아키텍쳐는 현재 실험 단계다. 타겟 오디언스에게 집중된 업데이트를 계속하기 위해서, 0.72에서 새 아키텍쳐 업데이트와 향후 릴리즈들을 &lt;a href=&quot;https://github.com/reactwg/react-native-new-architecture&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;u&gt;전담 그룹으로 이관&lt;/u&gt;&lt;/a&gt;하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;유의 변경사항&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;지원중단된 컴포넌트 제거&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- @react-native-community/slider Slider&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- @react-native-community/datetimepicker DatePickerIOS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- @react-native-community/progress-view ProgressViewIOS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;패키지 rename&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react-native core 레파지토리 내 모든 패키지가 react-native/package 내부로 이동되었다. 그리고 명확한 소유권을 확실하게 하기 위해서 @react-native라는 npm 스코프 아래에 출시된다.&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;그리고 몇몇 패키지 명칭이 변경된다. (ex. @react-native/polyfills -&amp;gt; @react-native/js-polyfills...)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rename한 패키지에 대해 직접적인 종속성이 없는 한, 이 변경점은 영향을 미치지 않을 것이다. 한편, 0.72로 업그레이드 하면, 리네임된 디펜던시를 0.72 버전으로 업데이트해라.&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;
&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;&lt;a href=&quot;https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://reactnative.dev/blog/2023/06/21/0.72-metro-package-exports-symlinks&lt;/a&gt;&lt;/p&gt;</description>
      <category>React-Native/공식홈 블로그</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/469</guid>
      <comments>https://grownfresh.tistory.com/469#entry469comment</comments>
      <pubDate>Fri, 3 May 2024 09:53:02 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트의 여러가지 엔진들</title>
      <link>https://grownfresh.tistory.com/468</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript의 여러 엔진들에 대해 알아보자.&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;Javascript 엔진이란?)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JS 코드를 실행하는 프로그램 또는 &lt;u&gt;인터프리터*&lt;/u&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;V8&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발사: Google&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발언어: C++&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용처: Node.js 런타임, Chrome 브라우저&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 속도 향상을 위해 인터프리터 대신 &lt;u&gt;JIT 컴파일러*&lt;/u&gt;를 사용해 더 효율적으로 JS를 기계어로 번역한다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Javascript Core&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발사: Apple&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용처: Safari, RN App&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;SpiderMonkey&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최초의 엔진 / C++ / FireFox에 사용&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;Chakra&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MS 개발 / IE, Edge에 사용&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;Rhino&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Java / Mozilla에 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;*인터프리터&lt;/u&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;u&gt;* JIT 컴파일러&lt;/u&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;- 코드가 실행되는 과정에 실시간으로 일어나며 그래서 Just-In-Time이고, &lt;u&gt;동적 번역&lt;/u&gt;이라고도 불린다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 한줄씩 실행하는 &lt;u&gt;인터프리터&lt;/u&gt;보다는 빠르고, 실행 전에 미리 컴파일하는 &lt;u&gt;정적 컴파일&lt;/u&gt;보다는 성능이 떨어진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 자주 사용되는 메서드 등은 캐싱해서 &lt;u&gt;최적화&lt;/u&gt;시킨다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 대표적으로 &lt;u&gt;JVM&lt;/u&gt;(자바 가상 머신)과 &lt;u&gt;V8&lt;/u&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;&lt;i&gt;JVM에서 JIT를 도입한 배경을 설명해보자면..&lt;/i&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;자바는 &lt;b&gt;JVM&lt;/b&gt;이 &lt;u&gt;이해&lt;/u&gt;할 수 있는 &lt;u&gt;바이트코드&lt;/u&gt;로 먼저 컴파일하고, JVM에서 &lt;u&gt;인터프리터&lt;/u&gt;로 기계어로 번역해 OS에 전달한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Java&lt;/b&gt; --&amp;gt; &lt;b&gt;javac&lt;/b&gt; --&amp;gt; 바이트코드로 변환 --&amp;gt; &lt;b&gt;JVM&lt;/b&gt; --&amp;gt; 인터프리터로 기계어 변환 --&amp;gt; &lt;b&gt;OS&lt;/b&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;자바는 바이트코드로 컴파일하는 과정과 인터프리트하는 과정을 거쳐야해서, 컴파일 과정만 거치는 다른 언어들보다 느리다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이런 문제를 개선하기 위해 JIT 컴파일러를 일부 도입한 것.&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;a href=&quot;https://samslow.github.io/development/2020/07/06/JIT/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://samslow.github.io/development/2020/07/06/JIT/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hyeinisfree.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hyeinisfree.tistory.com/26&lt;/a&gt;&lt;/p&gt;</description>
      <category>JavaScript</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/468</guid>
      <comments>https://grownfresh.tistory.com/468#entry468comment</comments>
      <pubDate>Sat, 18 Nov 2023 20:35:02 +0900</pubDate>
    </item>
    <item>
      <title>앱 성능 개선하기</title>
      <link>https://grownfresh.tistory.com/464</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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://developer.android.com/studio/profile/measuring-performance?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/studio/profile/measuring-performance?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698407923026&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;앱 성능 측정 개요 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;앱 성능 측정 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 주제는 앱의 주요 성능 문제를 식별하고 해결하는 데 도움이 됩니다. 주요 성능 문제 &quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/studio/profile/measuring-performance?hl=ko&quot; data-og-url=&quot;https://developer.android.com/studio/profile/measuring-performance?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bCSAAN/hyUlromgt3/1sSKCAhli6rf9tg9janwik/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/profile/measuring-performance?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/studio/profile/measuring-performance?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bCSAAN/hyUlromgt3/1sSKCAhli6rf9tg9janwik/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&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;앱 성능 측정 개요 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;앱 성능 측정 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 주제는 앱의 주요 성능 문제를 식별하고 해결하는 데 도움이 됩니다. 주요 성능 문제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.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;앱 크래쉬 에러를 심층적으로 분석해준다고 하는데..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://imqa.io/page/lite&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://imqa.io/page/lite&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698408027515&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;IMQA LITE | IMQA - 모바일 성능 모니터링 솔루션&quot; data-og-description=&quot;IMQA는 모바일 성능 모니터링 솔루션(MPM)과 모바일 이상 징후(Crash) 모니터링 솔루션을 제공하고 있습니다.&quot; data-og-host=&quot;imqa.io&quot; data-og-source-url=&quot;https://imqa.io/page/lite&quot; data-og-url=&quot;http://imqa.io/page/lite&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bxjegd/hyUkagdjQz/D06IIBizl06JKq0Yk8nRO0/img.png?width=199&amp;amp;height=104&amp;amp;face=0_0_199_104,https://scrap.kakaocdn.net/dn/b3kElp/hyUj8o8FfH/Jk7bSdSkGKxaV0Akufnqhk/img.png?width=199&amp;amp;height=104&amp;amp;face=0_0_199_104,https://scrap.kakaocdn.net/dn/kxQ2Q/hyUlrWclpe/OG3fpI1MRgYyc1zPtXw4JK/img.jpg?width=1308&amp;amp;height=4648&amp;amp;face=0_0_1308_4648&quot;&gt;&lt;a href=&quot;https://imqa.io/page/lite&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://imqa.io/page/lite&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bxjegd/hyUkagdjQz/D06IIBizl06JKq0Yk8nRO0/img.png?width=199&amp;amp;height=104&amp;amp;face=0_0_199_104,https://scrap.kakaocdn.net/dn/b3kElp/hyUj8o8FfH/Jk7bSdSkGKxaV0Akufnqhk/img.png?width=199&amp;amp;height=104&amp;amp;face=0_0_199_104,https://scrap.kakaocdn.net/dn/kxQ2Q/hyUlrWclpe/OG3fpI1MRgYyc1zPtXw4JK/img.jpg?width=1308&amp;amp;height=4648&amp;amp;face=0_0_1308_4648');&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;IMQA LITE | IMQA - 모바일 성능 모니터링 솔루션&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;IMQA는 모바일 성능 모니터링 솔루션(MPM)과 모바일 이상 징후(Crash) 모니터링 솔루션을 제공하고 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;imqa.io&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;Metro로 만든 번들 결과물을 분석해준다고 한다!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/IjzerenHein/react-native-bundle-visualizer&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/IjzerenHein/react-native-bundle-visualizer&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698408090590&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;GitHub - IjzerenHein/react-native-bundle-visualizer: See what packages are increasing your react-native bundle size  &quot; data-og-description=&quot;See what packages are increasing your react-native bundle size   - GitHub - IjzerenHein/react-native-bundle-visualizer: See what packages are increasing your react-native bundle size  &quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/IjzerenHein/react-native-bundle-visualizer&quot; data-og-url=&quot;https://github.com/IjzerenHein/react-native-bundle-visualizer&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzrpBM/hyUkjKX6B6/HbzKwiQLCrLJVIX1yuKCQK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/IjzerenHein/react-native-bundle-visualizer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/IjzerenHein/react-native-bundle-visualizer&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzrpBM/hyUkjKX6B6/HbzKwiQLCrLJVIX1yuKCQK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - IjzerenHein/react-native-bundle-visualizer: See what packages are increasing your react-native bundle size  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;See what packages are increasing your react-native bundle size   - GitHub - IjzerenHein/react-native-bundle-visualizer: See what packages are increasing your react-native bundle size  &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;</description>
      <category>React-Native/성능 개선</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/464</guid>
      <comments>https://grownfresh.tistory.com/464#entry464comment</comments>
      <pubDate>Fri, 27 Oct 2023 21:00:44 +0900</pubDate>
    </item>
    <item>
      <title>앱 업데이트 안내 방법</title>
      <link>https://grownfresh.tistory.com/463</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;a href=&quot;https://www.mobiinside.co.kr/2021/09/23/update-popup/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.mobiinside.co.kr/2021/09/23/update-popup/&lt;/a&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;안드로이드에는 인앱 업데이트라고 해서, 구글 플레이스토어 코어 라이브러리인 기능이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업데이트할 내용이 있다면 업데이트 창을 띄워주고, 업데이트하기 했을 때 백그라운드에서 업데이트가 이뤄진다! 그동안 앱을 이용할 수 있다! 그러고는 앱을 재시작하라는 바텀시트가 뜬다! 넘나 유용! 하지만 아직 ios에는 비슷한 기능이 없다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/guide/playcore/in-app-updates?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/guide/playcore/in-app-updates?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698323130114&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;인앱 업데이트 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;인앱 업데이트 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 사용자는 기기에서 앱을 최신 상태로 유지하여 새로운 기능을 사용해 보고 성능 향상과 버그 &quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/guide/playcore/in-app-updates?hl=ko&quot; data-og-url=&quot;https://developer.android.com/guide/playcore/in-app-updates?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/6WKj9/hyUkebwbCe/REoqnwhd27RN66w1hb5L70/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/UFeVu/hyUkjYcn9g/ukxzKGipKPheQjeOAFZhK1/img.png?width=1384&amp;amp;height=916&amp;amp;face=0_0_1384_916,https://scrap.kakaocdn.net/dn/cz5E7a/hyUklaCZdq/R8rAncYQSIPLGf7HaDj25K/img.png?width=904&amp;amp;height=916&amp;amp;face=0_0_904_916&quot;&gt;&lt;a href=&quot;https://developer.android.com/guide/playcore/in-app-updates?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/guide/playcore/in-app-updates?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/6WKj9/hyUkebwbCe/REoqnwhd27RN66w1hb5L70/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676,https://scrap.kakaocdn.net/dn/UFeVu/hyUkjYcn9g/ukxzKGipKPheQjeOAFZhK1/img.png?width=1384&amp;amp;height=916&amp;amp;face=0_0_1384_916,https://scrap.kakaocdn.net/dn/cz5E7a/hyUklaCZdq/R8rAncYQSIPLGf7HaDj25K/img.png?width=904&amp;amp;height=916&amp;amp;face=0_0_904_916');&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;인앱 업데이트 &amp;nbsp;|&amp;nbsp; Android 개발자 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;인앱 업데이트 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 사용자는 기기에서 앱을 최신 상태로 유지하여 새로운 기능을 사용해 보고 성능 향상과 버그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.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;</description>
      <category>개발노트</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/463</guid>
      <comments>https://grownfresh.tistory.com/463#entry463comment</comments>
      <pubDate>Thu, 26 Oct 2023 21:31:31 +0900</pubDate>
    </item>
    <item>
      <title>소스맵이란?</title>
      <link>https://grownfresh.tistory.com/462</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;소스맵&lt;/b&gt;이란 무엇일까?&lt;br /&gt;소스맵에 대한 블로그 글을 개념 숙지 겸 간단히 정리해 보았다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;u&gt;맵핑 정보&lt;/u&gt;가 선언된 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- *.map 확장자이며, JSON 형태로 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 파일을 웹 서버에 제공하면 브라우저는 소스맵을 적용해 변환된 코드를 디버깅할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적으로 Vite, Webpack 등의 번들러에서 소스맵 생성 옵션을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일 내용 중 'mappings'라는 키값이 원본소스와 변형된 소스 간 관계를 나타내고, 아래처럼 &lt;b&gt;VLQ Base64 형태&lt;/b&gt;로 인코딩된 문자열이다.&lt;/p&gt;
&lt;pre id=&quot;code_1698308539034&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AAAA,SAAS,cAAc,WAAW,iBAAiB,SAAS;IAC1D,...&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;h2 data-ke-size=&quot;size26&quot;&gt;소스맵이 필요한 이유는?&lt;/h2&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;코드 양을 줄여 &lt;u&gt;&lt;b&gt;브라우저가 파일을 다운로드하고 해석하는 데 시간을 줄이기&lt;/b&gt;&lt;/u&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;그런데 변수명 변경 등의 변화가 일어나고, 또 scss나 typescript 같은 파일들은 &lt;b&gt;**브라우저가 읽을 수 있는&lt;/b&gt; css나 js로 &lt;u&gt;변형&lt;/u&gt;되기 때문에 변형된 소스코드에서 에러가 일어난 부분이 원본 소스 코드 중 정확히 어떤 부분인지 &lt;u&gt;유추하기 어렵다&lt;/u&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;b&gt;**브라우저는&lt;/b&gt; html, css, js 언어를 읽을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**js 는 html에 종속되어 있는 언어이고, html 정적 언어를 조작 및 변경하기 위해 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html을 js가 조작하고 &amp;gt; js는 브라우저가 해석한다. 브라우저에는 js 해석 엔진이 있다.&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;h2 data-ke-size=&quot;size26&quot;&gt;소스맵을 사용하고 싶지 않을 때는?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간혹 잘못된 소스맵이 적용되어서 디버깅에 방해가 될 때도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴&lt;span&gt; &lt;/span&gt;때는&lt;span&gt; &lt;/span&gt;브라우저&lt;span&gt; &lt;/span&gt;환경&lt;span&gt; &lt;/span&gt;설정에서&lt;span&gt; &amp;lsquo;&lt;/span&gt;자바스크립트&lt;span&gt; &lt;/span&gt;소스&lt;span&gt; &lt;/span&gt;맵&lt;span&gt; &lt;/span&gt;사용&lt;span&gt; &lt;/span&gt;설정&lt;span&gt;&amp;rsquo;, &amp;lsquo;CSS &lt;/span&gt;소스&lt;span&gt; &lt;/span&gt;맵&lt;span&gt; &lt;/span&gt;사용&lt;span&gt; &lt;/span&gt;설정&lt;span&gt;&amp;rsquo; &lt;/span&gt;을&lt;span&gt; &lt;/span&gt;해제하면&lt;span&gt; &lt;/span&gt;원본&lt;span&gt; &lt;/span&gt;코드를&lt;span&gt; &lt;/span&gt;직접&lt;span&gt; &lt;/span&gt;디버깅할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;u&gt;&lt;b&gt;빌드 시간을 늘리고, 빌드 결과물의 크기를 늘린다&lt;/b&gt;&lt;/u&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;대부분의&lt;span&gt; &lt;/span&gt;번들러는&lt;span&gt; &lt;/span&gt;이러한&lt;span&gt; &lt;/span&gt;기능을&lt;span&gt; &lt;/span&gt;이미&lt;span&gt; &lt;/span&gt;제공하고&lt;span&gt; &lt;/span&gt;있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/2082/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yozm.wishket.com/magazine/detail/2082/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698303215077&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;소스 맵의 동작 원리는 무엇일까? | 요즘IT&quot; data-og-description=&quot;실제로 디버깅을 해보면 브라우저에서 인식할 수 없는 파일이라고 해도 코드 라인의 위치를 정확히 짚어주는 것을 확인할 수 있습니다. 이것이 가능한 이유는 우리가 브라우저에게 원본 소스 &quot; data-og-host=&quot;yozm.wishket.com&quot; data-og-source-url=&quot;https://yozm.wishket.com/magazine/detail/2082/&quot; data-og-url=&quot;https://yozm.wishket.com/magazine/detail/2082/yozm.wishket.com/magazine/detail/2082/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bUECO1/hyUkmN2Mmq/0BuvLdMiQed7FikjAb1Rik/img.gif?width=914&amp;amp;height=454&amp;amp;face=0_0_914_454,https://scrap.kakaocdn.net/dn/dp6EOy/hyUkd4CZta/sKNcgvcMnYQ1TJeKriI0M0/img.gif?width=914&amp;amp;height=454&amp;amp;face=0_0_914_454&quot;&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/2082/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yozm.wishket.com/magazine/detail/2082/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bUECO1/hyUkmN2Mmq/0BuvLdMiQed7FikjAb1Rik/img.gif?width=914&amp;amp;height=454&amp;amp;face=0_0_914_454,https://scrap.kakaocdn.net/dn/dp6EOy/hyUkd4CZta/sKNcgvcMnYQ1TJeKriI0M0/img.gif?width=914&amp;amp;height=454&amp;amp;face=0_0_914_454');&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;소스 맵의 동작 원리는 무엇일까? | 요즘IT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;실제로 디버깅을 해보면 브라우저에서 인식할 수 없는 파일이라고 해도 코드 라인의 위치를 정확히 짚어주는 것을 확인할 수 있습니다. 이것이 가능한 이유는 우리가 브라우저에게 원본 소스&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yozm.wishket.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>IT 지식</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/462</guid>
      <comments>https://grownfresh.tistory.com/462#entry462comment</comments>
      <pubDate>Thu, 26 Oct 2023 17:32:23 +0900</pubDate>
    </item>
    <item>
      <title>monorepo 에서 pre-commit 훅 구성하기</title>
      <link>https://grownfresh.tistory.com/461</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;turborepo&lt;/b&gt; 를 사용해 &lt;b&gt;monorepo&lt;/b&gt; 를 구성했고 &lt;span style=&quot;background-color: #dddddd; color: #ee2323;&quot;&gt;&amp;nbsp;&lt;b&gt;git commit&lt;/b&gt;&amp;nbsp;&lt;/span&gt; 이 이루어지기 전 Linting, Formatting, Type Checking 이 이루어질 수 있도록 &lt;b&gt;husky, lint-staged&lt;/b&gt; 를 사용해 &lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #ee2323;&quot;&gt;pre-commit&lt;/span&gt;&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;eslint 와 prettier 의 경우 각 패키지 설정에 맞게 검사가 이루어졌으나, 타입 체킹은 &lt;b&gt;루트에 있는 tsconfig.json 을 의존&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;프로젝트 구성은 다음과 같았다.&lt;/p&gt;
&lt;pre id=&quot;code_1696926089803&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;├── packages
|   ├── random-menu
├── apps
│   ├── common-ui
│   └── common-utils
├── package.json&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기존 설정&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1696926304920&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ./package.json

{
  ...
  &quot;lint-staged&quot;: {
    &quot;*.{ts,tsx}&quot;: [
       &quot;eslint --cache --max-warnings=0&quot;,
       &quot;tsc --noEmit&quot;
     ],
     &quot;*.{ts,tsx,css,md}&quot;: &quot;prettier --write&quot;
   }
  ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1696926348433&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ./husky/pre-commit

#!/bin/sh
. &quot;$(dirname &quot;$0&quot;)/_/husky.sh&quot;

npx lint-staged&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;위와 같이 설정했을 때, 루트 tsconfig.json 을 토대로 tsc 를 실행해서 타입 검사가 제대로 이루어지지 않았다. 따라서 각 패키지 내에서 따로 타입검사를 해줘야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 apps 또는 packages 내 패키지/앱들의 &lt;b&gt;하위 package.json&lt;/b&gt; 에 아래 스크립트를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1696926752146&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;scripts&quot;: {
    &quot;type-check&quot;: &quot;tsc --noEmit&quot; 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 루트 package.json 의 lint-staged 을 아래처럼 구성한다. pnpm 패키지 매니저의 filter 옵션을 이용해서 특정 패키지/앱 내 파일이면 해당 앱/패키지에서 type-check 스크립트를 실행할 수 있도록 설정했다.&lt;/p&gt;
&lt;pre id=&quot;code_1696926663330&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ./package.json

{
  &quot;lint-staged&quot;: {
    &quot;*.{ts,tsx}&quot;: &quot;eslint --cache --max-warnings=0&quot;,
    &quot;*.{ts,tsx,css,md}&quot;: &quot;prettier --write&quot;,
    &quot;./apps/random-menu/**/*.{ts,tsx}&quot;: &quot;pnpm run --filter random-menu type-check&quot;,
    &quot;./packages/common-utils/**/*.{ts,tsx}&quot;: &quot;pnpm run --filter common-utils type-check&quot;,
    &quot;./packages/common-ui/**/*.{ts,tsx}&quot;: &quot;pnpm run --filter common-ui type-check&quot;
  }  
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;++ package.json 에 lint-staged 를 작성하는 대신, &lt;span style=&quot;color: #ee2323; background-color: #dddddd;&quot;&gt;&lt;b&gt;lint-staged.config.mjs&lt;/b&gt;&lt;/span&gt; 파일을 사용해 반복되는 타입체크 값을 함수로 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(lint-staged 설정파일 관련 문서: &lt;a href=&quot;https://github.com/okonet/lint-staged#using-js-configuration-files&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/okonet/lint-staged#using-js-configuration-files&lt;/a&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1696928614966&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// ./lint-staged.config.mjs
const MODULES = [
  { name: 'random-menu', parent: 'apps' },
  { name: 'common-utils', parent: 'packages' },
  { name: 'common-ui', parent: 'packages' },
]
const typeCheckConfigs = MODULES.reduce(
  (prev, { name, parent }) =&amp;gt; ({
    ...prev,
    [`./${parent}/${name}/**/*.{ts,tsx}`]: () =&amp;gt;
      `pnpm run --filter ${name} type-check`,
  }),
  {},
)

export default {
  // linting
  '*.{ts,tsx}': 'eslint --cache --max-warnings=0',

  // formatting
  '*.{ts,tsx,css,md}': 'prettier --write',

  // type check
  ...typeCheckConfigs,
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>레파지토리 구성하기</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/461</guid>
      <comments>https://grownfresh.tistory.com/461#entry461comment</comments>
      <pubDate>Tue, 10 Oct 2023 18:09:15 +0900</pubDate>
    </item>
    <item>
      <title>npm / yarn / pnpm / yarn-berry 비교! (참고 사이트 메모)</title>
      <link>https://grownfresh.tistory.com/454</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@seobbang/%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%A7%A4%EB%8B%88%EC%A0%80-npm-yarn-pnpm-yarn-berry&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@seobbang/%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%A7%A4%EB%8B%88%EC%A0%80-npm-yarn-pnpm-yarn-berry&lt;/a&gt;&lt;/p&gt;</description>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/454</guid>
      <comments>https://grownfresh.tistory.com/454#entry454comment</comments>
      <pubDate>Sun, 17 Sep 2023 18:06:10 +0900</pubDate>
    </item>
    <item>
      <title>pnpm 패키지 관리자</title>
      <link>https://grownfresh.tistory.com/453</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;pnpm 의존성 관리 기법은 크게 두가지 관점에서 볼 수 있다.&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. 글로벌 저장소(~/.pnpm-store) 에 모든 패키지를 저장하고, 필요할 때마다 hard link(symlink)를 연결해서 사용하는 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. hoist 를 사용해서 flat하게 만들지 않고 npm@~2처럼 nested하게 저장하는 구조&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;background-color: #ffc9af;&quot;&gt;pnpm 은 hoisting 방식이 아닌, content-addressable storage 전략을 사용한다.&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;패키지는 디스크상 한 곳에만 저장 된다. (홈디렉토리의 글로벌 저장소인 ~/.pnpm-store)패키지 파일들은 해당 위치에서 하드링크가 되고 모든 프로젝트가 이를 공유할 수 있는 구조로 만들어진다. 따라서 디스크 공간을 절약할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;플랫하지 않은 node_modules&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;따라서 호이스팅으로 플랫하게 만들지 않고, 옛 npm2 버전처럼 node_modules/A/node_nodules/B... 로 만든다. 그리고 패키지 별로 격리된 공간 내에서만 플랫하게 만들어 심링크로 연결한다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@ckstn0777/JavaScript-Package-Managers-npm-yarn-pnpm-%EC%97%90-%EB%8C%80%ED%95%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@ckstn0777/JavaScript-Package-Managers-npm-yarn-pnpm-%EC%97%90-%EB%8C%80%ED%95%B4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@jollypyun/%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%A7%A4%EB%8B%88%EC%A0%80-pnpm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@jollypyun/%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%A7%A4%EB%8B%88%EC%A0%80-pnpm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>레파지토리 구성하기</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/453</guid>
      <comments>https://grownfresh.tistory.com/453#entry453comment</comments>
      <pubDate>Sun, 17 Sep 2023 18:03:28 +0900</pubDate>
    </item>
    <item>
      <title>모노레포 - 터보레포</title>
      <link>https://grownfresh.tistory.com/452</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Vercel 이 인수했고, JS 와 TS 코드 베이스의 모노레포를 위한 고성능 빌드 시스템이다.&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;&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;9가지 특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &lt;span style=&quot;color: #1e1e1e; text-align: left;&quot;&gt;Incremental builds&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1e1e1e; text-align: left;&quot;&gt;&lt;u&gt;작업 진행을 캐싱&lt;/u&gt;해 이미 계산된 내용은 건너 뛰는 것을 의미합니다. 빌드는 딱 한 번만 하는 것을 목표로 합니다.&lt;/span&gt;&lt;span style=&quot;color: #1e1e1e; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Content-aware hasing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타임스탬프가 아닌 콘텐츠를 인식하는 방식으로 해싱을 지원합니다. 이를 통해&amp;nbsp;모든 파일을 다시 빌드하는 것이 아니라 &lt;u&gt;변경된 파일만 빌드합니다&lt;/u&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Cloud caching&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;클라우드 빌드 캐시를&amp;nbsp;팀원 및 CI/CD와 공유&lt;/u&gt;합니다. 이를 통해 로컬 환경을 넘어 &lt;u&gt;클라우드 환경에서도 빠른 빌드&lt;/u&gt;를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Parallel execution&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 코어를 사용하는&lt;u&gt; 병렬 실행을 목표&lt;/u&gt;로 합니다. 지정된 태스크 단위로 의존성을 판단해 최대한 병렬적으로 작업을 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;turbo run lint build test deploy --&amp;gt; 패키지별 lint, build, test, deploy 가 병렬적으로 실행될 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Task Pipelines&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;태스크 간의 연결을 정의해서 빌드를 언제 어떻게 실행할지 판단해 &lt;u&gt;최적화&lt;/u&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. Zero Runtime Overhead&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;런타임 코드를 간섭하거나 소스맵을 건드리지 않는다. 이에 따라 런타임 단계에서 파악하지 못한 리스크가 불거질 위험이 없습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스맵이란?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번들러로 파일을 빌드하면 모든 파일이 main.bundle.js 하나로 뭉쳐지게 되는데, 소스맵은 main.bundle.js 파일 내부의 각 부분이 원본 코드 파일 중 어느 파일의 몇번 라인에 위치한 부분과 일치하는지 알려주는 정보를 담고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스맵은 dev, production 모드에 다라 선택할 수 잇는 옵션이 다르다. 보통 base64로 인코딩된 경우가 많으며, 디버깅에 압도적으로 유리하기 때문에 개발 단계에서는 이 옵션을 항상 활성화시켜두는 것을 강력히 권장한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. Pruned subsets&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드에 필요한 요소만으로 모노 레포의 하위 집합을 생성해 PaaS 배포 속도를 높입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. JSON configuration&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 코드 작업 없이 JSON 설정으로 터보를 사용할 수 있습니다.&lt;br /&gt;// turbo.json { &quot;baseBranch&quot;: &quot;origin/main&quot;, &quot;pipeline&quot;: { &quot;build&quot;: { ... } } }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9. Profile in browser&lt;/b&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;간단한 사용법&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. 루트에 turbo.json 파일을 생성한 후, &lt;a href=&quot;https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;파이프라인&lt;/a&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;2. Turborepo 를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1694917450057&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ yarn add turbo -DW # devDependency, install workspace root
$ turbo run build # yarn uvp build, yarn storybook build 등 의존성을 가진 모든 package 스크립트가 실행됩니다.&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;참고 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://engineering.linecorp.com/ko/blog/monorepo-with-turborepo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://engineering.linecorp.com/ko/blog/monorepo-with-turborepo&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;&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://medium.com/%EC%98%A4%EB%8A%98%EC%9D%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/source-map-%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0-part-1-5a3f6d5ab48a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/%EC%98%A4%EB%8A%98%EC%9D%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/source-map-%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0-part-1-5a3f6d5ab48a&lt;/a&gt;&lt;/p&gt;</description>
      <category>레파지토리 구성하기</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/452</guid>
      <comments>https://grownfresh.tistory.com/452#entry452comment</comments>
      <pubDate>Sun, 17 Sep 2023 11:29:06 +0900</pubDate>
    </item>
    <item>
      <title>모노리스 &amp;amp; 멀티레포 &amp;amp; 모노레포</title>
      <link>https://grownfresh.tistory.com/451</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-17 오전 9.14.14.png&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Nrlt/btsudN5EBdZ/6kynrmSDvof7FMnHvUYPPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Nrlt/btsudN5EBdZ/6kynrmSDvof7FMnHvUYPPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Nrlt/btsudN5EBdZ/6kynrmSDvof7FMnHvUYPPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Nrlt%2FbtsudN5EBdZ%2F6kynrmSDvof7FMnHvUYPPk%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;510&quot; height=&quot;321&quot; data-filename=&quot;스크린샷 2023-09-17 오전 9.14.14.png&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레파지토리를 구성하는 다양한 방식이 있습니다.&lt;/p&gt;
&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;&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;멀티 레포(Multi Repo)는 ...&lt;/p&gt;
&lt;div style=&quot;background-color: #fafafa; color: #333333;&quot; data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;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;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;- 의존성 관리: prettier, eslint 등 공통으로 사용되는 외부 라이브러리를 공유해서 사용할 수 있습니다.&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;참고 사이트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/wantedjobs/lerna%EC%99%80-yarn-workspaces%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B4%80%EB%A6%AC-429d2a685486&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/wantedjobs/lerna%EC%99%80-yarn-workspaces%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B4%80%EB%A6%AC-429d2a685486&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;a href=&quot;https://blog.mathpresso.com/%ED%8C%80%EC%9B%8C%ED%81%AC-%ED%96%A5%EC%83%81%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%AA%A8%EB%85%B8%EB%A0%88%ED%8F%AC-monorepo-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%B6%95-3ae1b0112f1b&quot;&gt;https://blog.mathpresso.com/%ED%8C%80%EC%9B%8C%ED%81%AC-%ED%96%A5%EC%83%81%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%AA%A8%EB%85%B8%EB%A0%88%ED%8F%AC-monorepo-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%B6%95-3ae1b0112f1b&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>레파지토리 구성하기</category>
      <author>GROWNFRESH</author>
      <guid isPermaLink="true">https://grownfresh.tistory.com/451</guid>
      <comments>https://grownfresh.tistory.com/451#entry451comment</comments>
      <pubDate>Sun, 17 Sep 2023 09:15:28 +0900</pubDate>
    </item>
  </channel>
</rss>