<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩정비소</title>
    <link>https://workshop-code.tistory.com/</link>
    <description>세상을 더 아름답게 바꾸는 코더. 우리는 코딩을 통해 더나은 세상을 추구한다.</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 21:57:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>늘푸른개발자</managingEditor>
    <image>
      <title>코딩정비소</title>
      <url>https://tistory1.daumcdn.net/tistory/2972144/attach/62a3bd5da61e4ac89af10769281d0bb6</url>
      <link>https://workshop-code.tistory.com</link>
    </image>
    <item>
      <title>SELF FIRE(명언) : 고객센터</title>
      <link>https://workshop-code.tistory.com/107</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;&amp;nbsp;&lt;/p&gt;</description>
      <category>self fire</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/107</guid>
      <comments>https://workshop-code.tistory.com/107#entry107comment</comments>
      <pubDate>Sat, 8 Feb 2025 18:20:14 +0900</pubDate>
    </item>
    <item>
      <title>React-native-calenders 원더윅스 앱 만들기</title>
      <link>https://workshop-code.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번시간에는 앱에 캘린더를 추가해 보도록 하자. 먼저 expo에서 제공하는 켈린더가 있는지 확인하자.&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;expo-calender를 검색하니 최상단에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.expo.dev/versions/latest/sdk/calendar/&quot;&gt;https://docs.expo.dev/versions/latest/sdk/calendar/&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;검색결과가 나온다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GIbC7/btsLwG3ggTs/7WV48qFByE353l4pUY6cQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GIbC7/btsLwG3ggTs/7WV48qFByE353l4pUY6cQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GIbC7/btsLwG3ggTs/7WV48qFByE353l4pUY6cQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGIbC7%2FbtsLwG3ggTs%2F7WV48qFByE353l4pUY6cQk%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;815&quot; height=&quot;131&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 결과에 따라 들어가면 SDK 가 나온다. &lt;span style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot;&gt;SDK는 Software Development Kit로 개발 키트라고 생각하면 된다. 무튼 expo-calender에서 제공하는 기능은 캘린더, 이벤트, 알림 레코드랑 상호작용하는 SDK인데. 우리가 원하는 기능은 UI를 만들어 주는 컴포넌트를 원했기 때문에 설치하지 말자. 다만 나중에 알람 기능을 만들 때 필요할 수 있으니 알아두자.&amp;nbsp;&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;다른 검색 결과로 react-native-calenders가 나온다 문서를 확인해보니. 내가 원하는 기간표시도 가능하다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;React-native-calendars&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #001d35;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-native-calendars&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.npmjs.com/package/react-native-calendars&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735079410061&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;react-native-calendars&quot; data-og-description=&quot;React Native Calendar Components. Latest version: 1.1307.0, last published: 3 months ago. Start using react-native-calendars in your project by running &amp;#96;npm i react-native-calendars&amp;#96;. There are 184 other projects in the npm registry using react-native-cale&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/react-native-calendars&quot; data-og-url=&quot;https://www.npmjs.com/package/react-native-calendars&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1oo9B/hyXOf6PYAa/AY3gRRkUk2ZTVLA3zr9Kr0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-native-calendars&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/react-native-calendars&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1oo9B/hyXOf6PYAa/AY3gRRkUk2ZTVLA3zr9Kr0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;react-native-calendars&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React Native Calendar Components. Latest version: 1.1307.0, last published: 3 months ago. Start using react-native-calendars in your project by running `npm i react-native-calendars`. There are 184 other projects in the npm registry using react-native-cale&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1735113787698&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add react-native-calendars&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;expo를 사용하고 있으니&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735113837406&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx expo install react-native-calendars&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방식으로 설치를 시작하자 설치가 완료되면 모듈을 추가하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서를 읽고 예시에서 제공되는 Period Marking를 사용하면 좋겠다.&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;a href=&quot;https://wix.github.io/react-native-calendars/docs/Components/Calendar#calendar-examples&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wix.github.io/react-native-calendars/docs/Components/Calendar#calendar-examples&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735114263241&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;Calendar | RNC&quot; data-og-description=&quot;Calendar component&quot; data-og-host=&quot;wix.github.io&quot; data-og-source-url=&quot;https://wix.github.io/react-native-calendars/docs/Components/Calendar#calendar-examples&quot; data-og-url=&quot;https://wix.github.io/react-native-calendars/docs/Components/Calendar&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bX5nPG/hyXOio3Hlc/FagyKpcYmJbCkv2CMKJw10/img.png?width=411&amp;amp;height=317&amp;amp;face=0_0_411_317&quot;&gt;&lt;a href=&quot;https://wix.github.io/react-native-calendars/docs/Components/Calendar#calendar-examples&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wix.github.io/react-native-calendars/docs/Components/Calendar#calendar-examples&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bX5nPG/hyXOio3Hlc/FagyKpcYmJbCkv2CMKJw10/img.png?width=411&amp;amp;height=317&amp;amp;face=0_0_411_317');&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;Calendar | RNC&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Calendar component&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wix.github.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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/56G0s/btsLx34ia0u/1anAlbACBaYLyE7tnIW5k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/56G0s/btsLx34ia0u/1anAlbACBaYLyE7tnIW5k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/56G0s/btsLx34ia0u/1anAlbACBaYLyE7tnIW5k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F56G0s%2FbtsLx34ia0u%2F1anAlbACBaYLyE7tnIW5k1%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;271&quot; height=&quot;164&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 모듈 및 옵션 확인해서 추가하기&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1735114786432&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { router } from &quot;expo-router&quot;;
import { Button, Text, View } from &quot;react-native&quot;;
import { Calendar } from &quot;react-native-calendars&quot;;

