<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>narinn-star.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 18 Jan 2023 15:58:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>narinn-star.log</title>
            <url>https://velog.velcdn.com/images/narinn-star/profile/4b5790d3-3597-4a86-ad4e-b3ff6c835f62/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. narinn-star.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/narinn-star" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[React Native] Recoil ]]></title>
            <link>https://velog.io/@narinn-star/React-Native-Recoil</link>
            <guid>https://velog.io/@narinn-star/React-Native-Recoil</guid>
            <pubDate>Wed, 18 Jan 2023 15:58:40 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/narinn-star/post/5e489303-c4e5-4ed3-99f1-eb9b852997bc/image.png" alt=""></p>
<blockquote>
<p>상태 관리 라이브러리, Recoil을 사용해보자!</p>
</blockquote>
<h2 id="recoil">Recoil?</h2>
<p>페이스북에서 만든, React를 위한 상태 관리 라이브러리이다. 
Redux는 아직 사용해보지 않아서 둘의 명확한 차이는 잘 모르지만, Recoil을 한 번 사용해 보았을 때 React 내장 Hooks와 사용하는 방식이 비슷해 크게 어렵지 않았다.
그저 useState를 useRecoilState로 작성하기만 하면 된다.</p>
<p>Recoil 공식 문서에서는 <strong>&quot;Recoil을 사용하면 atoms에서 selectors를 거쳐 React 컴포넌트로 내려가는 data-flow graph를 만들 수 있다.&quot;</strong> 라고 소개한다.</p>
<h3 id="atoms">Atoms</h3>
<p>Atoms는 상태의 단위이다. 업데이트와 구독이 가능하며, atom이 업데이트 되면 새로운 값을 반영해 리렌더링 된다. 동일한 atom이 여러 컴포넌트에서 사용된다면 모두 한 상태를 공유하게 된다.</p>
<h3 id="selectors">Selectors</h3>
<p>atoms의 상태값을 동기 또는 비동기 방식을 통해 변환하는 순수 함수이다. 상위 atoms나 selecotrs가 업데이트 되면 하위의 selector 함수도 다시 실행되며, atoms 처럼 구독이 가능하고 변경되면 컴포넌트들도 리렌더링 된다.</p>
<h2 id="recoil-시작하기">Recoil 시작하기</h2>
<h3 id="🔧-설치">🔧 설치</h3>
<pre><code>yarn add recoil</code></pre><h3 id="recoilroot">RecoilRoot</h3>
<p>루트 컴포넌트 (Ex_App.tsx)에 RecoilRoot로 전체를 감싸주어야 한다. </p>
<p><strong><em>App.tsx</em></strong></p>
<pre><code>...
import { RecoilRoot } from &quot;recoil&quot;;

const Stack = createNativeStackNavigator&lt;RootStackParamList&gt;();

export default function App() {
    return (
        &lt;RecoilRoot&gt;
            &lt;NavigationContainer&gt;
                &lt;Stack.Navigator initialRouteName=&quot;Home&quot;&gt;
                    &lt;Stack.Screen
                        name=&quot;Home&quot;
                        component={Home}
                        options={{ title: &quot;Home&quot; }}
                    /&gt;
                    &lt;Stack.Screen
                        name=&quot;Login&quot;
                        component={Login}
                        initialParams={{ name: &quot;Login&quot;, userId: &quot;User&quot; }}
                        options={{ title: &quot;로그인&quot; }}
                    /&gt;
                &lt;/Stack.Navigator&gt;
                &lt;StatusBar style=&quot;auto&quot; /&gt;
            &lt;/NavigationContainer&gt;
        &lt;/RecoilRoot&gt;
    );
}</code></pre><hr>
<h3 id="authstate">authState</h3>
<p>auth에 대한 정보 저장할 거라서, 아래처럼 authState 작성했다.
email과 password를 저장하기 위해 interface도 정의했다.</p>
<p><strong><em>recoil/auth.tsx</em></strong></p>
<pre><code>import { atom } from &quot;recoil&quot;;

export interface IAuthTypes {
    email: string;
    password: string;
}

const authState = atom({
    key: &quot;authState&quot;,
    default: null,
});

export default authState;
</code></pre><hr>
<h3 id="auth-setauth">auth, setAuth</h3>
<p>이제 authState를 사용해서 저장해보장!</p>
<p><strong><em>Login/index.tsx 일부</em></strong></p>
<pre><code>import authState, { IAuthTypes } from &quot;../../recoil/auth&quot;;
import { useRecoilState } from &quot;recoil&quot;;
...

const Login = ({ navigation }: Props) =&gt; {
    const [auth, setAuth] = useRecoilState&lt;IAuthTypes[]&gt;(authState);
    ...
    return (
        &lt;Container&gt;
            ...
            &lt;Button
                style={{ marginBottom: 24 }}
                label=&quot;Login&quot;
                onPress={() =&gt; {
                    setAuth([{ email: username, password: password }]);
                }
            /&gt;
            &lt;Button
                style={{ marginBottom: 24 }}
                label=&quot;Confirm&quot;
                onPress={() =&gt; {
                    console.log(auth);
                }
            /&gt;
            ...
        &lt;/Container&gt;
    );
};

export default Login;</code></pre><hr>
<p>어디서든 useRecoilState&lt;&gt;(authState)만 사용하면, 또는 useRecoilValue만 사용하면 저장해둔 값을 사용할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Cookie, Session, Token]]></title>
            <link>https://velog.io/@narinn-star/TIL-Cookie-Session-Token</link>
            <guid>https://velog.io/@narinn-star/TIL-Cookie-Session-Token</guid>
            <pubDate>Sun, 15 Jan 2023 17:23:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Cookie, Session, Token에 대해 알아보자!</p>
</blockquote>
<p>쿠키, 세션, 토큰. 모두 들어본 적이 있는 친숙한 단어들이다.
그런데 이 세가지가 무엇을 하는지, 왜 필요한지에 대해서 알아야 쿠키값이든 토큰이든 뭐든 받아서 어떻게 처리해야 하는지 알 수 있을 것 같아 공부한 내용을 정리하려 한다.</p>
<h2 id="cookie🍪">Cookie?🍪</h2>
<p>쿠키는 브라우저에서 사용한다.
우리는 쿠키를 이용해서 서버가 브라우저에 데이터를 넣도록 할 수 있다. 브라우저를 방문할 때마다 쿠키를 요청과 함께 보내게 된다.
인증 뿐만아니라 여러 정보도 저장이 가능하다.</p>
<p>우리가 A라는 영어로 된 브라우저에 방문해서 쿠키를 허용하고 그 웹 브라우저에서 영어가 아닌 한국어로 보겠다고 저장해두면, 다음에 또 다시 이 A라는 브라우저에 방문했을 때 그 쿠키값을 가져와 다시 한국어로 설정할 필요 없이 바로 영어로 우리에게 보여주게 되는 것이다. </p>
<h2 id="session">Session?</h2>
<p>웹 브라우저에 로그인을 하면, 비밀번호 일치에 대한 확인 과정이 있을 것이다. 이 때 비밀번호가 일치하면 세션DB에 나의 아이디와 비밀번호 등으로 구성된 USER가 생성된다.</p>
<p>현재 이 웹 브라우저에 로그인하고 있는 모든 USER들의 정보들이 세션 DB에 저장되어 있게 된다. </p>
<p>이 때문에 웹 브라우저를 사용하는 유저들이 많을수록 많은 DB가 필요하기도 하다. 하지만 토큰으로는 할 수 없는 USER 제거가 가능하다. 현재 로그인하고 있는 유저들이 DB에 저장되어있기 때문에 그 DB에서 유저를 찾아 없애기만 하면 되는 것이다.</p>
<p>세션DB에서 서버로 ID값을 보내면 서버에서는 이 ID 값을 담은 &#39;쿠키&#39;를 브라우저로 전달하게 된다. A라는 웹 브라우저 내의 한 페이지에서 다른 페이지로 가면 세션ID가 쿠키를 넘기고, 또 넘기는 방식으로 쿠키값을 전달해 우리가 해당 웹 브라우저를 계속 사용할 수 있게 되는 것이다.</p>
<h2 id="token">Token?</h2>
<p>세션 DB가 필요 없다.
정보를 하나하나 찾을 필요가 없다는 뜻이다. 
토큰은 아주 긴 텍스트로 구성되어 있는데, 우리는 세션DB에서 처럼 USER를 찾는게 아니라, 이 토큰이 &#39;유효한가&#39;에 대해서만 확인하면 된다.</p>
<h4 id="access-token">Access Token</h4>
<p>유효기간을 가진, 서버가 기억하는 토큰이다.
유효기간은 비교적 짧다.</p>
<h4 id="refresh-token">Refresh Token</h4>
<p>위의 Access Token의 짧은 수명을 보완해주는 친구다. Access Token의 유효기간이 다 되면 Access Token을 다시 발급해줄 Token이다.</p>
<p>로그인 -&gt; 토큰 발급 -&gt; 토큰 만료 -&gt; 로그아웃 -&gt; 로그인 -&gt; Access Token 유효X -&gt; Refresh Token으로 다시 Access Token 발급 ...</p>
<p>내가 이해한 바로는 이러한데.. 자신이 없다 😓</p>
<hr>
<p>Nicolas 강의를 참고했는데, 아직 부족한 부분이 많다.
조금 더 공부할 필요가 있는 부분인 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-Native] AsyncStorage]]></title>
            <link>https://velog.io/@narinn-star/React-Native-AsyncStorage</link>
            <guid>https://velog.io/@narinn-star/React-Native-AsyncStorage</guid>
            <pubDate>Sat, 14 Jan 2023 15:11:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>AsyncStorage를 사용하기 전에, 기초를 조금 닦아보자!</p>