export default function Home(){
  const handleModalButton = () =&amp;gt; {
    router.push('/userInputModal')
  }

  return &amp;lt;View&amp;gt;
    &amp;lt;Text&amp;gt;Home &amp;lt;/Text&amp;gt;

    &amp;lt;Calendar
      markingType={'period'}
      markedDates={{
        '2024-12-20': {textColor: 'green'},
        '2024-12-22': {startingDay: true, color: 'green'},
        '2024-12-23': {selected: true, endingDay: true, color: 'green', textColor: 'gray'},
        '2024-12-04': {disabled: true, startingDay: true, color: 'green', endingDay: true}
      }}

      enableSwipeMonths={true}
      hideArrows={false}
    /&amp;gt;
    &amp;lt;Button title=&quot;모달&quot; onPress={handleModalButton}&amp;gt;&amp;lt;/Button&amp;gt;
  &amp;lt;/View&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;markingType을 period로 세팅&amp;nbsp;&lt;/li&gt;
&lt;li&gt;markingDates '2024-12-25': {selected: true, endingDay: true'}, '2024-12-26': {selected: false, endingDay: true'}, 형식으로 맞춰주자&lt;/li&gt;
&lt;li&gt;enableSwipeMonths를 true &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;스와이프 기능 제공&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLwrU6/btsLyDdcL5w/rXEhUWA4mug5wurvHMCEo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLwrU6/btsLyDdcL5w/rXEhUWA4mug5wurvHMCEo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLwrU6/btsLyDdcL5w/rXEhUWA4mug5wurvHMCEo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLwrU6%2FbtsLyDdcL5w%2FrXEhUWA4mug5wurvHMCEo0%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;340&quot; height=&quot;756&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&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;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/40687cef16918189c0afadfd735923a73c5cc98a&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ckdtjs505/wonder_weeks/commit/40687cef16918189c0afadfd735923a73c5cc98a&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735116044404&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;feat: 캘린더 추가하기 &amp;middot; ckdtjs505/wonder_weeks@40687ce&quot; data-og-description=&quot;ckdtjs505 committed Dec 25, 2024&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/40687cef16918189c0afadfd735923a73c5cc98a&quot; data-og-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/40687cef16918189c0afadfd735923a73c5cc98a&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cygQfp/hyXObKeGeS/TaLKUznoiKjw2YEhXq8KTK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cUigpN/hyXOhjlAGb/14PQrm97uYqVtVnKBn5JB1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/40687cef16918189c0afadfd735923a73c5cc98a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/40687cef16918189c0afadfd735923a73c5cc98a&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cygQfp/hyXObKeGeS/TaLKUznoiKjw2YEhXq8KTK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/cUigpN/hyXOhjlAGb/14PQrm97uYqVtVnKBn5JB1/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;feat: 캘린더 추가하기 &amp;middot; ckdtjs505/wonder_weeks@40687ce&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ckdtjs505 committed Dec 25, 2024&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 월, 일 표시를 한국어로 변경하기&lt;/h4&gt;
&lt;pre id=&quot;code_1735115923416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LocaleConfig.locales['ko'] = {
  monthNames: [
    '1월',
    '2월',
    '3월',
    '4월',
    '5월',
    '6월',
    '7월',
    '8월',
    '9월',
    '10월',
    '11월',
    '12월',
  ],
  dayNames: ['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일'],
  dayNamesShort: ['월', '화', '수', '목', '금', '토', '일'],
  today: &quot;오늘&quot;
};

LocaleConfig.defaultLocale = 'ko';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PDyhA/btsLxklfz4C/AO5YNTjfjezJ15ctOE8Bek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PDyhA/btsLxklfz4C/AO5YNTjfjezJ15ctOE8Bek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PDyhA/btsLxklfz4C/AO5YNTjfjezJ15ctOE8Bek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPDyhA%2FbtsLxklfz4C%2FAO5YNTjfjezJ15ctOE8Bek%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;346&quot; height=&quot;769&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/d03bc8a07961cfd9f7a217739dd51604c9da3f27&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ckdtjs505/wonder_weeks/commit/d03bc8a07961cfd9f7a217739dd51604c9da3f27&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735116060782&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;feat: 캘린더 한국어로 변경 &amp;middot; ckdtjs505/wonder_weeks@d03bc8a&quot; data-og-description=&quot;ckdtjs505 committed Dec 25, 2024&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/d03bc8a07961cfd9f7a217739dd51604c9da3f27&quot; data-og-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/d03bc8a07961cfd9f7a217739dd51604c9da3f27&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/miwgT/hyXSu9bKKz/D4r0su4DKwAtReJVg8xSwK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dsjicK/hyXOnRsfKC/bc4JSQuqYSCc2eSoZKZHt0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/d03bc8a07961cfd9f7a217739dd51604c9da3f27&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/d03bc8a07961cfd9f7a217739dd51604c9da3f27&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/miwgT/hyXSu9bKKz/D4r0su4DKwAtReJVg8xSwK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dsjicK/hyXOnRsfKC/bc4JSQuqYSCc2eSoZKZHt0/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;feat: 캘린더 한국어로 변경 &amp;middot; ckdtjs505/wonder_weeks@d03bc8a&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ckdtjs505 committed Dec 25, 2024&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 원더윅스 계산해서 마킹하기&lt;/h4&gt;
&lt;pre id=&quot;code_1735123462705&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;export const getWonderweeks = ({day, color } : any) =&amp;gt; {
    const birthDate = new Date(day);
    
    // 주차별 범위 정의 (시작 주 ~ 종료 주)
    const weekRanges = [
        { weeks: 1, start: 4, end: 6 },
        { weeks: 2, start: 7, end: 10 },
        { weeks: 3, start: 11, end: 14 },
        { weeks: 4, start: 15, end: 20 },
        { weeks: 5, start: 23, end: 27 },
        { weeks: 6, start: 34, end: 38 },
        { weeks: 7, start: 42, end: 47 },
        { weeks: 8, start: 51, end: 55 },
        { weeks: 9, start: 60, end: 65 },
        { weeks: 10, start: 71, end: 76 },
    ];
    
    const result = {};
    
    for (const range of weekRanges) {
        // 시작 날짜와 끝 날짜 계산
        const startDay = new Date(birthDate);
        startDay.setDate(startDay.getDate() + range.start * 7 ); // 주 시작일로 맞추기
    
        const endDay = new Date(birthDate);
        endDay.setDate(endDay.getDate() - 1 + range.end * 7); // 주 종료일로 맞추기
    
        // 현재 주차 범위의 날짜를 순회하며 객체 생성
        for (
        let currentDate = new Date(startDay);
        currentDate &amp;lt;= endDay;
        currentDate.setDate(currentDate.getDate() + 1)
        ) {
    
            const currentDateStr = currentDate.toISOString().split('T')[0]; // ISO 형식으로 날짜 키 생성

            if( currentDateStr )
            // 각 날짜를 객체에 추가
            result[currentDateStr] = {
                startingDay: currentDate.toDateString() === startDay.toDateString(),
                endingDay: currentDate.toDateString() === endDay.toDateString(),
                color : color
            };
        }
    }
    
    return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;원더윅스 계산 함수를 만들어 호출하자.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735123566967&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export default function Home(){
  const handleModalButton = () =&amp;gt; {
    router.push('/userInputModal')
  }

  const wonderweeks = getWonderweeks({
    day : '2024-11-11',
    color : '#71C9CE'
  });

  return &amp;lt;View&amp;gt;
    &amp;lt;Text&amp;gt;Home &amp;lt;/Text&amp;gt;

    &amp;lt;Calendar
      markingType={'period'}
      markedDates={{
        ...wonderweeks
      }}

      enableSwipeMonths={true}
      hideArrows={false}
    /&amp;gt;
    &amp;lt;Button title=&quot;모달&quot; onPress={handleModalButton}&amp;gt;&amp;lt;/Button&amp;gt;
  &amp;lt;/View&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BlQh7/btsLxGuX2z3/kbTAlVUc8vA6LbQKq73h8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BlQh7/btsLxGuX2z3/kbTAlVUc8vA6LbQKq73h8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BlQh7/btsLxGuX2z3/kbTAlVUc8vA6LbQKq73h8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBlQh7%2FbtsLxGuX2z3%2FkbTAlVUc8vA6LbQKq73h8k%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;351&quot; height=&quot;780&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/3c959dd6cd8b1f2a3bbfcfa7963d019b70038037&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ckdtjs505/wonder_weeks/commit/3c959dd6cd8b1f2a3bbfcfa7963d019b70038037&lt;/a&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1735123798244&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;feat: 원더윅스 계산 후 마킹하기 &amp;middot; ckdtjs505/wonder_weeks@3c959dd&quot; data-og-description=&quot;ckdtjs505 committed Dec 25, 2024&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/3c959dd6cd8b1f2a3bbfcfa7963d019b70038037&quot; data-og-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/3c959dd6cd8b1f2a3bbfcfa7963d019b70038037&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tn6tM/hyXSrxRqu9/s8ia46tdJMz9QFUsOIKSl0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/btwEXL/hyXSBHg2ls/SEvoyNDpeAEt00ak0xE3rK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/3c959dd6cd8b1f2a3bbfcfa7963d019b70038037&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/3c959dd6cd8b1f2a3bbfcfa7963d019b70038037&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tn6tM/hyXSrxRqu9/s8ia46tdJMz9QFUsOIKSl0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/btwEXL/hyXSBHg2ls/SEvoyNDpeAEt00ak0xE3rK/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;feat: 원더윅스 계산 후 마킹하기 &amp;middot; ckdtjs505/wonder_weeks@3c959dd&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ckdtjs505 committed Dec 25, 2024&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React-native-calenders를 사용하여 RN에서 쉽게 캘린더를 구현 할 수 있다&lt;/li&gt;
&lt;li&gt;wonder weeks를 표시하는 markedDate를 값을 넣어 원더 윅스 값을 표현할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;calenders 공식 문서를 제대로 살펴보면 없는게 없다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android</category>
      <category>ios</category>
      <category>react-native</category>
      <category>react-native-calenders</category>
      <category>wonder-weeks</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/106</guid>
      <comments>https://workshop-code.tistory.com/106#entry106comment</comments>
      <pubDate>Wed, 25 Dec 2024 19:51:03 +0900</pubDate>
    </item>
    <item>
      <title>React-native 생년월일 입력을 위한 DateTimePicker 추가하기</title>
      <link>https://workshop-code.tistory.com/105</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아이의 생년월일을 입력하기 위해서 직접 string으로 입력하는 방법도 있지만, 다른 앱들을 살펴보면 달력이 나와서 달력을 클릭하면 클릭한 값을 넣어준다. 웹개발자라면 input에 type만 설정해도 달력이 나와서 설정할 수 있다. React-native에도 비슷한 기능을 하는 라이브러리나 메서드가 있지 않을까?&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 인터넷에서 찾아보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DateTimePicker&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/versions/latest/sdk/date-time-picker/&quot;&gt;https://docs.expo.dev/versions/latest/sdk/date-time-picker/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735083030078&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;DateTimePicker&quot; data-og-description=&quot;A component that provides access to the system UI for date and time selection.&quot; data-og-host=&quot;docs.expo.dev&quot; data-og-source-url=&quot;https://docs.expo.dev/versions/latest/sdk/date-time-picker/&quot; data-og-url=&quot;https://docs.expo.dev/versions/latest/sdk/date-time-picker/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IKDVA/hyXSDrr9aV/Vd1JiItVixSpK9cweXXkh0/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/hK7kI/hyXSv71FYz/z3I2QIksfG5TvEukPRYrXK/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/da09MU/hyXSC69KXn/GEzDeCP9Lptcv3HH3ABGY0/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/versions/latest/sdk/date-time-picker/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.expo.dev/versions/latest/sdk/date-time-picker/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IKDVA/hyXSDrr9aV/Vd1JiItVixSpK9cweXXkh0/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/hK7kI/hyXSv71FYz/z3I2QIksfG5TvEukPRYrXK/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/da09MU/hyXSC69KXn/GEzDeCP9Lptcv3HH3ABGY0/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788');&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;DateTimePicker&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A component that provides access to the system UI for date and time selection.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.expo.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;expo에서 제공하는 라이브러리가 있음을 알 수 있다.&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;pre id=&quot;code_1735083003688&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx expo install @react-native-community/datetimepicker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;1. 모듈 추가하기&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1735092285054&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import DateTimePicker from '@react-native-community/datetimepicker';&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. DateTimePicker 추가하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/react-native-datetimepicker/datetimepicker&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/react-native-datetimepicker/datetimepicker&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735092455588&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 - react-native-datetimepicker/datetimepicker: React Native date &amp;amp; time picker component for iOS, Android and Windows&quot; data-og-description=&quot;React Native date &amp;amp; time picker component for iOS, Android and Windows - react-native-datetimepicker/datetimepicker&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/react-native-datetimepicker/datetimepicker&quot; data-og-url=&quot;https://github.com/react-native-datetimepicker/datetimepicker&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4edLv/hyXSAVMDrp/0w5DDuGoVgIY5EIysAjAa1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bHFAX8/hyXSrduOCU/0gLzcImCWSNr1vaMPmqHuK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/react-native-datetimepicker/datetimepicker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/react-native-datetimepicker/datetimepicker&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4edLv/hyXSAVMDrp/0w5DDuGoVgIY5EIysAjAa1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bHFAX8/hyXSrduOCU/0gLzcImCWSNr1vaMPmqHuK/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 - react-native-datetimepicker/datetimepicker: React Native date &amp;amp; time picker component for iOS, Android and Windows&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React Native date &amp;amp; time picker component for iOS, Android and Windows - react-native-datetimepicker/datetimepicker&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1oHw7/btsLwMoPJbX/Mq4sWPL2mdkURdoWOnZpF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1oHw7/btsLwMoPJbX/Mq4sWPL2mdkURdoWOnZpF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1oHw7/btsLwMoPJbX/Mq4sWPL2mdkURdoWOnZpF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1oHw7%2FbtsLwMoPJbX%2FMq4sWPL2mdkURdoWOnZpF0%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;929&quot; height=&quot;165&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;165&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zsjhM/btsLx6NlXb6/8qZeVUJUNDkjuY8kbOHz7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zsjhM/btsLx6NlXb6/8qZeVUJUNDkjuY8kbOHz7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zsjhM/btsLx6NlXb6/8qZeVUJUNDkjuY8kbOHz7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzsjhM%2FbtsLx6NlXb6%2F8qZeVUJUNDkjuY8kbOHz7K%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;367&quot; height=&quot;536&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;940&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너무 쉽게 들어갔다.&amp;nbsp; ^^&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. DateTimePicker 선택한 값 사용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 유저가 선택한 날을 받아서 넣어줘야&amp;nbsp;한다. 이 또한 공식문서에서 제공한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pMIhM/btsLv9ZaxD2/UaxdK4fD4QtverZCesJUv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pMIhM/btsLv9ZaxD2/UaxdK4fD4QtverZCesJUv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pMIhM/btsLv9ZaxD2/UaxdK4fD4QtverZCesJUv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpMIhM%2FbtsLv9ZaxD2%2FUaxdK4fD4QtverZCesJUv1%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;935&quot; height=&quot;474&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;onChange 함수에서 제공하고 있다. 내용을 보면 event type이 set인 경우에 값이 세팅이 되는 경우이지 않을까? 구현 보고 확인해 보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HJ8KH/btsLx5gEeah/KOzmym71jwX8m970dg4e2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HJ8KH/btsLx5gEeah/KOzmym71jwX8m970dg4e2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HJ8KH/btsLx5gEeah/KOzmym71jwX8m970dg4e2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHJ8KH%2FbtsLx5gEeah%2FKOzmym71jwX8m970dg4e2K%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;683&quot; height=&quot;381&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취소 버튼 클릭 시 type&amp;nbsp; - dismissed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인 버튼 클릭 시 type - set&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;type이 set인 경우에만 birthday값을 setting 해주자.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735093653203&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            &amp;lt;RNDateTimePicker 
            value={new Date()}
            onChange={ ({type}, day) =&amp;gt; {
                if( type === &quot;set&quot; &amp;amp;&amp;amp; day){
                    setBirthDay(day.toISOString().split('T')[0]); // yyyy-MM-dd 형식으로 저장
                }
            }}
            /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;birthday에 값이 정상적으로 들어가진다. wow!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;react-native에서 제공하는 DateTimePicker를 사용하여 아이의 태어난 날을 입력할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;DateTimePicker의 취소 확인 버튼시 동작은 onChange함수로 사용 가능하다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DateTimePicker를 활용하여 태어난 날, 타이머, 등 다양한 기능을 사용할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 코드 확인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태어난 날 클릭 시 DateTimePicker을 show, hide 하는 방식은 생략했다. 자세한 건 아래 코드에서 확인 가능합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/28221615ea5aab79226f376af03fb3c1e3a0f949&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ckdtjs505/wonder_weeks/commit/28221615ea5aab79226f376af03fb3c1e3a0f949&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735094226600&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;feat: 태어난 날 클릭시 달력 클릭 한 값으로 동작 되도록 UX 개선 &amp;middot; ckdtjs505/wonder_weeks@2822161&quot; data-og-description=&quot;ckdtjs505 committed Dec 25, 2024&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/28221615ea5aab79226f376af03fb3c1e3a0f949&quot; data-og-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/28221615ea5aab79226f376af03fb3c1e3a0f949&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hbsif/hyXOqghCCx/OwpzAHZYKzURG5bgnbgg5k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bJIe28/hyXSERsuTO/UQmg7MKgoi6KAmkRzGF49k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/28221615ea5aab79226f376af03fb3c1e3a0f949&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/28221615ea5aab79226f376af03fb3c1e3a0f949&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hbsif/hyXOqghCCx/OwpzAHZYKzURG5bgnbgg5k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bJIe28/hyXSERsuTO/UQmg7MKgoi6KAmkRzGF49k/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;feat: 태어난 날 클릭시 달력 클릭 한 값으로 동작 되도록 UX 개선 &amp;middot; ckdtjs505/wonder_weeks@2822161&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ckdtjs505 committed Dec 25, 2024&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React Native</category>
      <category>Android</category>
      <category>dateTimePicker</category>
      <category>ios</category>
      <category>react-native</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/105</guid>
      <comments>https://workshop-code.tistory.com/105#entry105comment</comments>
      <pubDate>Wed, 25 Dec 2024 11:40:51 +0900</pubDate>
    </item>
    <item>
      <title>React-native AsyncStorage로 로그인 정보 로컬에 저장하기</title>
      <link>https://workshop-code.tistory.com/104</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgm5ge/btsLv80hIKe/kos6yK2w4nDkl2m8Yo0aAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgm5ge/btsLv80hIKe/kos6yK2w4nDkl2m8Yo0aAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgm5ge/btsLv80hIKe/kos6yK2w4nDkl2m8Yo0aAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgm5ge%2FbtsLv80hIKe%2Fkos6yK2w4nDkl2m8Yo0aAK%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;509&quot; height=&quot;1131&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react-native에서 local에 저장하는 기능이 있을까? 한번 찾아보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react-native localstroage 입력하는 바로 결과가 나온다.&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://docs.expo.dev/versions/latest/sdk/async-storage/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.expo.dev/versions/latest/sdk/async-storage/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735079812523&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;AsyncStorage&quot; data-og-description=&quot;A library that provides an asynchronous, unencrypted, persistent, key-value storage API.&quot; data-og-host=&quot;docs.expo.dev&quot; data-og-source-url=&quot;https://docs.expo.dev/versions/latest/sdk/async-storage/&quot; data-og-url=&quot;https://docs.expo.dev/versions/latest/sdk/async-storage/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zK4hL/hyXOobFTlf/gDGoKEksxmes1XqOATknP0/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/mCaHR/hyXOb4tDsJ/QD3Ze14PW5bQ53Kz5zF2jk/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/eMatc/hyXSFphkwA/oYJVBjgaq4B52J6E0eSGQ1/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/versions/latest/sdk/async-storage/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.expo.dev/versions/latest/sdk/async-storage/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zK4hL/hyXOobFTlf/gDGoKEksxmes1XqOATknP0/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/mCaHR/hyXOb4tDsJ/QD3Ze14PW5bQ53Kz5zF2jk/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/eMatc/hyXSFphkwA/oYJVBjgaq4B52J6E0eSGQ1/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788');&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;AsyncStorage&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A library that provides an asynchronous, unencrypted, persistent, key-value storage API.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.expo.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;
&lt;pre id=&quot;code_1735079839245&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx expo install @react-native-async-storage/async-storage&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;AsyncStorage&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;a href=&quot;https://react-native-async-storage.github.io/async-storage/docs/usage/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://react-native-async-storage.github.io/async-storage/docs/usage/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735079899983&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;Usage | Async Storage&quot; data-og-description=&quot;Async Storage can only store string data. In order to store object data,&quot; data-og-host=&quot;react-native-async-storage.github.io&quot; data-og-source-url=&quot;https://react-native-async-storage.github.io/async-storage/docs/usage/&quot; data-og-url=&quot;https://react-native-async-storage.github.io/async-storage/docs/usage&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://react-native-async-storage.github.io/async-storage/docs/usage/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://react-native-async-storage.github.io/async-storage/docs/usage/&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;Usage | Async Storage&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Async Storage can only store string data. In order to store object data,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;react-native-async-storage.github.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;h4 data-ke-size=&quot;size20&quot;&gt;1. 모듈 추가하기&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRT9at/btsLwmxijnL/a3YEhnNJ1t5yTzCUbCbSZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRT9at/btsLwmxijnL/a3YEhnNJ1t5yTzCUbCbSZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRT9at/btsLwmxijnL/a3YEhnNJ1t5yTzCUbCbSZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRT9at%2FbtsLwmxijnL%2Fa3YEhnNJ1t5yTzCUbCbSZK%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;1258&quot; height=&quot;132&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735079976810&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import AsyncStorage from '@react-native-async-storage/async-storage';&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;아이 정보를 넣어주는 userInputModal.tsx에 넣어주자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 입력 완료 버튼을 누르면 로컬에 저장하기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RV77G/btsLzbN53rS/BF3gPn5vl6JDzgZwskEUnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RV77G/btsLzbN53rS/BF3gPn5vl6JDzgZwskEUnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RV77G/btsLzbN53rS/BF3gPn5vl6JDzgZwskEUnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRV77G%2FbtsLzbN53rS%2FBF3gPn5vl6JDzgZwskEUnk%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;986&quot; height=&quot;660&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에 저장하는 방법은 제공하는 AsyncStorage.setItem('baby-info', value) 이런 식으로 만들어짐을 알 수 있다. 동일한 구조로 해보자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1735081474757&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    // 데이터 저장 함수
    const storeData = async () =&amp;gt; {
        try {
            const jsonValue = JSON.stringify({ name, birthDay });
            await AsyncStorage.setItem('baby-info', jsonValue);
        } catch (e) {
            console.error('저장 실패:', e);
        }
    };&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1735081563081&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    const handlePress = () =&amp;gt; {
        storeData();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;저장하기 버튼을 누르면 name, birthday 값을 가져다가 그려주도록 하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 불러오기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 저장하기 버튼을 눌러서 아이 이름과 생년월일을 저장했다면 모달을 생성할 때 스토리지에서 로드해서 불러오도록해보자.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYGZQ1/btsLx8dhnDV/UYjz1HClkNE2fkXoDXB3oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYGZQ1/btsLx8dhnDV/UYjz1HClkNE2fkXoDXB3oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYGZQ1/btsLx8dhnDV/UYjz1HClkNE2fkXoDXB3oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYGZQ1%2FbtsLx8dhnDV%2FUYjz1HClkNE2fkXoDXB3oK%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;980&quot; height=&quot;673&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1735081672379&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    // 데이터를 불러오고 상태를 설정하는 비동기 함수
    const loadInitialData = async () =&amp;gt; {
        try {
            const jsonValue = await AsyncStorage.getItem('baby-info');
            if (jsonValue != null) {
                const savedData = JSON.parse(jsonValue);
                setName(savedData.name || ''); // 값이 없으면 빈 문자열
                setBirthDay(savedData.birthDay || '');
            }
        } catch (e) {
            console.error('초기 데이터 불러오기 실패:', e);
        }
    };

    // useEffect로 컴포넌트가 렌더링될 때 초기 데이터 로드
    useEffect(() =&amp;gt; {
        loadInitialData();
    }, []); // 빈 배열로 첫 렌더링 시 한 번만 실행&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;h4 data-ke-size=&quot;size20&quot;&gt;정리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;react-native도 web처럼 localstorage가 존재하고 그 이름은 AsyncStorage이다&amp;nbsp;&lt;/li&gt;
&lt;li&gt;데이터 로드 방법은 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;AsyncStorage.getItem, &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;데이터 저장은 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;AsyncStorage.setItem으로&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt; localStorage랑 사용 메서드는 같으나 promise 객체로 구성되어 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹개발자라면 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;AsyncStorage는&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;로컬 스토리지 정보를 앱 입장할 때 가져와서 props로 내려오는 구조가 좋아 보인다.&lt;/li&gt;
&lt;li&gt;왜냐하면 localstroag를 사용하는 모든 곳에서 저 함수를 작성해야 하니 말이다. 가독성 문제다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 코드 확인&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;router를 사용하여 본창 이동 및 setState()를 사용한 유저 정보 메모리 할당하는 부분은 생략했다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/64e560248d988837ea4c575d3670eca6af5b59a4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/ckdtjs505/wonder_weeks/commit/64e560248d988837ea4c575d3670eca6af5b59a4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1735082169930&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;feat: 아이 정보 로컬에 저장하기 &amp;middot; ckdtjs505/wonder_weeks@64e5602&quot; data-og-description=&quot;ckdtjs505 committed Dec 24, 2024&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/64e560248d988837ea4c575d3670eca6af5b59a4&quot; data-og-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/64e560248d988837ea4c575d3670eca6af5b59a4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ccsn7w/hyXOoirg5y/gHFlxP4lpMiGBqeEK7jiIk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/e8NDs/hyXSsi9wpG/1IXh9uzw1i3Ni7O5V1x9c1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/64e560248d988837ea4c575d3670eca6af5b59a4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ckdtjs505/wonder_weeks/commit/64e560248d988837ea4c575d3670eca6af5b59a4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ccsn7w/hyXOoirg5y/gHFlxP4lpMiGBqeEK7jiIk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/e8NDs/hyXSsi9wpG/1IXh9uzw1i3Ni7O5V1x9c1/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;feat: 아이 정보 로컬에 저장하기 &amp;middot; ckdtjs505/wonder_weeks@64e5602&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ckdtjs505 committed Dec 24, 2024&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React Native</category>
      <category>Android</category>
      <category>AsyncStorage</category>
      <category>ios</category>
      <category>react-native</category>
      <category>useState</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/104</guid>
      <comments>https://workshop-code.tistory.com/104#entry104comment</comments>
      <pubDate>Wed, 25 Dec 2024 08:21:46 +0900</pubDate>
    </item>
    <item>
      <title>React-native 모달 만들기 - 로그인 및 유저 정보 화면</title>
      <link>https://workshop-code.tistory.com/103</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;a href=&quot;https://workshop-code.tistory.com/102&quot;&gt;React-native expo 로 wonder weeks 앱 만들기 - 환경 세팅 하기&lt;/a&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;개발 환경 세팅이 모두 완료 후 실행하면 EXPO에서 생성된 애플리케이션이 실행되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 시간에는 WONDER WEEKS에서 아이 이름과, 생년 월일(태어난날)을 입력하는 모달을 만들어 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKjUXu/btsLsjNhaY0/rBE8eyy1MStxktbXkEhXu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKjUXu/btsLsjNhaY0/rBE8eyy1MStxktbXkEhXu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKjUXu/btsLsjNhaY0/rBE8eyy1MStxktbXkEhXu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKjUXu%2FbtsLsjNhaY0%2FrBE8eyy1MStxktbXkEhXu0%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;349&quot; height=&quot;776&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;React Native modal 분석하기&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱은 대부분의 기능들이 규격화되어있다는 점을 알면, 아마도 modal도 공홈에서 제공하고 있진 않을까? 하는 마음에 찾아보았다.&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;a href=&quot;https://docs.expo.dev/router/advanced/modals/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.expo.dev/router/advanced/modals/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734856212838&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;Modals&quot; data-og-description=&quot;Learn how to use modals in Expo Router.&quot; data-og-host=&quot;docs.expo.dev&quot; data-og-source-url=&quot;https://docs.expo.dev/router/advanced/modals/&quot; data-og-url=&quot;https://docs.expo.dev/router/advanced/modals/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dlolBi/hyXSs38W35/hKprufudLPhEQJ54VKjt6K/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/UI2Cx/hyXOkmnLbr/NjjWXtPyiw9GlgBvGgGkUK/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/twjcu/hyXOc2Xk6I/uJfWekpdhy0g91EQzFcFUK/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/router/advanced/modals/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.expo.dev/router/advanced/modals/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dlolBi/hyXSs38W35/hKprufudLPhEQJ54VKjt6K/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/UI2Cx/hyXOkmnLbr/NjjWXtPyiw9GlgBvGgGkUK/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/twjcu/hyXOc2Xk6I/uJfWekpdhy0g91EQzFcFUK/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788');&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;Modals&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to use modals in Expo Router.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.expo.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;
&lt;p data-ke-size=&quot;size16&quot;&gt;놀랍게도 모달을 만드는 방식에 대해 세밀하게 나와다는 점을 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;React Native modal 분석한 내용 실행하기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNoWCL/btsLrHOtlFZ/ZJBobpQk9tpWR3pTOftW8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNoWCL/btsLrHOtlFZ/ZJBobpQk9tpWR3pTOftW8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNoWCL/btsLrHOtlFZ/ZJBobpQk9tpWR3pTOftW8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNoWCL%2FbtsLrHOtlFZ%2FZJBobpQk9tpWR3pTOftW8k%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;564&quot; height=&quot;213&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;213&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;1. 화면 만들기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modal.tsx라는 화면을 만들라고 한다. 필자의 경우 userInputModal.tsx로 생성했다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734856607150&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Button, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native';

export default function userInputModal() {

    const handlePress = () =&amp;gt; {
        console.log('press')
    }
    return &amp;lt;View style={styles.container}&amp;gt;
        &amp;lt;View style={styles.form}&amp;gt;
            &amp;lt;Text style={styles.label} &amp;gt; 아이 이름  &amp;lt;/Text&amp;gt;
            &amp;lt;TextInput style={styles.input} placeholder='기본 아이'&amp;gt;&amp;lt;/TextInput&amp;gt;

            &amp;lt;Text style={styles.label}&amp;gt; 태어난날  &amp;lt;/Text&amp;gt;
            &amp;lt;TextInput style={styles.input} placeholder='2024-11-11'&amp;gt;&amp;lt;/TextInput&amp;gt;
            
        &amp;lt;/View&amp;gt;
        &amp;lt;TouchableOpacity style={styles.button} onPress={handlePress}&amp;gt;
            &amp;lt;Text style={styles.buttonText}&amp;gt;입력완료 &amp;lt;/Text&amp;gt;
        &amp;lt;/TouchableOpacity&amp;gt;
        

        
    &amp;lt;/View&amp;gt;
}

const styles = StyleSheet.create({
    container : { 
        flex: 1, 
        alignItems: 'center',
        justifyContent: 'space-between', // 상단과 하단 분리
        backgroundColor: '#fff',
        padding: 20,
    }, 
    content : {
        flexDirection: 'row',
        justifyContent: 'space-around'
    },
    form : {
        width: '90%',
    },
    label : {
        fontWeight: &quot;500&quot;,
        fontSize: 20,
        marginTop: 10,
    }, 
    input : {
        borderColor: '#ddd',
        borderWidth: 1,
        borderRadius: 10,
        margin: 10,
    },
    button: {
        backgroundColor: '#ff3a67', // 버튼 배경색 ff3a67
        padding: 10,
        borderRadius: 5,
        width: '85%',
        alignItems: 'center',
    },
    buttonText: {
        color: 'white', // 버튼 텍스트 색상
        fontSize: 16,
        fontWeight: 'bold',
    },
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AVtRv/btsLrBgysBV/dDDm4Y4fchT2az6oub7t4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AVtRv/btsLrBgysBV/dDDm4Y4fchT2az6oub7t4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AVtRv/btsLrBgysBV/dDDm4Y4fchT2az6oub7t4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAVtRv%2FbtsLrBgysBV%2FdDDm4Y4fchT2az6oub7t4K%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;593&quot; height=&quot;412&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;412&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;2. app/_layout.tsx에 option : modal로 설정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모달로 표시하려면 Stack에 넣고 option으로 presentation: &quot;modal&quot;로 설정하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734856316284&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native';
import { useFonts } from 'expo-font';
import { Stack } from 'expo-router';
import * as SplashScreen from 'expo-splash-screen';
import { StatusBar } from 'expo-status-bar';
import { useEffect } from 'react';
import 'react-native-reanimated';

import { useColorScheme } from '@/hooks/useColorScheme';

// Prevent the splash screen from auto-hiding before asset loading is complete.
SplashScreen.preventAutoHideAsync();

export default function RootLayout() {
  const colorScheme = useColorScheme();
  const [loaded] = useFonts({
    SpaceMono: require('../assets/fonts/SpaceMono-Regular.ttf'),
  });

  useEffect(() =&amp;gt; {
    if (loaded) {
      SplashScreen.hideAsync();
    }
  }, [loaded]);

  if (!loaded) {
    return null;
  }

  return (
    &amp;lt;ThemeProvider value={colorScheme === 'dark' ? DefaultTheme : DefaultTheme}&amp;gt;
      &amp;lt;Stack&amp;gt;
        &amp;lt;Stack.Screen name=&quot;index&quot; /&amp;gt;
        &amp;lt;Stack.Screen name=&quot;userInputModal&quot; options={{
          presentation: &quot;modal&quot;,
          title: '아이 정보 입력'
        }}/&amp;gt;
        &amp;lt;Stack.Screen name=&quot;+not-found&quot; /&amp;gt;
      &amp;lt;/Stack&amp;gt;
      &amp;lt;StatusBar style=&quot;auto&quot; /&amp;gt;
    &amp;lt;/ThemeProvider&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 작업 확인하기&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;Home 화면에서 버튼을 클릭하면 모달을 실행하여 정상 동작하는지 확인하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모달을 실행하는 방식은 router.push로 실행할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734856952253&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { router } from &quot;expo-router&quot;;
import { Button, Text, View } from &quot;react-native&quot;;

export default function Home(){
  const handleModalButton = () =&amp;gt; {
    router.push('/userInputModal')  // 모달 화면으로 이동하기
  }

  return &amp;lt;View&amp;gt;
    &amp;lt;Text&amp;gt;Home &amp;lt;/Text&amp;gt;
    &amp;lt;Button title=&quot;모달&quot; onPress={handleModalButton}&amp;gt;&amp;lt;/Button&amp;gt;
  &amp;lt;/View&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정리&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Modal을 만드는 방식은 Stack Component에서 option을 Modal로 세팅&lt;/li&gt;
&lt;li&gt;Modal을 확인하는 방법은 expo-router의 router.push로 창을 띄어줌&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;마무리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Modal이라는 페이지가를 추가한다는 개념으로 접근한다면 이해가 훨씬 쉬움&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>React Native</category>
      <category>Android</category>
      <category>Expo</category>
      <category>ios</category>
      <category>modal</category>
      <category>react-native</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/103</guid>
      <comments>https://workshop-code.tistory.com/103#entry103comment</comments>
      <pubDate>Sun, 22 Dec 2024 17:47:22 +0900</pubDate>
    </item>
    <item>
      <title>React-native expo 로 wonder weeks 앱 만들기 - 환경 세팅 하기</title>
      <link>https://workshop-code.tistory.com/102</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;솔로프리너? 들어본 적 있는가? &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Solo&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+ Entrepreneur의 합성어로, 1인 창업가나 1인 기업가라고 칭해지는데. 나도 한번 해보고 싶어서 도전해 본다. React Native의 expo를 선택한 이유는. 현 FE개발자로 JS랑 React가 익숙했기에 React Native에 대한 진입장벽이 낮게 느껴졌고, 개발 한 번으로 IOS, Android 둘 다 배포할 수 있다니. 군침이 싹 돈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #474747;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;expo로 개발 한 이유는 별 생각 없었고, 공식 문서를 따라가다 보면 자연스럽게... expo로 개발을...&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://reactnative.dev/docs/environment-setup&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://reactnative.dev/docs/environment-setup&lt;/a&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;h4 data-ke-size=&quot;size20&quot;&gt;1. React-native expo 로 프로젝트 설치하고 실행하기&lt;/h4&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;background-color: #282c34; color: #ffffff;&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;npx create-expo-app@latest&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qUKgs/btsLrLQHPiY/um40TdDuGq0DAAgQdEQuX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qUKgs/btsLrLQHPiY/um40TdDuGq0DAAgQdEQuX0/img.png&quot; data-alt=&quot;실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qUKgs/btsLrLQHPiY/um40TdDuGq0DAAgQdEQuX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqUKgs%2FbtsLrLQHPiY%2Fum40TdDuGq0DAAgQdEQuX0%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;646&quot; height=&quot;247&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;247&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btFQ29/btsLttuI8WP/QeUKbMP5Iyml5QEm6AeAO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btFQ29/btsLttuI8WP/QeUKbMP5Iyml5QEm6AeAO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btFQ29/btsLttuI8WP/QeUKbMP5Iyml5QEm6AeAO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtFQ29%2FbtsLttuI8WP%2FQeUKbMP5Iyml5QEm6AeAO1%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;707&quot; height=&quot;263&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blbHVv/btsLqT9EX4Z/1yL5ZbzuJ57CX6xETOB1p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blbHVv/btsLqT9EX4Z/1yL5ZbzuJ57CX6xETOB1p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blbHVv/btsLqT9EX4Z/1yL5ZbzuJ57CX6xETOB1p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblbHVv%2FbtsLqT9EX4Z%2F1yL5ZbzuJ57CX6xETOB1p0%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;719&quot; height=&quot;485&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;485&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;앱 이름을 입력하라고 한다. 만들 앱의 이름은 wonder_weeks를 입력하고 앤터를 치면 알아서 폴더를 만들고 실행이 끝나면. 어떻게 해야 할지 알려준다. 하라는 명령어 그대로 실행해 보자&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1734782934466&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd wonder_weeks
npm run android&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;필자의 경우 안드로이드 폰을 사용하고 있어서 android로 실행했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmABIG/btsLrdGKp7k/Us0LkHLAMIF8UiP0a8tkT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmABIG/btsLrdGKp7k/Us0LkHLAMIF8UiP0a8tkT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmABIG/btsLrdGKp7k/Us0LkHLAMIF8UiP0a8tkT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmABIG%2FbtsLrdGKp7k%2FUs0LkHLAMIF8UiP0a8tkT0%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;1094&quot; height=&quot;275&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결된 안드로이드 앱을 찾지 못해서 에러가 발생했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 앱 실행해보기&lt;/h4&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://docs.expo.dev/get-started/set-up-your-environment/?mode=expo-go&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.expo.dev/get-started/set-up-your-environment/?mode=expo-go&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1734783298620&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;Set up your environment&quot; data-og-description=&quot;Learn how to set up your development environment to start building with Expo.&quot; data-og-host=&quot;docs.expo.dev&quot; data-og-source-url=&quot;https://docs.expo.dev/get-started/set-up-your-environment/?mode=expo-go&quot; data-og-url=&quot;https://docs.expo.dev/get-started/set-up-your-environment/?mode=expo-go&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b8H0Ou/hyXSzB6D0M/L1y9oIVcHqwDIxJ9HvTR2k/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/XV8Tw/hyXSplW2eB/xXWx1ppoeZGRrsBK43BbHk/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/get-started/set-up-your-environment/?mode=expo-go&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.expo.dev/get-started/set-up-your-environment/?mode=expo-go&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b8H0Ou/hyXSzB6D0M/L1y9oIVcHqwDIxJ9HvTR2k/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/XV8Tw/hyXSplW2eB/xXWx1ppoeZGRrsBK43BbHk/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788');&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;Set up your environment&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to set up your development environment to start building with Expo.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.expo.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rKeZN/btsLtvzjAQx/JVFiaOJjUVsxPKlyOpHZ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rKeZN/btsLtvzjAQx/JVFiaOJjUVsxPKlyOpHZ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rKeZN/btsLtvzjAQx/JVFiaOJjUVsxPKlyOpHZ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrKeZN%2FbtsLtvzjAQx%2FJVFiaOJjUVsxPKlyOpHZ70%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;1074&quot; height=&quot;701&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인 기기에 맞는 옵션을 선택하자. 옵션에 따른 설명이 하단에 나온다. Expo를 설치하라고 하니 설치하자.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UowQA/btsLtIyydPC/92QBAKQKkLDONkKC1rRkik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UowQA/btsLtIyydPC/92QBAKQKkLDONkKC1rRkik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UowQA/btsLtIyydPC/92QBAKQKkLDONkKC1rRkik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUowQA%2FbtsLtIyydPC%2F92QBAKQKkLDONkKC1rRkik%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;939&quot; height=&quot;376&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Expo go 앱이 설치된다.&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;a href=&quot;https://docs.expo.dev/get-started/start-developing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.expo.dev/get-started/start-developing/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1734783481195&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;Start developing&quot; data-og-description=&quot;Make your first change to an Expo project and see it live on your device.&quot; data-og-host=&quot;docs.expo.dev&quot; data-og-source-url=&quot;https://docs.expo.dev/get-started/start-developing/&quot; data-og-url=&quot;https://docs.expo.dev/get-started/start-developing/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/baSVMO/hyXSwZGpjX/0nK4kIlNbbTouc0w82swA0/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/dsFJ7e/hyXOkUaDjy/hk57xlE30RdUa7vkexKDUK/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/dLBzzW/hyXSwL87SO/Do7nZ0rHD5xZlWhaL1Tbck/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788&quot;&gt;&lt;a href=&quot;https://docs.expo.dev/get-started/start-developing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.expo.dev/get-started/start-developing/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/baSVMO/hyXSwZGpjX/0nK4kIlNbbTouc0w82swA0/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/dsFJ7e/hyXOkUaDjy/hk57xlE30RdUa7vkexKDUK/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788,https://scrap.kakaocdn.net/dn/dLBzzW/hyXSwL87SO/Do7nZ0rHD5xZlWhaL1Tbck/img.png?width=1500&amp;amp;height=788&amp;amp;face=0_0_1500_788');&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;Start developing&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Make your first change to an Expo project and see it live on your device.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.expo.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wxBXN/btsLrmqkX7d/Y0eb2qo1XsMLZNuKGtjoq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wxBXN/btsLrmqkX7d/Y0eb2qo1XsMLZNuKGtjoq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wxBXN/btsLrmqkX7d/Y0eb2qo1XsMLZNuKGtjoq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwxBXN%2FbtsLrmqkX7d%2FY0eb2qo1XsMLZNuKGtjoq0%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;1122&quot; height=&quot;320&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;320&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;pre id=&quot;code_1734783544239&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx expo start&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P8MiM/btsLtfXFses/pmnzsa1QE6kTrkRzFLlPq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P8MiM/btsLtfXFses/pmnzsa1QE6kTrkRzFLlPq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P8MiM/btsLtfXFses/pmnzsa1QE6kTrkRzFLlPq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP8MiM%2FbtsLtfXFses%2Fpmnzsa1QE6kTrkRzFLlPq1%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;708&quot; height=&quot;780&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;780&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;QR 코드가 보인다. 한번 찍어보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqVigp/btsLsBmsvx7/scsEWvt4UMQ6GakZ0ObjJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqVigp/btsLsBmsvx7/scsEWvt4UMQ6GakZ0ObjJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqVigp/btsLsBmsvx7/scsEWvt4UMQ6GakZ0ObjJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqVigp%2FbtsLsBmsvx7%2FscsEWvt4UMQ6GakZ0ObjJK%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;430&quot; height=&quot;956&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱이 실행된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정리&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React native에서 제공하는 공식문서를 따라 개발을 진행.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;npx create-expo-app@latest 를 사용해서 프로젝트를 생성&lt;/li&gt;
&lt;li&gt;npx expo start로 생성한 프로젝트를 실행&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;느낀 점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React Native 개발 생각보다 해볼만 ? ㅋㅋ&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>React Native</category>
      <category>andriod</category>
      <category>Expo</category>
      <category>ios</category>
      <category>react-native</category>
      <category>wonder-weeks</category>
      <category>솔로프리너</category>
      <category>앱개발</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/102</guid>
      <comments>https://workshop-code.tistory.com/102#entry102comment</comments>
      <pubDate>Sat, 21 Dec 2024 21:25:54 +0900</pubDate>
    </item>
    <item>
      <title>FSD 프론트앤드 개발을 위한 최적화된 디자인 패턴</title>
      <link>https://workshop-code.tistory.com/101</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Zooc/btsFWKpItnK/awf8mNqf1CeeAZG1SYo6J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Zooc/btsFWKpItnK/awf8mNqf1CeeAZG1SYo6J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Zooc/btsFWKpItnK/awf8mNqf1CeeAZG1SYo6J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Zooc%2FbtsFWKpItnK%2Fawf8mNqf1CeeAZG1SYo6J0%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;1060&quot; height=&quot;616&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;들어가기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FSD 아키텍처가 무엇인지 아는가? Feature-Sliced Design의 줄임말로 애플리케이션을 Feature(기능) 단위로 조직화하여 관리하는 방법을 말한다. 끊임없이 변화하는 비즈니스 요구 사항에 맞서서 프로젝트를 더 이해하기 쉽고 체계적으로 만든다는 점에서 매우 흥미롭게 다가왔다. 개발은 변화에 민감하다. 각 기능들은 다른 기능들에 대해 격리되어 있어야 한다. 왜냐하면 하나의 변화로 인해서 다른 기능들이 고장 나는 경우가 너무 빈번했기 때문에. 어떻게 격리벽을 세워 코드를 안전하게 작성할 수 있을지에 대한 고민이 많았다. 그리고 유지보수와 확장성에도 좋은 코드를 작성하여 팀원분들에게도 좋은 코드리뷰를 하고 싶은 마음, 그러한 기준을 찾고 있었다. 클린 아키텍처, 실전주의 프로그래머 등 다양한 책을 읽으면서 개념에 대해서 이해는 했지만, 그 개념을 직접적으로 적용하기에는 어떻게 해야 할지 막막했다. 그러던 중에 발견한 FSD이다.&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;FSD 아키텍처는 책에서 읽은 다양한 개념들을&lt;b&gt; 집대성하여 완성한 아키텍처&lt;/b&gt;로 보였다. 아키텍처보다는 방법론 쪽에 가깝다는 생각이 들었다. 왜냐하면 어떻게 폴더를 배치하고, 각 폴더에는 어떤 파일들이 있어야 하는지를 꽤나 설명해 주기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FSD의 매력 ① -&amp;nbsp; 관심사의 분리&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;FSD의 가장 매력적인 부분은 바로 Layer를 명확하게 설명하고 있는 점이었다.&lt;b&gt; Layered architecture를&lt;/b&gt; 아는가? 정말 흔한 아키텍처인데 중요한 특징으로는 레이어라는 개념으로 관심사를 분리하고 있다. 레이어드 아키텍처를 보면 FE 보다는 BE에 초점이 맞춰져 있다는 느낌을 받았다. (&lt;a href=&quot;https://xxeol.tistory.com/26&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://xxeol.tistory.com/26&lt;/a&gt;) 가장 중요한 건 왜 레이어드 아키텍처가 탄생했냐 이다. 그건 바로 관심사를 분리하기 위해서이다. FSD는 FE의 필요성에 맞게 Layer를 설명한다.&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;app - 앱이 초기화되는 곳(진입점). provider, router, global style, global type&lt;/li&gt;
&lt;li&gt;&lt;s&gt;process - 여러 단계로 이루어진 페이지 처리&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;pages - 애플리케이션의 페이지. ( 로그인 페이지, 메인 페이지 등)&lt;/li&gt;
&lt;li&gt;widgets - 페이지에 사용되는 독립적인 UI 컴포넌트&amp;nbsp;&lt;/li&gt;
&lt;li&gt;features - 비즈니스, 시나리오, 기능 ( 좋아요, 리뷰, 제품 평가)&lt;/li&gt;
&lt;li&gt;entities - 비즈니스 엔티티 (사용자, 리뷰, 댓글)&lt;/li&gt;
&lt;li&gt;shared - 특정 비즈니스에 종속되지 않은 재사용 가능한 컴포넌트와 유틸리티 (ui 키트, axios)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이어들의 특징 의존성에 대해서도 설명한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEBUQk/btsFVSzMxoE/KYyTV3It2TbdKF5Sk3t2v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEBUQk/btsFVSzMxoE/KYyTV3It2TbdKF5Sk3t2v1/img.png&quot; data-alt=&quot;출처 :&amp;amp;nbsp;https://dev.to/m_midas/feature-sliced-design-the-best-frontend-architecture-4noj&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEBUQk/btsFVSzMxoE/KYyTV3It2TbdKF5Sk3t2v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEBUQk%2FbtsFVSzMxoE%2FKYyTV3It2TbdKF5Sk3t2v1%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;629&quot; height=&quot;193&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://dev.to/m_midas/feature-sliced-design-the-best-frontend-architecture-4noj&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레이어들의 책임과 역할에 대해 개념적으로 FE에 이렇게 맞게끔 설명한 아키텍처는 처음으로 보인다.&amp;nbsp;&lt;br /&gt;즉 App에서 SHARED를 가질 수 있지만, SHARED가 App을 가질 수는 없다는 의미이다. 각 계층을 관심사를 명확하게 구분 지어 놓았다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;FSD의 매력 ② -&amp;nbsp; Layer의 구성&amp;nbsp;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 관심사들을 묶어 두는 것까지는 설명을 하지만, 어떻게 묶어야 하는지 대해 구체적으로 설명해 주는 경우는 많이 보지 못했다. 그러나 FSD의 경우에는 Layer는 어떻게 구성되어야 하는지까지 알려준다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyQMFT/btsFRsioJf9/Xl77L7XfyrByhblXNNvtE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyQMFT/btsFRsioJf9/Xl77L7XfyrByhblXNNvtE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyQMFT/btsFRsioJf9/Xl77L7XfyrByhblXNNvtE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyQMFT%2FbtsFRsioJf9%2FXl77L7XfyrByhblXNNvtE0%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;592&quot; height=&quot;297&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;297&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Layers -&amp;nbsp; 앞서 설명한 데로&amp;nbsp; 총 최대 7개로 이루어짐( app, pages, widgets, features, entities, shared)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;slices - 특정 비즈니스의 Entities로 이루어짐(서비스별로 묶여있음)&lt;/li&gt;
&lt;li&gt;segments - ui, model, api 등 기술적인 목적에 따라 코드가 이루어짐(기능별로 묶여 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레이어들에 대해 서비스들이 있고, 서비스들은 세그먼츠들로 이루어져 있게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FSD는 FE 개발에 사용하기 적합한 디자인 패턴이다&lt;/li&gt;
&lt;li&gt;Layers들의 각 역할에 대해 이해하여 관심사분리가 되어야 한다&lt;/li&gt;
&lt;li&gt;Layer는 서비스별로 slices 되어있으며 slices는 기능별로 나뉜다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>front-end</category>
      <category>CleanArchitecture</category>
      <category>CodeSeparation</category>
      <category>DevelopmentBestPractices</category>
      <category>FeatureSlicedDesign</category>
      <category>FrontEndArchitecture</category>
      <category>FrontendDevelopment</category>
      <category>SoftwareDesignPatterns</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/101</guid>
      <comments>https://workshop-code.tistory.com/101#entry101comment</comments>
      <pubDate>Thu, 21 Mar 2024 10:14:14 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] BFS 그래프 탐색</title>
      <link>https://workshop-code.tistory.com/100</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPitmp/btsFjXcvG7A/E1qrDwgpIYRKSeyMfGVGyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPitmp/btsFjXcvG7A/E1qrDwgpIYRKSeyMfGVGyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPitmp/btsFjXcvG7A/E1qrDwgpIYRKSeyMfGVGyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPitmp%2FbtsFjXcvG7A%2FE1qrDwgpIYRKSeyMfGVGyk%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;377&quot; height=&quot;335&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BFS란?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BFS(Breadth-First Search, 너비 우선 탐색 )은 그래프 탐색 알고리즘이다.&lt;/li&gt;
&lt;li&gt;시작 정점에서 가장 가까운 정점을 방문하고 멀리 떨어진 정점을 나중에 방문하는 방식으로 탐색한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;BFS 탐색 과정?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAlrai/btsFpQirMSS/I59s6fN6nyjhg7SF148G10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAlrai/btsFpQirMSS/I59s6fN6nyjhg7SF148G10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAlrai/btsFpQirMSS/I59s6fN6nyjhg7SF148G10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAlrai%2FbtsFpQirMSS%2FI59s6fN6nyjhg7SF148G10%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;289&quot; height=&quot;387&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/span&gt;를 탐색하고 B와 C를 탐색 리스트에 넣는다. 탐색 리스트 = [B, C]&amp;nbsp;&lt;/li&gt;
&lt;li&gt;탐색리스트에서 첫 번째 요소 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;B&lt;/b&gt;&lt;/span&gt;를 탐색하고 D를 탐색 리스트에 넣는다. = [ C, D ]&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;탐색리스트에서 첫번째 요소 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;를 탐색하고 E를 탐색 리스트에 넣는다. = [ D, E ]&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;탐색리스트에서 첫번째 요소&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;D&lt;/span&gt;&lt;/b&gt;를 탐색하고 탐색 결과가 없어서 넘어간다. = [ E ]&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;탐색리스트에서 첫번째 요소 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;E&lt;/span&gt;&lt;/b&gt;를 탐색하고 탐색 결과가 없어서 넘어간다. = []&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BFS의 등장 배경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A에서 E까지 가는 최단 경로를 찾고 싶다면 어떻게 할 것인가?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;탐색 리스트에 넣을때가 바로 탐색한 횟수를 카운트하면 알 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/span&gt;를 탐색하고 B와 C를 탐색 리스트에 넣는다. 탐색 리스트 = [B, C]&amp;nbsp; &lt;u&gt;1회&amp;nbsp;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;탐색리스트에서 첫번째 요소&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;B&lt;/b&gt;&lt;/span&gt;를 탐색하고 D를 탐색 리스트에 넣는다. = [ C, D ] &lt;u&gt;2회&amp;nbsp;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;탐색리스트에서 첫번째 요소&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;를 탐색하고 E를 탐색 리스트에 넣는다. = [ D, E ] &lt;u&gt;3회&amp;nbsp;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;탐색리스트에서 첫번째 요소&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;D&lt;/span&gt;&lt;/b&gt;를 탐색하고 탐색 결과가 없어서 넘어간다. = [ E ]&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;탐색리스트에서 첫번째 요소&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;E&lt;/span&gt;&lt;/b&gt;를 탐색하고 탐색 결과가 없어서 넘어간다. = []&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;총 3회만에 갈 수 있다는 것을 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BFS를 활용하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알고리즘 문제로 풀어보기&lt;br /&gt;
&lt;figure id=&quot;og_1709114905047&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PGyFK/hyVugEWLOy/K6Ic83doSdIQs7LucwwKp1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2178&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2178&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-description=&quot;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.&quot; data-og-title=&quot;2178번: 미로 탐색&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.acmicpc.net/problem/2178&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2178&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PGyFK/hyVugEWLOy/K6Ic83doSdIQs7LucwwKp1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;2178번: 미로 탐색&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리 및 마무리&amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BFS를 사용하면 최단 거리를 알 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>BFS</category>
      <category>그래프탐색</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/100</guid>
      <comments>https://workshop-code.tistory.com/100#entry100comment</comments>
      <pubDate>Wed, 28 Feb 2024 19:09:29 +0900</pubDate>
    </item>
    <item>
      <title>제네릭 이해하기</title>
      <link>https://workshop-code.tistory.com/99</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exSPnk/btsFimXpHNT/gMJqG49DNGIayieJ29KLj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exSPnk/btsFimXpHNT/gMJqG49DNGIayieJ29KLj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exSPnk/btsFimXpHNT/gMJqG49DNGIayieJ29KLj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FexSPnk%2FbtsFimXpHNT%2FgMJqG49DNGIayieJ29KLj1%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;1395&quot; height=&quot;716&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;제네릭의 등장 배경&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드의 안정성과 재사용성을 높이기 위해&lt;/li&gt;
&lt;li&gt;여러 종류의 객체를 다룰 수 있는 유연한 코드를 작성하기 위해&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이해되나요? ㅋㅋ 저는 이해가 안 됩니다. ㅋㅋ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제네릭을 이해하기 위한 이야기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우리가 배열을 만들어야 한다고 생각해 보면, 배열에는 어떤 타입의 데이터가 들어올까요?&lt;br /&gt;문자열, 숫자, boolean ... 어떤 데이터도 들어올 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;해결방안으로는 우리는 각각 모든 타입별로 제공하는 배열들을 만들어줘야 합니다. &lt;br /&gt;&lt;br /&gt;예를 들면 다음과 같습니다.&amp;nbsp;&lt;br /&gt;string일 때 사용하는 배열 - stringarray &lt;br /&gt;number일 때 사용하는 배열 - numberarray &lt;br /&gt;boolean일 때 사용하는 배열 - boolarray &lt;br /&gt;string이랑 number를 모두 사용하는 배열 - stringAndNumberArray&amp;nbsp; &lt;br /&gt;&lt;br /&gt;한도 끝도 없겠죠? 이러한 문제를 해결하기 위해서 등장한 것이 바로 제네릭!!.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;제네릭은 사용하는 사람이 어떤 타입으로 정할지 선택할 수 있도록 의존성을 넘겼어요.&lt;br /&gt;대표적인 예시가 배로 배열이죠~&lt;br /&gt;
&lt;pre id=&quot;code_1709016382795&quot; class=&quot;typescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;let stringarray: Array&amp;lt;string&amp;gt; = [&quot;hi&quot;, &quot;hello world&quot;];
let numberarray: Array&amp;lt;number&amp;gt; = [1, 2];
let boolarray: Array&amp;lt;boolean&amp;gt; = [true, false];
let mixarray: Array&amp;lt;string|number&amp;gt; = [1, &quot;hi&quot;];​&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;배열을 선언할 때 타입을 지정할 수 있도록 하는 개념이 바로 &lt;u&gt;&lt;b&gt;제네릭!!&lt;/b&gt;&lt;/u&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리 및 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제네릭을 활용하면 코드의 재사용성, 유지보수성을 향상할 수 있어요.&lt;br /&gt;더 유연한 코드로 작성하고 싶다면 제네릭은 꼭 알아야 하는 개념이라는 것을 알아두세요.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>front-end</category>
      <category>제네릭</category>
      <category>타입스크립트</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/99</guid>
      <comments>https://workshop-code.tistory.com/99#entry99comment</comments>
      <pubDate>Tue, 27 Feb 2024 15:56:18 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘]나머지 연산(모듈러 연산)</title>
      <link>https://workshop-code.tistory.com/98</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GpCfx/btsFh7spOC9/Du7i3XbIRkvtwcnUJE8FZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GpCfx/btsFh7spOC9/Du7i3XbIRkvtwcnUJE8FZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GpCfx/btsFh7spOC9/Du7i3XbIRkvtwcnUJE8FZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGpCfx%2FbtsFh7spOC9%2FDu7i3XbIRkvtwcnUJE8FZK%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;377&quot; height=&quot;335&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;목표&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;나머지 연산에 대해 알아보자&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;나머지 연산을 이용한 문제 풀이&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;나머지 연산의 등장 배경&amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;31 mod 4는 무엇일까? 너무 쉽다. '3'!&lt;/li&gt;
&lt;li&gt;3^31 mod 12는 무엇일까?   계산기를 두드려서라도 구해보자.&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;3^31는 &lt;/span&gt;617673396283947이다. 이 숫자의 mod 12는? 머리의 한계가 온다.&amp;nbsp;&lt;br /&gt;컴퓨터의 도움을 받아보자&amp;nbsp;&lt;br /&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HspAv/btsFispwSk2/2c01isKKVKxEbTlYHobc51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HspAv/btsFispwSk2/2c01isKKVKxEbTlYHobc51/img.png&quot; data-alt=&quot;바로 결과 도출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HspAv/btsFispwSk2/2c01isKKVKxEbTlYHobc51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHspAv%2FbtsFispwSk2%2F2c01isKKVKxEbTlYHobc51%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;267&quot; height=&quot;38&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바로 결과 도출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;3^&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;200 &lt;span&gt;mod 12는 무엇일까?   장난하나 너무 큰 숫자다.&amp;nbsp;&lt;br /&gt;이렇게 큰 나머지 숫자를 어떻게 구 할 수있을까?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;나머지 연산&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나머지 연산은 3가지 특징을 가진다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Sym9/btsFjU0oQ5N/2dM2K65QB1oOXPF4qjUM6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Sym9/btsFjU0oQ5N/2dM2K65QB1oOXPF4qjUM6k/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://developer-mac.tistory.com/84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Sym9/btsFjU0oQ5N/2dM2K65QB1oOXPF4qjUM6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Sym9%2FbtsFjU0oQ5N%2F2dM2K65QB1oOXPF4qjUM6k%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;439&quot; height=&quot;155&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://developer-mac.tistory.com/84&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나머지 연산의 특징을 활용하여 문제를 해결해 보자.&lt;/li&gt;
&lt;li&gt;3^200 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;mod 12&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;=&amp;nbsp;(&amp;nbsp;3^200&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;)&amp;nbsp;*&amp;nbsp;(&amp;nbsp;&amp;nbsp;3^200&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;)&amp;nbsp;mod&amp;nbsp;12 &lt;br /&gt;=&amp;nbsp;(&amp;nbsp;3^100&amp;nbsp;&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;)&amp;nbsp;*&amp;nbsp;(&amp;nbsp;3^100&amp;nbsp;&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;)&amp;nbsp;^2&amp;nbsp;&amp;nbsp;&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(1) &lt;br /&gt;=&amp;nbsp;((&amp;nbsp;3^50&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;)&amp;nbsp;*&amp;nbsp;(&amp;nbsp;3^50&amp;nbsp;&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;)^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;(2) &lt;br /&gt;=&amp;nbsp;((&amp;nbsp;3^25&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;)&amp;nbsp;*&amp;nbsp;(&amp;nbsp;3^25&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;)^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(3) &lt;br /&gt;=&amp;nbsp;((&amp;nbsp;3^12&amp;nbsp;*&amp;nbsp;3&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;)&amp;nbsp;*&amp;nbsp;(&amp;nbsp;3^12&amp;nbsp;*&amp;nbsp;3&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;)^2^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(4) &lt;br /&gt;=&amp;nbsp;((&amp;nbsp;3^6&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;)&amp;nbsp;*&amp;nbsp;(&amp;nbsp;3^6&amp;nbsp;*&amp;nbsp;3&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;)^2^2^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(5) &lt;br /&gt;=&amp;nbsp;((&amp;nbsp;3^3&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;)&amp;nbsp;*&amp;nbsp;(&amp;nbsp;3^3&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;)^2^2^2^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(6) &lt;br /&gt;=&amp;nbsp;((&amp;nbsp;3^1&amp;nbsp;*&amp;nbsp;3&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;)&amp;nbsp;*&amp;nbsp;(&amp;nbsp;3^1&amp;nbsp;*&amp;nbsp;3&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;&amp;nbsp;&amp;nbsp;)^2^2^2^2^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(7) &lt;br /&gt;&lt;br /&gt;이제&amp;nbsp;순서대로&amp;nbsp;계산을&amp;nbsp;해봅시다. &lt;br /&gt;&lt;br /&gt;=&amp;nbsp;(9&amp;nbsp;*&amp;nbsp;9&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;)^2^2^2^2^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(7) &lt;br /&gt;&amp;nbsp;&amp;nbsp;81&amp;nbsp;mod&amp;nbsp;12는&amp;nbsp;9 &lt;br /&gt;=&amp;nbsp;(9&amp;nbsp;*&amp;nbsp;9&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;)^2^2^2^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(6) &lt;br /&gt;&amp;nbsp;&amp;nbsp;81&amp;nbsp;mod&amp;nbsp;12는&amp;nbsp;9 &lt;br /&gt;=&amp;nbsp;(9&amp;nbsp;*&amp;nbsp;9&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;)^2^2^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(5) &lt;br /&gt;&amp;nbsp;&amp;nbsp;81&amp;nbsp;mod&amp;nbsp;12는&amp;nbsp;9 &lt;br /&gt;=&amp;nbsp;(9&amp;nbsp;*&amp;nbsp;9&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;)^2^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(4) &lt;br /&gt;&amp;nbsp;&amp;nbsp;81&amp;nbsp;mod&amp;nbsp;12는&amp;nbsp;9 &lt;br /&gt;=&amp;nbsp;(9&amp;nbsp;*&amp;nbsp;9&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;)^2^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(3) &lt;br /&gt;&amp;nbsp;&amp;nbsp;81&amp;nbsp;mod&amp;nbsp;12는&amp;nbsp;9 &lt;br /&gt;=&amp;nbsp;(9&amp;nbsp;*&amp;nbsp;9&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;)^2^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(2) &lt;br /&gt;&amp;nbsp;&amp;nbsp;81&amp;nbsp;mod&amp;nbsp;12는&amp;nbsp;9 &lt;br /&gt;=&amp;nbsp;(9&amp;nbsp;*&amp;nbsp;9&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;)^2&amp;nbsp;mod&amp;nbsp;12&amp;nbsp;(1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;81&amp;nbsp;mod&amp;nbsp;12는&amp;nbsp;9 &lt;br /&gt;=&amp;nbsp;9 &lt;br /&gt;&lt;br /&gt;나머지는 9이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;나머지 연산 활용하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나머지 연산과 그의 특징을 활용한다면 큰 숫자의 나머지도 구할 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;코드로 알아보기&amp;nbsp;&lt;br /&gt;
&lt;pre id=&quot;code_1709012039554&quot; class=&quot;excel&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let m = 12;
let mode  = ( n, k  ) =&amp;gt; {
    if(k == 1) { 
        return n % m; 
    };
    let _n = mode( n, Math.floor (k / 2 ));
    _n = _n * _n % m;
    if( k &amp;amp; 1 ) _n = _n * n % m;
    return _n;
} 

mode(3, 61740) // 9가 나온다​&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;알고리즘 문제로 풀어보기&amp;nbsp;&lt;br /&gt;
&lt;figure id=&quot;og_1709012103697&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dMgf2O/hyVqqovLUv/9y1WVo5PvM1MOFgdi0cWvK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1629&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1629&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-description=&quot;첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.&quot; data-og-title=&quot;1629번: 곱셈&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://www.acmicpc.net/problem/1629&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1629&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dMgf2O/hyVqqovLUv/9y1WVo5PvM1MOFgdi0cWvK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;1629번: 곱셈&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 A, B, C가 빈칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리 및 마무리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나머지 연산의 특징을 잘 활용한다면 어떤 큰 수의 나머지도 구 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참조&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;https://developer-mac.tistory.com/84&lt;/blockquote&gt;</description>
      <category>알고리즘/정수론</category>
      <category>나머지 연산</category>
      <category>모듈러 연산</category>
      <category>모듈러 연산 특징</category>
      <category>정수론</category>
      <author>늘푸른개발자</author>
      <guid isPermaLink="true">https://workshop-code.tistory.com/98</guid>
      <comments>https://workshop-code.tistory.com/98#entry98comment</comments>
      <pubDate>Tue, 27 Feb 2024 14:37:15 +0900</pubDate>
    </item>
  </channel>
</rss>