</blockquote>
<p>React로 웹 프로젝트를 했을 때는 세션으로 로그인을 구현했어서, token에 대한 공부를 따로 할 필요가 없었다.
이번에 React-Native를 사용하면서 JWT 토큰 보관을 해야해서AsyncStorage를 공부하게 됐다.</p>
<p>Recoil을 사용해 비동기적으로 불러온 데이터를 저장하긴 하지만, 앱을 닫았을 때 이 데이터들을 저장하기 위해 사용한다.</p>
<p>처음부터 차근차근 해보자!</p>
<h3 id="promise">Promise?</h3>
<p>비동기적 작업을 편하게 관리하도록 도와주는 객체
Promise를 사용하면 콜백 함수로 비동기 작업을 관리하다 발생할 수 있는 일을 방지할 수 있다.</p>
<p><strong>동기적 작업</strong>
특정 작업이 끝날때까지 다음 작업을 시작하지 않고 대기하다가 기존 작업이 끝나면 다음 작업을 시작 (block 상태)</p>
<p><strong>비동기적 작업</strong>
특정 작업이 끝나지 않아도 다음 작업을 수행</p>
<p><strong>만드는 방법</strong></p>
<pre><code>const promise = new Promise((resolve, reject) =&gt; {
    // ...
})</code></pre><p>resolve : 작업이 성공했을 때 호출되는 함수
reject : 작업이 실패했을 때 호출되는 함수</p>
<p><strong>then 메서드</strong>
Promise 객체에서 resolve된 결과를 then 메서드를 통해 사용할 수 있다.</p>
<h3 id="async-await">async? await?</h3>
<p>Promise를 더 쉽게 사용할 수 있도록 해주는 키워드!</p>
<p><strong>사용 방법</strong>
함수 선언할 때 앞에 async 붙이기</p>
<pre><code>async function example(ex) {
    // ...
}</code></pre><p>Promise 앞부분에 await 붙이기</p>
<pre><code>async function res() {
    let result = 1;
    result = await example(result);
}

res.then(
    result =&gt; {
        console.log(result);
    }
)</code></pre><p>Promise, async, await는 AsyncStorage만이 아니라 비동기 작업을 처리할 때 사용되기 때문에 잘 알아두면 좋을 것 같아 다시 한 번 짚어보았다.</p>
<p>이제 진짜 AsyncStorage 시작 !!</p>
<h2 id="asyncstorage">AsyncStorage</h2>
<h3 id="설치하기">설치하기</h3>
<pre><code>yarn add @react-native-async-storage/async-storage</code></pre><h3 id="setitem">setItem</h3>
<p>특정 값을 저장할 때 사용하는 메서드</p>
<pre><code>const save = async() =&gt; {
    try{
        await AsyncStorage.setItem(&#39;key&#39;, &#39;value&#39;);
    } catch (e) {
        //오류 예외 처리
       }
}</code></pre><p>값은 문자열 타입이어야 하고, 객체 또는 배열 타입을 저장하려면 JSON.stringify 함수를 사용한다.</p>
<pre><code>await AsyncStorage.setItem(&#39;key&#39;, JSON.stringify(obj));</code></pre><h3 id="getitem">getItem</h3>
<p>특정 값을 불러올 때 사용하는 메서드</p>
<pre><code>const load = async() =&gt; {
    try{
        const value = await AsyncStorage.getItem(&#39;key&#39;);
        ...
    } catch (e) =&gt; {
        //오류 예외 처리
    }
}</code></pre><p>이 또한 값은 문자열 타입이며 객체 또는 배열을 불러오려면 JSON.parse 함수를 사용한다.</p>
<pre><code>const obj = JSON.parse(value);</code></pre><p>이 외에도 여러 API가 존재한다. 
그건 요기 참고 -&gt; <a href="https://reactnative.dev/docs/asyncstorage">https://reactnative.dev/docs/asyncstorage</a></p>
<p>일단 내가 사용할 것은 setItem으로, 로그인을 했을 때 토큰 저장을 하는 것이고 다음에 SplashScreen에서 getItem으로 다시 값을 가져와 로그인 여부를 확인하려한다.</p>
<p>일단 로그인은 구현이 되어있는데 AsyncStorage에 토큰 값을 저장해보자!</p>
<blockquote>
<p>AsyncStorage에 값을 저장해보자!</p>
</blockquote>
<p><em>Login/index.tsx 일부</em></p>
<pre><code>&lt;Button
    style={{ marginBottom: 24 }}
    label=&quot;Login&quot;
    onPress={() =&gt; {
        login(password, username).then((v: any) =&gt; {
            if (v.status == 200) {
                AsyncStorage.setItem(&quot;AccessToken&quot;, v.data.token); // 토큰 저장
                navigation.navigate(&quot;Home&quot;);
            }
        });
    }}
/&gt;;</code></pre><p>AccessToken이라는 Key값과 토큰을 저장했다.
로그도 찍어봤는데 잘 넘어가고, 잘 담겨있는 것을 확인할 수 있었다.
마지막에 navigation까지 Home으로 넘겨주면 끝!</p>
<p>getItem은 SplashScreen 만드는 부분에서 사용해 볼 예정이다.</p>
<p><a href="https://0biglife.tistory.com/entry/%EC%86%8C%EC%85%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-token-%EC%A0%80%EC%9E%A51">https://0biglife.tistory.com/entry/%EC%86%8C%EC%85%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-token-%EC%A0%80%EC%9E%A51</a></p>
<p>&quot;리액트 네이티브를 다루는 기술&quot;을 참고하여 작성하였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error] Recoil 에러]]></title>
            <link>https://velog.io/@narinn-star/React-Native-Error-%EC%9D%BC%EC%A7%801</link>
            <guid>https://velog.io/@narinn-star/React-Native-Error-%EC%9D%BC%EC%A7%801</guid>
            <pubDate>Tue, 10 Jan 2023 10:58:13 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/narinn-star/post/5e489303-c4e5-4ed3-99f1-eb9b852997bc/image.png" alt=""></p>
<blockquote>
<p>React-Native _ Recoil 에러</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/narinn-star/post/6382650c-314c-4dbe-8d0c-7f3500e8f93a/image.png" alt="">
내가 하고자 했던 것은 Recoil 사용해서 auth를 저장하는 것 .. 
일단 이렇게 에러가 뜨면 어디서 에러가 났는지 알 수 가 없어서 웹 에러보다 더 어렵다 ㅠㅠ</p>
<p>하지만.. 로그를 읽으면 답이 나오겠지 라는 마인드로 하나하나 차근차근 해봅시다. </p>
<p><strong>Invalid hook call.</strong>
hook을 잘못썼단다. 나 아직 hook 쓴거 없는뎀
<strong>Hooks can only be called inside of the body of a function component.</strong>
훅은 함수형 컴포넌트 내에서만 사용되어야 한다..?</p>
<p><strong><em>전 Login/index.tsx</em></strong></p>
<pre><code>const [auth, setAuth] = useRecoilState&lt;IAuthTypes[]&gt;(authState);

const Login = () =&gt; {
    ...
    }</code></pre><p>바보였다..</p>
<p><strong><em>후 Login/index.tsx</em></strong></p>
<pre><code>const Login = () =&gt; {
    const [auth, setAuth] = useRecoilState&lt;IAuthTypes[]&gt;(authState);
    ...
    }</code></pre><hr>
<p>로그를 더 읽어 볼 필요도 없었다.
<img src="https://velog.velcdn.com/images/narinn-star/post/fa43a656-3066-435a-8a53-7000a9625bb7/image.png" alt="">
말끔하게 해결되었기 때문..</p>
<p>누군가 에러로 고생하고 있는 나에게 &#39;로그 읽으면 거의 대부분의 에러는 다 해결 가능하다&#39;라고 해주셨다.
긴 에러만 보면 겁에 질리곤 하는데 이제 하나씩 읽어볼 용기가 생기는 느낌..!!! </p>
<p>어쨌든 쉽게 해결!😅</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-Native] Navigation _ Stack Navigation]]></title>
            <link>https://velog.io/@narinn-star/React-Native-Navigation-Stack-Navigation</link>
            <guid>https://velog.io/@narinn-star/React-Native-Navigation-Stack-Navigation</guid>
            <pubDate>Sun, 08 Jan 2023 14:30:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Navigation을 사용해보자!</p>
</blockquote>
<p>React-Native에서는 화면 간 이동을 위해서 Navigation 라이브러리 설치가 필요하다.</p>
<h3 id="navigation-라이브러리-설치">Navigation 라이브러리 설치</h3>
<pre><code>yarn add @react-navigation/native</code></pre><h4 id="expo-사용">expo 사용</h4>
<pre><code>npx expo install react-native-screens react-native-safe-area-context</code></pre><h4 id="react-native-cli-사용">react-native-cli 사용</h4>
<pre><code>yarn add react-native-screens react-native-safe-area-context</code></pre><p>내비게이션 종류는 Stack, Tab, Drawer 등 여러가지가 많다.
그 중에 Stack Navigation을 사용할거다.</p>
<h3 id="stack-navigation-설치">Stack Navigation 설치</h3>
<pre><code>yarn add @react-navigation/native-stack</code></pre><p>준비 끝!😊</p>
<p>이제 React에서 BrowserRouter로 감싸줬듯, NavigationContainer로 App.tsx 전체를 감싸줄거다. </p>
<p>Stack을 사용할 기본 틀으로 createNativeStackNavigator의 Navigator를 사용한다. 
그 내부에 우리가 사용할 화면들을 Screen으로 띄우면 된다.</p>
<p>아래의 코드는 React-Native 공식 문서에 나와있는 코드를 참고한 것이다.</p>
<p>하나씩 차근차근 해보잣!</p>
<h4 id="apptsx"><em>App.tsx</em></h4>
<pre><code>import { Text, View } from &quot;react-native&quot;;
import React from &quot;react&quot;;
import { NavigationContainer } from &quot;@react-navigation/native&quot;;
import { createNativeStackNavigator } from &quot;@react-navigation/native-stack&quot;;

function HomeScreen() {
    return (
        &lt;View style={{ flex: 1, alignItems: &quot;center&quot;, justifyContent: &quot;center&quot; }}&gt;
            &lt;Text&gt;Home Screen&lt;/Text&gt;
        &lt;/View&gt;
    );
}

function DetailsScreen() {
    return (
        &lt;View style={{ flex: 1, alignItems: &quot;center&quot;, justifyContent: &quot;center&quot; }}&gt;
            &lt;Text&gt;Details Screen&lt;/Text&gt;
        &lt;/View&gt;
    );
}

const Stack = createNativeStackNavigator();

export default function App() {
    return (
        &lt;NavigationContainer&gt;
            &lt;Stack.Navigator&gt;
                &lt;Stack.Screen
                    name=&quot;Home&quot;
                    component={HomeScreen}
                    options={{ title: &quot;Overview&quot; }}
                /&gt;
                &lt;Stack.Screen name=&quot;Details&quot; component={DetailsScreen} /&gt;
            &lt;/Stack.Navigator&gt;
        &lt;/NavigationContainer&gt;
    );
}</code></pre><hr/>

<p>어떻게 전환되는지 알겠다.</p>
<p>이제 진짜 내가 하고자 했던..! 화면 간 전환을 해 볼 차례다😊
Home &lt;-&gt; Login 전환을 해볼거다.</p>
<p>TypeScript를 사용하고 있기 때문에, Props 까지 만들어줘야하는게 힘들었다. 
공식 문서를 하나씩 뜯어가면서 따라하는 겸 해서 참고를 많이 하고 있었는데, 문제는 공식 문서의 예시 코드는 죄다 js로 되어있다. ts의 type 지정은 구글링을 해야한다는 것!!</p>
<p>한참 구글링하다 결국 돌아온 곳은 공식 문서인데, 잘 뒤적뒤적 해보니</p>
<h4 id="type-지정-공식-문서--type-checking-with-typescript">type 지정 공식 문서 : <a href="https://reactnavigation.org/docs/typescript">Type checking with TypeScript</a></h4>
<p>세상에나 .. 공식 문서에 떡하니 나와있었다.
바로 고고싱😥</p>
<h3 id="paramlist-만들기">ParamList 만들기</h3>
<h4 id="rootstackparamlistindextsx"><em>RootStackParamList/index.tsx</em></h4>
<pre><code>export type RootStackParamList = {
    Home: undefined;
    Login: { name: string; userId: string };
};
</code></pre><p>이렇게 먼저 type을 지정해 둔다. <del>(이게 다였슴)</del></p>
<h3 id="app-home-login-수정하기">App, Home, Login 수정하기</h3>
<h4 id="apptsx-1"><em>App.tsx</em></h4>
<pre><code>import { StatusBar } from &quot;expo-status-bar&quot;;
import React from &quot;react&quot;;
import { NavigationContainer } from &quot;@react-navigation/native&quot;;
import { createNativeStackNavigator } from &quot;@react-navigation/native-stack&quot;;
import Login from &quot;./src/components/Login&quot;;
import Home from &quot;./src/components/Home&quot;;
import { RootStackParamList } from &quot;./src/components/types&quot;;

const Stack = createNativeStackNavigator&lt;RootStackParamList&gt;();

export default function App() {
    return (
        &lt;NavigationContainer&gt;
            &lt;Stack.Navigator initialRouteName=&quot;Home&quot;&gt;
                &lt;Stack.Screen
                    name=&quot;Home&quot;
                    component={Home}
                    options={{ title: &quot;Home&quot; }}
                /&gt;
                &lt;Stack.Screen
                    name=&quot;Login&quot;
                    component={Login}
                    initialParams={{ name: &quot;Login&quot;, userId: &quot;User&quot; }}
                    options={{ title: &quot;로그인&quot; }}
                /&gt;
            &lt;/Stack.Navigator&gt;
            &lt;StatusBar style=&quot;auto&quot; /&gt;
        &lt;/NavigationContainer&gt;
    );
}
</code></pre><hr/>

<h4 id="homeindextsx"><em>Home/index.tsx</em></h4>
<pre><code>import React from &quot;react&quot;;
import { View, Text } from &quot;react-native&quot;;
import Button from &quot;../Button&quot;;
import { NativeStackScreenProps } from &quot;@react-navigation/native-stack&quot;;
import { RootStackParamList } from &quot;../types&quot;;

type Props = NativeStackScreenProps&lt;RootStackParamList, &quot;Home&quot;&gt;;

const Home = ({ navigation, route }: Props) =&gt; {
    return (
        &lt;View style={{ flex: 1, alignItems: &quot;center&quot;, justifyContent: &quot;center&quot; }}&gt;
            &lt;Text&gt;Home Screen&lt;/Text&gt;
            &lt;Button
                label=&quot;Login&quot;
                style={{ backgroundColor: &quot;pink&quot;, width: &quot;50%&quot; }}
                onPress={() =&gt;
                    navigation.navigate(&quot;Login&quot;, { name: route.name, userId: &quot;User&quot; })
                }
            &gt;&lt;/Button&gt;
        &lt;/View&gt;
    );
};

export default Home;
</code></pre><hr/>

<h4 id="loginindextsx"><em>Login/index.tsx</em></h4>
<pre><code>import React from &quot;react&quot;;
import { View, Text } from &quot;react-native&quot;;
import { NativeStackScreenProps } from &quot;@react-navigation/native-stack&quot;;
import { RootStackParamList } from &quot;../types&quot;;

type Props = NativeStackScreenProps&lt;RootStackParamList, &quot;Login&quot;&gt;;

const Login = ({ route }: Props) =&gt; {
    const { name, userId } = route.params;
    return (
        &lt;View&gt;
            &lt;Text&gt;
                This is {userId} {&quot;&#39;&quot;}s Login Screen! {name}
            &lt;/Text&gt;
        &lt;/View&gt;
    );
};

export default Login;</code></pre><p>Login 에서 또 다른곳으로 넘어가고싶으면 navigation을 받아서 또 연결해주면 됨!</p>
<hr/>
<div align='center'><img src="https://velog.velcdn.com/images/narinn-star/post/90d1f06f-991f-408c-b2f7-e38a26ee3924/image.gif" width='200'></div>
성공..

<p>💙이제 나도 Login UI 넣을 수 있어요💙</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-Native] eslint, prettier 설정하기]]></title>
            <link>https://velog.io/@narinn-star/React-Native-eslint-prettier-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@narinn-star/React-Native-eslint-prettier-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 29 Dec 2022 10:17:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>eslint, prettier 설정하기</p>
</blockquote>
<p>여기저기 다 뒤져봐도 잘 모르겠기도 하고, eslint랑 prettier 설정 하고 나면 자꾸 conflict가 발생해서 실행조차 못하기도 했다.</p>
<p>계속해서 구글링도 해보고 이것저것 시도도 해보던 와중에, 
<a href="https://velog.io/@dvisign/%EB%B8%94%EB%A1%9C%EA%B7%B8-%ED%98%95%EC%8B%9D-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-%EA%B0%9C%EB%B0%9C%EA%B8%B0-2-%EC%B4%88%EA%B8%B0-%EC%85%8B%ED%8C%852">https://velog.io/@dvisign/%EB%B8%94%EB%A1%9C%EA%B7%B8-%ED%98%95%EC%8B%9D-%ED%8F%AC%ED%8A%B8%ED%8F%B4%EB%A6%AC%EC%98%A4-%EA%B0%9C%EB%B0%9C%EA%B8%B0-2-%EC%B4%88%EA%B8%B0-%EC%85%8B%ED%8C%852</a></p>
<p>react-native에서 설정하는건 아니지만 이대로 설정해서 실행 시키기 완료..!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-Native] Text 요소]]></title>
            <link>https://velog.io/@narinn-star/React-Native-Text-%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@narinn-star/React-Native-Text-%EC%9A%94%EC%86%8C</guid>
            <pubDate>Thu, 29 Dec 2022 08:30:40 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>React-Native로 화면에 원하는 Text 입력해보기</p>
</blockquote>
<p>일단 첫 시작으로 src 폴더 안에 New_App 파일을 생성해주고 뷰 안에 텍스트를 넣어 가운데에 원하는 문자를 출력해보려 한다.
<img src="https://velog.velcdn.com/images/narinn-star/post/f2e4b4e2-ada8-49f6-8a02-78a4a6a82f8f/image.png" alt=""></p>
<p>기존에 있는 App.tsx 파일은 그대로 둬도 상관 없으니, 그냥 새로 만들면 된다.</p>
<p>안에 어떤 코드를 작성해도 기본 App.tsx가 실행되고 있으니 Emulator에는 아무것도 뜨지 않는 것이 맞다.</p>
<p>우선 빈 화면으로 보이게 하기 전에, New_App을 갖다 써야하니까 틀이라도 만들어보자.</p>
<p><img src="https://velog.velcdn.com/images/narinn-star/post/85bd32fe-0208-49af-a2de-a18c6c3bb72f/image.png" alt=""></p>
<p>이렇게 리액트에서와 동일하게 함수형으로 만들고, export까지 해주면 틀 완성!</p>
<p>그냥 안에 Hello, World! 와 같은.. 원하는 문자를 보여줄 것이기 때문에 이정도로 하고, 이 빈 화면을 우리 Emulator에 보여줄 것이다.</p>
<p>index.js파일로 이동해서 기존의 코드에 있는 App만 New_App으로 바꿔줄거다.
<img src="https://velog.velcdn.com/images/narinn-star/post/0f8d63d8-5d0d-4143-8b42-3b0c22271bfd/image.png" alt=""> 연결만 해주면
<img src="https://velog.velcdn.com/images/narinn-star/post/175f2b68-b02c-498c-8780-5feae33435ac/image.png" alt="">
뿅..!
당연히 View로 감싸뒀으니 아무것도 안나오는 게 맞음!</p>
<p>이제 진짜 첫걸음.. Text로 정 가운데에 아무 문자열을 넣을거다.
<img src="https://velog.velcdn.com/images/narinn-star/post/be7c9f81-2db6-478d-8eb0-a4c4d08c4d02/image.png" alt=""> 이렇게 View 안에 Text로 &#39;Hello, World!&#39;라는 문자열을 출력해보려 한다.<img src="https://velog.velcdn.com/images/narinn-star/post/d5cb1cf8-f0e5-4fc5-92d1-9a60c210b6a7/image.png" alt=""> 매우 간단..! </p>
<blockquote>
<p>Text 요소의 Props들 살펴보기</p>
</blockquote>
<p>한동안 RN공부 그리고 지금 하고 있는 사이드 프로젝트를 진행하면서 Text 요소를 사용할 때 직접 사용해본 props들을 여기에 기록해볼 예정이다.</p>
<h3 id="onpress">onPress</h3>
<p>onClick이랑 똑같다고 보면 될 듯 하다. 
간단하게 글자(Text)를 누르면 Text가 바뀌도록 작성해보았다.<img src="https://velog.velcdn.com/images/narinn-star/post/196117a5-58af-4b8d-8795-5351934699b4/image.png" alt=""><img src="https://velog.velcdn.com/images/narinn-star/post/7ac5e9aa-c707-4ace-83c8-11e72cd6a089/image.png" alt="">
글자부분을 누르면 저렇게 바뀐다..는 정도!</p>
<p>살펴보니 줄 수 제한도 할 수 있고, 여러가지 할 수 있는게 많은 것 같은데 그런 것들은 필요할 때 쓰고 기록을 남기려 한다..!!</p>
<p><a href="https://itskeleton.tistory.com/entry/React-Native-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%ED%85%8D%EC%8A%A4%ED%8A%B8-Text-%EC%9A%94%EC%86%8C">https://itskeleton.tistory.com/entry/React-Native-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%ED%85%8D%EC%8A%A4%ED%8A%B8-Text-%EC%9A%94%EC%86%8C</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-Native] 설치 및 프로젝트 생성]]></title>
            <link>https://velog.io/@narinn-star/React-Native-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@narinn-star/React-Native-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Fri, 23 Dec 2022 13:48:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="react-native-환경-설정하기">React-Native 환경 설정하기</h3>
</blockquote>
<ol>
<li>jdk 11버전 설치 및 환경설정</li>
<li>안드로이드 스튜디오 설치 및 환경설정</li>
<li>Node.js 설치</li>
<li>Python 설치</li>
<li>프로젝트 생성</li>
</ol>
<h4 id="1-jdk-11버전-설치-및-환경설정">1. jdk 11버전 설치 및 환경설정</h4>
<p>오라클에 접속해서 로그인 후 11버전을 다운받으면 된다.
<a href="https://www.oracle.com/kr/java/technologies/downloads/#java11-windows">https://www.oracle.com/kr/java/technologies/downloads/#java11-windows</a>
<img src="https://velog.velcdn.com/images/narinn-star/post/736c9c9e-1238-42b4-99d9-0f4a144ac6a4/image.png" alt="">
<img src="https://velog.velcdn.com/images/narinn-star/post/f76ff6aa-84fe-4759-9daf-971c4cffde82/image.png" alt="">
그리고나서 환경 설정을 해주어야 하기 때문에 자바 경로로 이동해서 경로복사!
<img src="https://velog.velcdn.com/images/narinn-star/post/ffde1a75-d5dc-4c85-89ca-4cf3a67c60cf/image.png" alt="">
시스템 속성 &gt; 환경 변수 &gt; 새로 만들기
<img src="https://velog.velcdn.com/images/narinn-star/post/074bfbad-cc7a-470d-9fdc-e4c68b800f79/image.png" alt="">
여기서 이제 아까 복사한 경로를 변수 값에 입력한다. 
<img src="https://velog.velcdn.com/images/narinn-star/post/c989fa71-3d45-4eb7-8fac-9ef270029410/image.png" alt="">
환경변수 &gt; 시스템 변수 &gt; Path &gt; &#39;%환경변수 명%bin&#39; 입력 후
<img src="https://velog.velcdn.com/images/narinn-star/post/a24e9e98-b0e7-4e3b-9d0a-30845393ba3b/image.png" alt="">
cmd 창에서 자바 jdk 설치를 확인해준다.
<img src="https://velog.velcdn.com/images/narinn-star/post/04e0eac5-c210-4a68-ae60-8c60c055e8ff/image.png" alt="">
뭐 대충.. 이렇게 뜨면 됨.
근데 설치 했더니 .. 원래 16버전이 있었는데 다른 설치방법들 슥슥 찾아보니 아무버전이든 상관 없는 듯 ..? 아무튼 java -version 까지 확인해주면 된다.
<img src="https://velog.velcdn.com/images/narinn-star/post/ad976a27-edc5-4c6d-bf16-22504ce61f11/image.png" alt=""></p>
<h4 id="2-안드로이드-스튜디오-설치-및-환경설정">2. 안드로이드 스튜디오 설치 및 환경설정</h4>
<p>예전에 안드로이드 스튜디오도 설치 했다가 지웠기 때문에.. 다시 설치해줘야 한다..
<a href="https://developer.android.com/studio?hl=ko">https://developer.android.com/studio?hl=ko</a>
들어가서 다운로드 하면 됨
<img src="https://velog.velcdn.com/images/narinn-star/post/33b0b233-366f-41ad-94cd-4fa72f7993a8/image.png" alt="">
그냥 설치하면 된다. 그냥 계속 Next 누르면 됨.
<img src="https://velog.velcdn.com/images/narinn-star/post/0458f828-0ee6-4006-b1dd-0d952e25ccfc/image.png" alt="">
나는 예전에 썼어서 그런지.. 그 파일도 없는데 복구도 해준다.. 
Configure? 새로 다운 받은 사람들은 오른쪽 아래에서 찾을 수 있을 건데, 나는 눈씻고 찾아도 없어서 그냥 Tool에 있는 SDK Manager 바로 열어줬다.
<img src="https://velog.velcdn.com/images/narinn-star/post/6cab5590-d1ce-4b23-bd6c-f5e67c403250/image.png" alt="">
Show Package Details 하면 세부사항 볼 수 있으니까 필요한 것만 SDK Platforms와 SDK Tools에서 체크해주면 된다.
아까 jdk 설치할 때 했던 환경변수 설정 한 번 더 해줘야하니까 Location 복사해두기!
설치하는데 <del>조금</del> 오래 걸림...^^</p>
<p>위에서 했던 환경변수 설정 하는거 그대로 가서 <img src="https://velog.velcdn.com/images/narinn-star/post/8798eeb7-d160-43cd-9775-8ff7e0923323/image.png" alt="">
넣어주고, 이번엔 Path에 platform-tools 경로 추가해야하기 때문에 다시 내PC로 가서 경로 따온다.. (이제 슬 지침)
<img src="https://velog.velcdn.com/images/narinn-star/post/74ad65f4-f2d7-4135-85ec-43e67934b284/image.png" alt=""><img src="https://velog.velcdn.com/images/narinn-star/post/f7441928-fbab-4a19-a225-1f9642602c0f/image.png" alt=""></p>
<h4 id="3-nodejs-설치">3. Node.js 설치</h4>
<p>이제 Node를 설치해줍시다.
안정화된 LTS를 설치해주는게 좋다네요.. 좋다면 좋은거 나도 LTS 다시 설치했음
<img src="https://velog.velcdn.com/images/narinn-star/post/73453857-722b-4ccd-9db7-30a107c49b65/image.png" alt=""> <img src="https://velog.velcdn.com/images/narinn-star/post/fc8ee523-cf55-497e-8d1a-2cd1cbea6aeb/image.png" alt=""></p>
<p>요 사이에 갑자기 PowerShell 떠서 뭔가 샤샤샥 계속 글자가 내려가는데.. 뭔지 몰라서 그냥 한참 기다리다 껐음.. 설마 설마 여기서 무슨 문제가 생기는건 아니겠지 ㅠㅠ</p>
<h4 id="4-python-설치">4. Python 설치</h4>
<p><a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a>
<img src="https://velog.velcdn.com/images/narinn-star/post/896773a3-e44b-44b2-8bb6-84e7bb08d6ac/image.png" alt="">
난 설치되어 있으니 패스..! 저기 Download Python 3.xx 누르면 바로 설치 소소속 된다.</p>
<h4 id="5-프로젝트-생성">5. 프로젝트 생성</h4>
<p>터미널 창에서 작업할 공간으로 이동한 후에, 
<strong>npx react-native init &#39;프로젝트 이름&#39;</strong> 입력하면 
<img src="https://velog.velcdn.com/images/narinn-star/post/dbc91ed2-966b-457a-ad1c-86ca7074b87d/image.png" alt=""><img src="https://velog.velcdn.com/images/narinn-star/post/8a685595-800c-4646-a2e3-0c407d62bb5a/image.png" alt="">
이런 <del>슬데없이 큰 그림</del> 이쁜 리액트 로고가 뜨면서 템플릿이 다운로드 된다.</p>
<h4 id="6-성공">6. 성공!!!!</h4>
<p><img src="https://velog.velcdn.com/images/narinn-star/post/164513d8-65a3-41e0-a98b-76130160fe0a/image.png" alt=""></p>
<p>처음 써보는 글인데.. 이렇게 힘든걸로 시작하다니ㅠㅠ
React 환경 설정은 몇번이고 해도 오래걸일 일이 잘 없었는데 RN은 좀 다르다.. 
구글 뒤져보면서 이것저것 참고해보고 했는데.. 아무튼 무사히 성공했다,,!</p>
<p>갑자기 앱 개발 제안이 나와서 급하게 환경 구축해봤는데 하나씩 글도 써보려구 한다..!</p>
<p>앞으로 잘 부탁해 나 자신.. ❤</p>
]]></description>
        </item>
    </channel>
</rss>