<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Inkyung.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 14 Dec 2022 00:34:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Inkyung.log</title>
            <url>https://velog.velcdn.com/images/chacha_w/profile/279c2582-f616-4514-9d81-d9005e7999af/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Inkyung.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/chacha_w" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[#12. React - 달력 화면 만들기]]></title>
            <link>https://velog.io/@chacha_w/12.-React-%EB%8B%AC%EB%A0%A5-%ED%99%94%EB%A9%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@chacha_w/12.-React-%EB%8B%AC%EB%A0%A5-%ED%99%94%EB%A9%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 14 Dec 2022 00:34:07 GMT</pubDate>
            <description><![CDATA[<h2 id="📅-달력-화면-만들기">📅 달력 화면 만들기</h2>
<h3 id="필요한-라이브러리">필요한 라이브러리</h3>
<p>기말 과제로 달력 조회 화면을 만들기로 했다!</p>
<blockquote>
<p><a href="https://wix.github.io/react-native-calendars/docs/intro">https://wix.github.io/react-native-calendars/docs/intro</a></p>
</blockquote>
<p>react-native-calendars 라는 라이브러리가 있어서 가져다 쓰기로 하고 우선 필요한 것들 설치
date-fns는 날짜를 표시하기 위해 필요한 라이브러리이다. format을 import해와야하기 때문!</p>
<ol>
<li><code>npm install --save react-native-calendars</code></li>
<li><code>npm install date-fns</code><br>

</li>
</ol>
<h3 id="기본-structure">기본 structure</h3>
<p>기본적인 화면은 이렇게 구성한다</p>
<pre><code class="language-javaScript">import React from &quot;react&quot;;
import { View } from &quot;react-native&quot;;
import { Calendar } from &quot;react-native-calendars&quot;;

const CalendarView = (props) =&gt; {


  return (
    &lt;View style = {{marginTop: 100}}&gt;
      &lt;Calendar/&gt;
    &lt;/View&gt;
  )
}

export default CalendarView;</code></pre>
<p>그리고 MainTabNavigator에도 스크린 추가해서 연결해주면</p>
<pre><code class="language-javaScript">import CalendarView from &#39;../screens/CalenderView&#39;;

 &lt;Nav.Screen name = &quot;Calendar&quot; component={CalendarView} options={{title: &#39;Calendar&#39;}}/&gt;
</code></pre>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/c1edd165-ac4a-4ac2-937c-48258c1211ef/image.jpeg" alt=""></p>
<p>✨✨✨짜잔✨✨✨
새로운 탭이 생기면서 화면 전환이 된다!!
<br></p>
<h3 id="일정-추가">일정 추가</h3>
<p>일정이 있거나 특별한 날에 마킹을 추가하고 theme의 Props를 통해 색을 바꿀 수 있다</p>
<ul>
<li>시험이 있는 날과 내 생일에 추가를 해보기</li>
</ul>
<pre><code class="language-javaScript![](https://velog.velcdn.com/images/chacha_w/post/c41977fb-5674-44ba-9379-2b090e63fb8c/image.jpg)">
const markedDates = {
    &#39;2022-12-01&#39;: { selected: true },  // 내 생일ㅎㅎ
    &#39;2022-12-15&#39;: { marked: true },
    &#39;2022-12-16&#39;: { marked: true },
    &#39;2022-12-19&#39;: { marked: true }
  }
  return (
    &lt;Calendar 
      style={styles.calendar} 
      markedDates={markedDates}
      theme={{
        selectedDayBackgroundColor: &#39;red&#39;,
        arrowColor: &#39;blue&#39;,
        dotColor: &#39;green&#39;,
        todayTextColor: &#39;yellow&#39;,
      }} /&gt;
  );</code></pre>
<h3 id="onpress---selectedday-연결">onPress - selectedDay 연결</h3>
<p>선택된 날짜에 마킹 표시를 하고 화면에 표시해보기
먼저 const로 선언을 해준다</p>
<pre><code class="language-javaScript">
const [selectedDate, setSelectedDate] = useState(format(new Date(), &quot;yyyy-MM-dd&quot;));

const markedSelectedDates = {
    ...markedDates,       // 기존의 markedDate
    [selectedDate]: {
      selected: true,
      marked: markedDates[selectedDate]?.marked,
    }
  }</code></pre>
<p>그리고 view에 onDayPress =&gt; 로그 찍기, 날짜 선택을 하면 이렇게 나온다</p>
<pre><code class="language-javaScript">&lt;View&gt;
      &lt;Calendar style={styles.calendar} 
        markedDates={markedSelectedDates}
        theme={{
          selectedDayBackgroundColor: &#39;red&#39;,
          arrowColor: &#39;#009688&#39;,
          dotColor: &#39;#009688&#39;,
          todayTextColor: &#39;#00adf5&#39;
        }} 
        onDayPress={(day) =&gt; {
          console.log(&#39;selected day&#39;, day),       // 선택된 날짜 log 찍기
          setSelectedDate(day.dateString)        // 선택된 날짜 marked
        }} 
      /&gt;
      &lt;Text style={styles.text}&gt;{ selectedDate } &lt;/Text&gt;        
    &lt;/View&gt;
</code></pre>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/8bd8c133-f914-4625-9bdc-f6a9b8becdb0/image.png" alt="">
<img src="https://velog.velcdn.com/images/chacha_w/post/1c98a20f-684c-4fee-ad28-c155c589084a/image.jpeg" alt=""></p>
<p>📌 기능들 활용해서 다른 것들도 추가해보기!</p>
<ul>
<li>현재 날짜/시간 표시 - 시간은 <strong>_실시간_으로 동적 연결!!</strong></li>
<li>선택된 날짜 표시</li>
<li>중요 일정 alert</li>
</ul>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/48c4cdc0-f9c4-4aac-bf76-a20328267f84/image.jpg" alt=""></p>
<br>

<h2 id="🔗-외부-링크-기능">🔗 외부 링크 기능</h2>
<p>우선 홈 화면에 버튼을 새로 만들고 이 페이지로 이동하도록 연결해보았다</p>
<blockquote>
<p><a href="https://docs.expo.dev/guides/linking/">https://docs.expo.dev/guides/linking/</a></p>
</blockquote>
<ol>
<li><code>expo install expo-linking</code></li>
</ol>
<p><del>expo-linking 이라는 기능을 활용하기 위해 위 모듈 설치</del></p>
<ol start="2">
<li><code>npm install @react-navigation/stack</code> 재설치</li>
</ol>
<p><del>그런데 기존의 navigation이랑 충돌이 나는건지.. 자꾸 오류가 나서     stack navigation 다시 설치하고 해주니 잘 된다이유가 뭘까...🤔</del></p>
<p>그리고 expo guide를 보면 import 하고 사용하라는데 <code>import * as Linking from &#39;expo-linking&#39;;</code>
이미 expo-linking을 설치해서 그런가 syntax 오류가 난다</p>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/4b07bc01-52bf-4b66-84b8-f808d53d5dee/image.jpg" alt=""></p>
<p><del>아마 둘 중 하나일 듯 싶다...</del></p>
<p><del>- expol-linking 설치, stack navigation 재설치</del>
<del>- import 해서 바로 가져다 쓰기</del></p>
<blockquote>
<p><em>share를 import 하고 쓰니 환경 설정 없이도 url 이동이 된다!!</em></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/59c104b9-3e61-467d-afc0-4b30583a15d1/image.jpg" alt=""></p>
<p>어쨌든 블로그 화면으로 잘 이동한다<del>!</del>!~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#11. Youtube]]></title>
            <link>https://velog.io/@chacha_w/11.-Youtube</link>
            <guid>https://velog.io/@chacha_w/11.-Youtube</guid>
            <pubDate>Fri, 09 Dec 2022 08:52:01 GMT</pubDate>
            <description><![CDATA[<h3 id="react-native-youtube-iframe">React Native Youtube iframe</h3>
<br>

<ol>
<li>react-native-webview 설치
<code>npm install --save react-native-webview</code><blockquote>
<p><a href="https://www.npmjs.com/package/react-native-webview">react-native-webview</a></p>
</blockquote>
</li>
</ol>
<ol start="2">
<li>iframe 설치
<code>npm install react-native-youtube-iframe</code> → 안됨..
<code>npm i react-native-youtube-iframe</code> → 이걸로 실행<blockquote>
<p><a href="https://www.google.com/url?sa=j&amp;url=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Freact-native-youtube-iframe&amp;uct=1628149581&amp;usg=HA8CXgLuCbgkLRbHyBIuyBIwsjY.&amp;source=meet">react-native-youtube-iframe</a></p>
</blockquote>
</li>
</ol>
<blockquote>
</blockquote>
<p><a href="https://lonelycpp.github.io/react-native-youtube-iframe/basic-usage">Basic Usage | React Native Youtube iframe</a></p>
<p>basic usage, props 에서 사용법 확인
<br></p>
<ul>
<li>TextInput</li>
</ul>
<p><a href="https://reactnative.dev/docs/textinput">TextInput · React Native</a></p>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/ead7d1ac-2c62-4531-8db4-f75853cc7a31/image.PNG" alt=""></p>
<p>이렇게 videoId값으로 연결해서 유튜브 재생 가능!
<br></p>
<p>📌 Google Cloud - API 서비스</p>
<blockquote>
<p><a href="https://console.cloud.google.com/getting-started?pli=1">Google Cloud</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[#12. DB]]></title>
            <link>https://velog.io/@chacha_w/12.-DB</link>
            <guid>https://velog.io/@chacha_w/12.-DB</guid>
            <pubDate>Mon, 05 Dec 2022 05:02:28 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>h2 console
<code>runtimeOnly &#39;com.h2database:h2&#39;</code> : 테스트용</p>
</li>
<li><p>app.properties</p>
</li>
</ul>
<pre><code class="language-java">spring.h2.console.enabled=true
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true</code></pre>
<p><a href="http://localhost:8080/h2-console">http://localhost:8080/h2-console</a> → DB로 접근</p>
<p>로그 중 jdbc url (오늘은 jdbc:h2:mem:43be176b-c8a0-4345-bf9e-6434ddaff4e4) 입력하고 커넥트</p>
<p>controller랑 request 사이에서 연결해주는  service!</p>
<p>domain - repository 연결</p>
<p>Member &amp; dto.PostUserRequest</p>
<p>Rest API - CRUD </p>
<p>modelmapper → dependencieds에 추가, ‘@Bean에 선언</p>
<pre><code class="language-kotlin">Test PUT OBJECT
PostUserRequest(id=3, userId=12345678, name=홍길동, [email=aaa@hufs.ac.kr](mailto:email=aaa@hufs.ac.kr), address=hufs, password=999, phoneNumber=010-1234-9999)
Hibernate:
select
member0_.id as id1_0_,
member0_.address as address2_0_,
member0_.email as email3_0_,
member0_.name as name4_0_,
member0_.password as password5_0_,
member0_.phone_number as phone_nu6_0_,
member0_.user_id as user_id7_0_
from
users member0_
where
member0_.user_id=?
and member0_.email=?
and member0_.name=?
Hibernate:
update
users
set
address=?,
email=?,
name=?,
password=?,
phone_number=?,
user_id=?
where
id=?</code></pre>
<p>어려운 db의 세계…</p>
<p>Swagger에서 추가/삭제 가능
Usercontroller의 register(등록), update(수정), delete(삭제)<img src="https://velog.velcdn.com/images/chacha_w/post/893c70d8-5bb4-4533-961f-3024948499cc/image.png" alt="">
swagger에서 사용자 register 하고 USERS - Run 해보면</p>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/dc3fc4fd-3872-47cd-bdac-1e5b1d6c8896/image.png" alt="">
짜잔</p>
<p>다른 기능들도 확인할 수 있음</p>
<p>AWS는 1년만 무료, Oracle DB는 무료!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#11. DTO]]></title>
            <link>https://velog.io/@chacha_w/11.-DTO</link>
            <guid>https://velog.io/@chacha_w/11.-DTO</guid>
            <pubDate>Mon, 05 Dec 2022 04:59:34 GMT</pubDate>
            <description><![CDATA[<ul>
<li>보안 문제로 api key 파일 삭제하고 git 에 push → clone 받으면 다시 추가해줘야 함<ul>
<li>resources에 <code>[application-api-key.properties](http://application-api-key.properties)</code> 파일 생성</li>
</ul>
</li>
</ul>
<h2 id="naver">Naver</h2>
<p>naver client - search controller</p>
<pre><code class="language-JavaScript">{
    &quot;lastBuildDate&quot;:&quot;Thu, 24 Nov 2022 09:48:06 +0900&quot;,
    &quot;total&quot;:1,
    &quot;start&quot;:1,
    &quot;display&quot;:1,
    &quot;items&quot;:[                      // 검색된 데이터
        {
            &quot;title&quot;:&quot;롯데호텔서울 도림&quot;,
            &quot;link&quot;:&quot;https:\/\/www.lottehotel.com\/seoul-hotel\/ko\/dining\/restaurant-toh-lim.html&quot;,
            &quot;category&quot;:&quot;중식&gt;중식당&quot;,
            &quot;description&quot;:&quot;&quot;,
            &quot;telephone&quot;:&quot;&quot;,
            &quot;address&quot;:&quot;서울특별시 중구 소공동 1&quot;,
            &quot;roadAddress&quot;:&quot;서울특별시 중구 을지로 30&quot;,
            &quot;mapx&quot;:&quot;310159&quot;,
            &quot;mapy&quot;:&quot;551942&quot;
        }
    ]
}</code></pre>
<p>위에 통째로 받아온것 중에 원하는 부분 Parsing 해서 가져오기!</p>
<ol>
<li>naver-dto-SerchLocalRes 생성</li>
<li>SearchRequestDto 생성</li>
<li>NaverClient에 String → SearchLocalRes</li>
<li>SearchService에 String → SearchRequestDto
하고 return new SearchRequestDto();</li>
<li>SearchController에 String → SearchRequestDto</li>
</ol>
<ol>
<li>weather - dto - WeatherDtoRes</li>
<li>dto - WeatherRequestDto</li>
<li>WeatherClient에 String → WeatherDtoRes</li>
<li>WeatherService.  String → WeatherRequestDto</li>
<li>WeatherController String → WeatherRequestDto</li>
</ol>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/bd5cd245-ec49-40fe-bbf2-04ea9c3ae9e2/image.png" alt=""></p>
<h2 id="weather">Weather</h2>
<ul>
<li>Weather는 좀 더 복잡…</li>
</ul>
<pre><code class="language-jsx">{
    &quot;coord&quot;: {
    &quot;lon&quot;: 126.9778,
    &quot;lat&quot;: 37.5683
  },
  &quot;weather&quot;: [                     // 리스트
    {
      &quot;id&quot;: 803,
      &quot;main&quot;: &quot;Clouds&quot;,
      &quot;description&quot;: &quot;broken clouds&quot;,
      &quot;icon&quot;: &quot;04d&quot;
    }
  ],
  &quot;base&quot;: &quot;stations&quot;,
  &quot;main&quot;: {
    &quot;temp&quot;: 279.77,
    &quot;feels_like&quot;: 279.77,
    &quot;temp_min&quot;: 278.81,
    &quot;temp_max&quot;: 282.84,
    &quot;pressure&quot;: 1021,
    &quot;humidity&quot;: 76
  },
  &quot;visibility&quot;: 8000,
  &quot;wind&quot;: {
    &quot;speed&quot;: 0.51,
    &quot;deg&quot;: 330
  },
  &quot;clouds&quot;: {
    &quot;all&quot;: 75
  },
  &quot;dt&quot;: 1669250853,
  &quot;sys&quot;: {
    &quot;type&quot;: 1,
    &quot;id&quot;: 8105,
    &quot;country&quot;: &quot;KR&quot;,
    &quot;sunrise&quot;: 1669242053,
    &quot;sunset&quot;: 1669277805
  },
  &quot;timezone&quot;: 32400,
  &quot;id&quot;: 1835848,
  &quot;name&quot;: &quot;Seoul&quot;,
  &quot;cod&quot;: 200
}</code></pre>
<p>안에 class 6개, 리스트 1개 있음</p>
<ul>
<li><p>해보기❗️❗️❗️ (화요일까지)</p>
</li>
<li><p>buildgradle dependencies에 <code>runtimeOnly &#39;com.h2database:h2&#39;</code> ,</p>
<p>  <code>implementation &#39;org.springframework.boot:spring-boot-starter-data-jpa’</code> 추가</p>
</li>
<li><p>properties에 <code>spring.h2.console.enabled=true</code> 추가</p>
</li>
</ul>
<p><a href="http://localhost:8080/h2-console">http://localhost:8080/h2-console</a></p>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/3fde6fa2-c79b-416c-bc52-47b87234b20e/image.png" alt=""></p>
<p>info로 돌려서 jdbc:h2:mem:28a555fc-e8ef-46c1-a351-22aa73322769 - 연결</p>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/f61884a6-293b-4a61-96a2-38fc0316a33a/image.png" alt=""></p>
<pre><code class="language-java"> public String getCurrentWeatherWithGeo(Double lat, Double lon) {
        var weatherReq = new WeatherGeoReq();
        weatherReq.setLat(lat);
        weatherReq.setLon(lon);

        var weatherRes = weatherClient.getCurrentWeather(weatherReq);

        return weatherRes;    // 여기 해결 안돼서 잘라놓음.. weather service

    } 
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[#10. Naver Service]]></title>
            <link>https://velog.io/@chacha_w/10.-Naver-Service</link>
            <guid>https://velog.io/@chacha_w/10.-Naver-Service</guid>
            <pubDate>Mon, 05 Dec 2022 04:55:20 GMT</pubDate>
            <description><![CDATA[<ul>
<li>dto는 일종의 데이터 뭉치</li>
</ul>
<p>리소스 폴더에 api key 파일 추가</p>
<h3 id="google-earth">Google Earth</h3>
<p>지리 정보로 조회! - WeatherGeoReq</p>
<blockquote>
<p><a href="https://earth.google.com/web/@0,-6.8828,0a,22251752.77375655d,35y,0h,0t,0r">Google Earth</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/07b1bd6e-97c9-49f5-84f5-21c5f8ad79f7/image.png" alt=""></p>
<p>구글어스에서 latitude, longitude 가져와서 지리 정보로 조회!</p>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/75191609-c44d-4021-990d-eead80c7bb02/image.png" alt=""></p>
<ol>
<li>WeatherReq → private String query 삭제</li>
<li>WeatherCityReq</li>
<li>WeatherGeoReq</li>
</ol>
<h3 id="네이버-개발자-센터">네이버 개발자 센터</h3>
<blockquote>
<p><a href="https://developers.naver.com/docs/common/openapiguide/appregister.md">https://developers.naver.com/docs/common/openapiguide/appregister.md</a></p>
</blockquote>
<ul>
<li>어플리케이션 등록 → client id, client secret 나옴</li>
</ul>
<pre><code class="language-kotlin">1. app properties, key 설정
2. Naver Client 추가
3. **SearchLocalReq DTO 추가**
4. naver client - **searchLocal 추가, 구현**
5. searchLocal - **클라이언 아이디 / 클라이언트 시크릿 추가** 
6. **SearchLocalReq - toMultiValueMap 구현**
7. **SearchService 구현**
8. **SearchController 구현**</code></pre>
<h4 id="설명">설명</h4>
<p>네이버 검색의 블로그 검색 결과를 XML 형식 또는 JSON 형식으로 반환합니다.</p>
<h4 id="요청-url">요청 URL</h4>
<table>
<thead>
<tr>
<th>요청 URL</th>
<th>결과값 반환 형식</th>
</tr>
</thead>
<tbody><tr>
<td><a href="https://openapi.naver.com/v1/search/blog.xml">https://openapi.naver.com/v1/search/blog.xml</a></td>
<td>XML</td>
</tr>
<tr>
<td><a href="https://openapi.naver.com/v1/search/blog.json">https://openapi.naver.com/v1/search/blog.json</a></td>
<td>JSON</td>
</tr>
</tbody></table>
<h4 id="프로토콜">프로토콜</h4>
<p>HTTPS</p>
<h4 id="http-메서드">HTTP 메서드</h4>
<p>GET</p>
<h4 id="파라미터">파라미터</h4>
<p>파라미터를 쿼리 스트링 형식으로 전달합니다.</p>
<table>
<thead>
<tr>
<th>파라미터</th>
<th>타입</th>
<th>필수 여부</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>query</td>
<td>String</td>
<td>Y</td>
<td>검색어. UTF-8로 인코딩되어야 합니다.</td>
</tr>
<tr>
<td>display</td>
<td>Integer</td>
<td>N</td>
<td>한 번에 표시할 검색 결과 개수(기본값: 10, 최댓값: 100)</td>
</tr>
<tr>
<td>start</td>
<td>Integer</td>
<td>N</td>
<td>검색 시작 위치(기본값: 1, 최댓값: 1000)</td>
</tr>
<tr>
<td>sort</td>
<td>String</td>
<td>N</td>
<td>검색 결과 정렬 방법- sim: 정확도순으로 내림차순 정렬(기본값)- date: 날짜순으로 내림차순 정렬</td>
</tr>
</tbody></table>
<h4 id="참고-사항">참고 사항</h4>
<p>API를 요청할 때 다음 예와 같이 HTTP 요청 헤더에 <strong><a href="https://developers.naver.com/docs/common/openapiguide/appregister.md#%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%95%84%EC%9D%B4%EB%94%94%EC%99%80-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%8B%9C%ED%81%AC%EB%A6%BF-%ED%99%95%EC%9D%B8">클라이언트 아이디와 클라이언트 시크릿</a></strong>을 추가해야 합니다.</p>
<pre><code>&gt; GET /v1/search/blog.xml?query=%EB%A6%AC%EB%B7%B0&amp;display=10&amp;start=1&amp;sort=sim HTTP/1.1
&gt; Host: openapi.naver.com
&gt; User-Agent: curl/7.49.1
&gt; Accept: */*
&gt; X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 클라이언트 아이디 값}
&gt; X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 클라이언트 시크릿 값}
&gt;</code></pre><h4 id="요청-예">요청 예</h4>
<pre><code>curl  &quot;https://openapi.naver.com/v1/search/blog.xml?query=%EB%A6%AC%EB%B7%B0&amp;display=10&amp;start=1&amp;sort=sim&quot; \
    -H &quot;X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 클라이언트 아이디 값}&quot; \
    -H &quot;X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 클라이언트 시크릿 값}&quot; -v</code></pre><p>swagger에서 search controller 확인!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#10. Weather UI]]></title>
            <link>https://velog.io/@chacha_w/TIL-Weather-UI</link>
            <guid>https://velog.io/@chacha_w/TIL-Weather-UI</guid>
            <pubDate>Mon, 05 Dec 2022 03:31:26 GMT</pubDate>
            <description><![CDATA[<h3 id="json">JSON</h3>
<ul>
<li><p>“key” : “value” 의 페어
  <code>.main.feels_like</code>.  이런 식으로 값 찾아 들어감</p>
</li>
<li><p>얘는 배열 형태, weather[index] 로 접근</p>
</li>
</ul>
<pre><code class="language-JavaScript">&quot;weather&quot;: [
    {
      &quot;description&quot;: &quot;clear sky&quot;,
      &quot;icon&quot;: &quot;01d&quot;,
      &quot;id&quot;: 800,
      &quot;main&quot;: &quot;Clear&quot;
    }
  ],</code></pre>
<p>main - temperature, weather - main 끄집어내기!</p>
<p>weather.js에 추가</p>
<pre><code class="language-jsx">console.log(&quot;temperature : &quot; + data.main.temp);
console.log(&quot;weather : &quot; + data.weather[0].main);</code></pre>
<p>온도 단위 바꾸기 &amp;units=metric</p>
<pre><code class="language-javascript">https://api.openweathermap.org/data/2.5/weather?lat=${latitude}&amp;lon=${longitude}&amp;appid=${REACT_APP_WEATHER_KEY}&amp;units=metric</code></pre>
<p>화면 연결</p>
<pre><code class="language-javascript">render () {       // 화면 UI
    return (
      &lt;&gt;
        &lt;Text&gt; 날씨 &lt;/Text&gt;
        &lt;Text&gt; 온도 &lt;/Text&gt;
      &lt;/&gt;
    );
  }</code></pre>
<p><code>this.setState({cond : data.weather[0].main, temp : data.main.temp});</code></p>
<pre><code class="language-jsx">render () {       // 화면 UI

    const {cond,temp} = this.state;           // 위에서 설정한 cond,temp 가져오기
    return (
      &lt;&gt;
        &lt;Text&gt; {temp} &lt;/Text&gt;
        &lt;Text&gt; {cond} &lt;/Text&gt;
      &lt;/&gt;
    );
  }</code></pre>
<blockquote>
<p><a href="https://openweathermap.org/weather-conditions">Weather Conditions</a></p>
</blockquote>
<p>icon 모음</p>
<blockquote>
<p><a href="https://icons.expo.fyi/">@expo/vector-icons directory</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/1f7ae087-ba4a-48ac-9f07-b8033045a798/image.png" alt=""></p>
<p>“waether-sunny” → 이 부분 바꿀 수 있으면 맞는 아이콘 그릴 수 있음</p>
<pre><code class="language-JavaScript">const weatherOptions = {
  Clear : {
    iconName : &quot;weather-sunny&quot;
  }

}

&lt;MaterialCommunityIcons name={weatherOptions[cond].iconName} size={24} color=&quot;black&quot; /&gt;</code></pre>
<ul>
<li>나머지 날씨들도 맵핑해서 쓸 수 있음!</li>
</ul>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/aa0cdd1c-f1ed-4223-b2df-70429e31da4c/image.jpeg" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#9. API]]></title>
            <link>https://velog.io/@chacha_w/9.-API</link>
            <guid>https://velog.io/@chacha_w/9.-API</guid>
            <pubDate>Mon, 28 Nov 2022 06:04:57 GMT</pubDate>
            <description><![CDATA[<h1 id="api">API</h1>
<p><strong>Open Weather Map</strong></p>
<blockquote>
<p><a href="https://openweathermap.org/">https://openweathermap.org/</a></p>
</blockquote>
<ul>
<li>My API keys
.gitignore 에서 <pre><code class="language-java">### API KEY ###
application-api-key.properties   // 이부분 복사</code></pre>
<code>application-api-key.properties</code> resource에 파일 추가<h3 id="call-current-weather-data">Call current weather data</h3>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/32f28f2b-30fe-410e-a231-2ecbee2fb21e/image.png" alt=""></p>
<ul>
<li><p>Built-in API request by city name</p>
<pre><code class="language-java">https://api.openweathermap.org/data/2.5/weather?q={city name}&amp;appid={API key}</code></pre>
</li>
<li><p>api-key.properties</p>
<pre><code class="language-java">openweather.url.weather=https://api.openweathermap.org/data/2.5/weather
openweather.client.apikey=여기에키값</code></pre>
</li>
<li><p>UriComponentsBuilder : URL 형태 만들어주는 기능</p>
</li>
<li><p>RestTemplate : 만들어진 url 쏴주기</p>
</li>
</ul>
<p>클래스는 대문자 시작, 변수/개체는 소문자 시작
/weather/current/{city}
/weather/?city= ✅</p>
<pre><code class="language-java">spring.mvc.pathmatch.matching-strategy=ant_path_matcher
logging.level.root=info 
// info, debug, logging? 등등 설정 가능</code></pre>
<p>UserController - Test Post 에서 info, debug, error, warn 확인 가능 → 로그 컨트롤!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#9. API, OpenWeather]]></title>
            <link>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-API-OpenWeather</link>
            <guid>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-API-OpenWeather</guid>
            <pubDate>Wed, 23 Nov 2022 12:19:05 GMT</pubDate>
            <description><![CDATA[<h2 id="api란">API란?</h2>
<blockquote>
<p>Application Programming Interface</p>
</blockquote>
<p>내 소듕한 API key </p>
<p>git에 올릴 때는 주의주의주의 해야함 → 분리해서 관리 ❗️
<br></p>
<ul>
<li>OpenWeather</li>
</ul>
<blockquote>
<p><a href="https://openweathermap.org/">Сurrent weather and forecast - OpenWeatherMap</a></p>
</blockquote>
<Br>

<ul>
<li><code>git log</code>  <code>git diff</code> - log 간의 차이를 보여줌<br>

</li>
</ul>
<p>gitignore 에 .env 추가돼있음</p>
<ol>
<li><code>.env</code> 파일 생성, 키 추가 → <code>REACT_APP_WEATHER_KEY=&quot;내 API Key”</code></li>
</ol>
<blockquote>
<p><a href="https://www.npmjs.com/package/babel-plugin-dotenv-import">babel-plugin-dotenv-import</a></p>
</blockquote>
<ol start="2">
<li><code>$ npm install babel-plugin-dotenv-import</code></li>
</ol>
<ul>
<li>babel.config 파일에 추가</li>
</ul>
<pre><code class="language-jsx">&quot;plugins&quot;: [
      [&quot;dotenv-import&quot;, {
        &quot;moduleName&quot;: &quot;@env&quot;,
        &quot;path&quot;: &quot;.env&quot;,
        &quot;blocklist&quot;: null,
        &quot;allowlist&quot;: null,
        &quot;safe&quot;: false,
        &quot;allowUndefined&quot;: false
      }]</code></pre>
<blockquote>
<p><a href="https://docs.expo.dev/versions/latest/sdk/location/">Location - Expo Documentation</a></p>
</blockquote>
<ol start="3">
<li><code>npx expo install expo-location</code>  설치</li>
<li>screens 에 Weather.js 파일 추가, 코드 작성<ul>
<li><code>import * as Location from &#39;expo-location&#39;;</code></li>
</ul>
</li>
</ol>
<p>적용 시점 선택 하고 방법 찾아서 쓰기</p>
<p>언제 ? → 화면 켜질 때, onPress, 화면 생성될 때 등</p>
<h2 id="위치-가져오기">위치 가져오기</h2>
<h3 id="axios---http-클라이언트-라이브러리">Axios - HTTP 클라이언트 라이브러리</h3>
<blockquote>
<p><a href="https://axios-http.com/">Axios</a></p>
</blockquote>
<p><code>npm install axios</code></p>
<p>REST - http method (get, post, put, del)</p>
<ul>
<li><p>routes - TapNavigation 에서 
Weather import, Nav screen 추가</p>
</li>
<li><p>자주 사용되는 생명주기
render(), constructor(), mount</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/bce9772a-a937-41c7-af7b-e569aaa2c2c6/image.jpeg" alt="">
✨✨_  짜잔 날씨 조회 화면 탭 생김! _ ✨✨
  <br></p>
<ul>
<li>lat=11&amp;lon=22</li>
</ul>
<pre><code class="language-json">{
&quot;base&quot;: &quot;stations&quot;, 
&quot;clouds&quot;: {&quot;all&quot;: 11}, 
&quot;cod&quot;: 200, 
&quot;coord&quot;: 
{&quot;lat&quot;: 11, &quot;lon&quot;: 22}, &quot;dt&quot;: 1669168807, &quot;id&quot;: 236178, &quot;main&quot;: 
{&quot;feels_like&quot;: 294.86, &quot;grnd_level&quot;: 958, &quot;humidity&quot;: 32, &quot;pressure&quot;: 1010, 
&quot;sea_level&quot;: 1010, &quot;temp&quot;: 295.71, &quot;temp_max&quot;: 295.71, &quot;temp_min&quot;: 295.71}, 
&quot;name&quot;: &quot;Vakaga Prefecture&quot;, &quot;sys&quot;: {&quot;country&quot;: &quot;CF&quot;, &quot;sunrise&quot;: 1669177885, 
&quot;sunset&quot;: 1669219538}, &quot;timezone&quot;: 3600, &quot;visibility&quot;: 10000, 
&quot;weather&quot;: [{&quot;description&quot;: &quot;few clouds&quot;, &quot;icon&quot;: &quot;02n&quot;, &quot;id&quot;: 801, 
&quot;main&quot;: &quot;Clouds&quot;}], &quot;wind&quot;: {&quot;deg&quot;: 20, &quot;gust&quot;: 1.7, &quot;speed&quot;: 1.72}}</code></pre>
<ul>
<li>lat=${latitude}&amp;lon=&amp;{longitude}</li>
</ul>
<pre><code class="language-json">{&quot;base&quot;: &quot;stations&quot;, &quot;clouds&quot;: 
{&quot;all&quot;: 20}, &quot;cod&quot;: 200, &quot;coord&quot;: 
{&quot;lat&quot;: 37.3396, &quot;lon&quot;: 127.2748}, &quot;dt&quot;: 1669168536, &quot;id&quot;: 1845275, &quot;main&quot;: 
{&quot;feels_like&quot;: 284.32, &quot;humidity&quot;: 62, &quot;pressure&quot;: 1018, &quot;temp&quot;: 285.42, 
&quot;temp_max&quot;: 285.72, &quot;temp_min&quot;: 282.81}, &quot;name&quot;: &quot;Chuja-ri&quot;, &quot;sys&quot;: 
{&quot;country&quot;: &quot;KR&quot;, &quot;id&quot;: 5509, &quot;sunrise&quot;: 1669155487, &quot;sunset&quot;: 1669191394, 
&quot;type&quot;: 1}, &quot;timezone&quot;: 32400, &quot;visibility&quot;: 10000, &quot;weather&quot;: 
[{&quot;description&quot;: &quot;haze&quot;, &quot;icon&quot;: &quot;50d&quot;, &quot;id&quot;: 721, &quot;main&quot;: &quot;Haze&quot;}],
 &quot;wind&quot;: {&quot;deg&quot;: 40, &quot;speed&quot;: 1.54}}</code></pre>
<p>  <img src="https://velog.velcdn.com/images/chacha_w/post/2ac9375b-092c-472c-b4da-1f0bfd5bee4a/image.png" alt=""></p>
<p>다음 시간에 화면에 display!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#8. Touchable Opacity, Tap NAV]]></title>
            <link>https://velog.io/@chacha_w/TIL-8</link>
            <guid>https://velog.io/@chacha_w/TIL-8</guid>
            <pubDate>Wed, 16 Nov 2022 03:14:21 GMT</pubDate>
            <description><![CDATA[<h3 id="image-넣기">Image 넣기</h3>
<pre><code class="language-jsx">&lt;Image
        source={require(&#39;../assets/frog-1371919.png&#39;)}    // 개구리 이미지 삽입
        style={{width:400, height:400}}
      /&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/e7de0686-1395-4cc6-a3db-e2e12ece3669/image.jpeg" alt=""></p>
<h3 id="touchable-opacity---버튼">Touchable Opacity - 버튼</h3>
<ul>
<li>import 해주고</li>
</ul>
<pre><code class="language-jsx">&lt;TouchableOpacity
        style={styles.buttonContainer}                    // 버튼 박스 생성, 스타일은 buttonContainer에서 설정
        onPress={() =&gt; navigation.navigate(&#39;Layout&#39;)}     // 누르면 Layout으로 이동
      &gt;
        &lt;Text style={styles.buttonTest}&gt;Go To Layout&lt;/Text&gt;     
      &lt;/TouchableOpacity&gt;</code></pre>
<pre><code class="language-jsx">const styles = StyleSheet.create({
  buttonContainer:{
    backgroundColor:&#39;black&#39;,
    borderRadius:5,
    padding:10,
    margin:20
  },
  buttonTest:{
    fontSize:20,
    color:&#39;#fff&#39;
  }
})</code></pre>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/3f634884-62c6-43d3-8ae7-4729c24eb32f/image.jpeg" alt=""></p>
<p>&lt;&gt; ⇒ <View></p>
<p>전체 화면을 기존 &lt;&gt;&lt;/&gt; 에서 <View></View> 로 바꿔주면 style 적용 가능</p>
<p>const styles에 containter 추가하고 <code>&lt;View style = {styles.container}&gt;</code></p>
<pre><code class="language-jsx">const styles = StyleSheet.create({
  container:{
    flex:1,
    justifyContent:&#39;center&#39;,    // 개구리 중앙 정렬
    alignItems:&#39;center&#39;,        // 버튼 중앙 정렬
    backgroundColor:&#39;#ebebeb&#39;   // 바탕색 옅은 회색
  }</code></pre>
<p>그리고 이전 버튼은 지워주기</p>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/18d7b8a1-21a3-465f-97cf-0b8046b11141/image.jpeg" alt=""></p>
<h3 id="layout에-go-to-home-버튼-생성">Layout에 ‘Go to home’ 버튼 생성</h3>
<p><code>const {navigation} = props;</code>  prop으로 전달받아서 navigation</p>
<pre><code>const Layout = (props) =&gt; {
  const {navigation} = props;</code></pre><pre><code class="language-jsx">&lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;GO TO HOME&quot; 
            onPress={() =&gt; navigation.navigate(&#39;Home&#39;) }/&gt;
        &lt;/View&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/78d14b04-e32c-47dc-a3e0-e1c8601bf09b/image.PNG" alt=""></p>
<h3 id="tap-base-navigation">Tap base navigation</h3>
<p><a href="https://reactnavigation.org/docs/tab-based-navigation/#a-native-stack-navigator-for-each-tab"></a></p>
<p><code>npm install @react-navigation/bottom-tabs</code></p>
<p>MainStackNavigator 에서 Stack → Nav로 기호 이름 바꾸기</p>
<p>MainTabNavigator 추가하고 App.js에서 연결</p>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/c8986dbc-e57f-4c33-a580-4bd1bb8d78f6/image.PNG" alt=""></p>
<p>  <del>나는 왜 화살표가 안뜨지</del> ➡️ 업데이트 하니까 떴음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#7. FlexDirection, stack Navigation]]></title>
            <link>https://velog.io/@chacha_w/TIL-7.-FlexDirection-stack-Navigation</link>
            <guid>https://velog.io/@chacha_w/TIL-7.-FlexDirection-stack-Navigation</guid>
            <pubDate>Wed, 16 Nov 2022 03:08:57 GMT</pubDate>
            <description><![CDATA[<h3 id="align-justify">align, justify</h3>
<ul>
<li>함수로 필요한 세팅값 정의<ul>
<li>스타일 인덱스, 해당스타일 table, 설정 함수 명<ul>
<li>→ 스타일 인덱스 +1 해서 스타일 테이블 가져오고 스타일 설정해줌</li>
<li>flexDirection은 요소 4개로 인덱스 3번까지만 있음. 4번 넘어가면 오버플로우<ul>
<li>방법1) length 고정 - 최대값 넣고 끝내기</li>
<li><strong>방법2) 넘어가면 0으로 바꾸기</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code class="language-jsx">const changeSetting = (value, options, setterfunction) =&gt; {
    var targetValue = 0;
    if (value == options.length - 1) { //인덱스 넘어가면
      targetValue = 0;   // 0으로 바꿔버려라 
    } else {
      targetValue = value + 1;
    }
    setterfunction(targetValue);
    console.log(options[targetValue]);
  };</code></pre>
<pre><code class="language-jsx">const flexDirections = [&#39;row&#39;, &#39;row-reverse&#39;, &#39;column&#39;, &#39;column-reverse&#39;];
  const justifyContents = [
    &#39;flex-start&#39;,
    &#39;flex-end&#39;,
    &#39;center&#39;,
    &#39;space-between&#39;,
    &#39;space-around&#39;,
    &#39;space-evenly&#39;,
  ];
  const alignItems = [&#39;flex-start&#39;, &#39;flex-end&#39;, &#39;center&#39;, &#39;stretch&#39;, &#39;baseline&#39;];
  const wraps = [&#39;nowrap&#39;, &#39;wrap&#39;, &#39;wrap-reverse&#39;];
  const directions = [&#39;inherit&#39;, &#39;ltr&#39;, &#39;rtl&#39;];

  const [flexDirection, setFlexDirection] = useState(0);

  const hookedStyles = {
    flexDirection: flexDirections[flexDirection],
        // 여기에 추가추가</code></pre>
<ul>
<li>화면 전환!</li>
</ul>
<p><a href="https://reactnavigation.org/docs/getting-started"></a></p>
<p><a href="https://reactnavigation.org/docs/stack-navigator/"></a></p>
<br>

<h3 id="install-instructions">install instructions</h3>
<p><code>npm install @react-navigation/native</code></p>
<p><code>npx expo install react-native-screens react-native-safe-area-context</code></p>
<p><code>npm install react-native-screens react-native-safe-area-context</code></p>
<p><code>npx pod-install ios</code> : for MacOs</p>
<p><code>npm install @react-navigation/stack</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#8. Swagger & Lombok]]></title>
            <link>https://velog.io/@chacha_w/%EC%9B%B9%ED%94%84-8.-Swagger-Lombok</link>
            <guid>https://velog.io/@chacha_w/%EC%9B%B9%ED%94%84-8.-Swagger-Lombok</guid>
            <pubDate>Thu, 03 Nov 2022 03:48:06 GMT</pubDate>
            <description><![CDATA[<p>class → get, set, toString 함수들 </p>
<p>근데 너무 많아지면 배보다 배꼽이 커지니까 다른 방법 모색하기 시작</p>
<h1 id="swagger">Swagger</h1>
<blockquote>
<p><a href="https://mvnrepository.com/">https://mvnrepository.com/</a></p>
</blockquote>
<p>maven (build tool) → gradle로 바뀜
<br></p>
<ul>
<li>springfox boot starter</li>
</ul>
<blockquote>
<p><a href="https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter">https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter</a></p>
</blockquote>
<ul>
<li>build.gradle - dependencies 에 추가</li>
</ul>
<pre><code class="language-jsx">// [https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter](https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter)
implementation &#39;io.springfox:springfox-boot-starter:3.0.0&#39;</code></pre>
<ul>
<li>코끼리 아이콘 눌러서 필요한 것들 자동 다운로드</li>
<li>그리고 빌드하면 이런 에러 뜸
<code>Spring Boot 버전 2.6에서 일어나는 현상!</code><blockquote>
<p>spring boot 2.6.0부터 요청 경로를 ControllerHandler에 매칭시키기 위한 전략의 기본값이 ant_path_matcher 전략 -&gt; path_pattern_parser 전략으로 변경되었기 때문이다.</p>
</blockquote>
</li>
</ul>
<pre><code class="language-jsx">Caused by: java.lang.NullPointerException: Cannot invoke 
&quot;org.springframework.web.servlet.mvc.condition.
PatternsRequestCondition.getPatterns()&quot; because &quot;this.condition&quot; is null</code></pre>
<ul>
<li><p>💡 해결 방법 
application.properties에 다음 코드 넣기
<code>spring.mvc.pathmatch.matching-strategy=ant_path_matcher</code>
참고: <a href="https://stackoverflow.com/questions/72235752/cannot-invoke-org-springframework-web-servlet-mvc-condition-patternsrequestcond">https://stackoverflow.com/questions/72235752/cannot-invoke-org-springframework-web-servlet-mvc-condition-patternsrequestcond</a></p>
</li>
<li><p><a href="http://localhost:8080/swagger-ui/">http://localhost:8080/swagger-ui/</a>
그리고 다시 빌드하면 이렇게 테스트 페이지 확인 가능
<img src="https://velog.velcdn.com/images/chacha_w/post/abc2672f-02b7-4756-b522-e766f3ffa827/image.png" alt="">
✨✨✨✨✨짜잔✨✨✨✨✨</p>
<br>
</li>
<li><p><a href="https://docs.swagger.io/swagger-core/current/apidocs/">swagger-annotations 1.5.12 API</a></p>
</li>
</ul>
<p>내부 공유 목적 - 동일한 테스트, 동일한 문서를 볼 수 있음 (사용자에게 오픈 X)</p>
<p>Release시에는 build gradle에서 다시 삭제하고 배포해야함
<br></p>
<h1 id="lombok">Lombok</h1>
<blockquote>
<p>Lombok(롬복)은 Java 라이브러리로 반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리 </p>
</blockquote>
<p>PostUserRequest - getter setter 지우고 변수만 남기기 → <code>@Data</code> 한 줄로 대체 가능</p>
<ul>
<li>build gradle에 추가하고 코끼리</li>
</ul>
<pre><code class="language-jsx">// [https://mvnrepository.com/artifact/org.projectlombok/lombok](https://mvnrepository.com/artifact/org.projectlombok/lombok)
compileOnly &#39;org.projectlombok:lombok:1.18.24&#39;</code></pre>
<ul>
<li>빌드하면 에러남 - dependency 다시 아래 코드 추가
<code>annotationProcessor &#39;org.projectlombok:lombok&#39;</code></li>
</ul>
<ul>
<li><a href="https://projectlombok.org/features/">Stable</a></li>
</ul>
<h2 id="log">log</h2>
<blockquote>
<p><code>@Slf4j</code></p>
</blockquote>
<br>

<h4 id="📌-혼자-실습해볼-것">📌 혼자 실습해볼 것</h4>
<p>hello request도 getter, setter 삭제</p>
<p>다른 기능에도 설명 달아보기</p>
<ul>
<li><a href="http://log.info">log.info</a> 는 다음 시간에!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[#7. PUT]]></title>
            <link>https://velog.io/@chacha_w/%EC%9B%B9%ED%94%84-7.-PUT</link>
            <guid>https://velog.io/@chacha_w/%EC%9B%B9%ED%94%84-7.-PUT</guid>
            <pubDate>Thu, 03 Nov 2022 03:36:26 GMT</pubDate>
            <description><![CDATA[<h1 id="함수를-쓰는-방법">함수를 쓰는 방법</h1>
<ul>
<li>camel-case : DoItYourSelf  (서버, 일반 개발자들 선호)</li>
<li>snake-case : do_it_yourself (js쪽 선호)</li>
</ul>
<p>phoneNumber - getter &amp; setter &amp; toString 설정</p>
<p><code>@JsonProperty(&quot;phone_number&quot;)</code></p>
<p><code>@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)</code></p>
<p>→ post method</p>
<h1 id="user-controller">User controller</h1>
<h3 id="put-method">put method</h3>
<pre><code class="language-java">@PutMapping(&quot;/put&quot;)
public void put(@RequestBody Map&lt;String, Object&gt; requestData) {
    requestData.entrySet().forEach(stringObjectEntry -&gt; {
        System.out.println(&quot;key : &quot; + stringObjectEntry.getKey() +
                &quot;value : &quot; + stringObjectEntry.getValue());</code></pre>
<br>

<h3 id="reponse-method">reponse method</h3>
<pre><code class="language-java">@PutMapping(&quot;put-object-entity&quot;)
public ResponseEntity&lt;PostUserRequest&gt; putObjectEntity(@RequestBody PostUserRequest requestData) {

    return  ResponseEntity.status(HttpStatus.CREATED).body(requestData);
}</code></pre>
<p>→ Response 201 : created
<br></p>
<pre><code class="language-java">@GetMapping(&quot;/get&quot;)
public PostUserRequest getUser() {
    PostUserRequest user = new PostUserRequest();
    user.setName(&quot;tester1234&quot;);

    return user;
}</code></pre>
<br>

<h1 id="html">HTML</h1>
<ul>
<li>새로운 controller <code>PageController</code></li>
</ul>
<pre><code class="language-java">@Controller
public class PageController {
    @RequestMapping(&quot;/main&quot;)
    public String main() {
        return &quot;main.html&quot;;

    }
}</code></pre>
<ul>
<li>resource에 static 폴더 - main.html 만들어주면 
<img src="https://velog.velcdn.com/images/chacha_w/post/14a97668-ba6c-472e-8e09-905e1d8c232e/image.png" alt=""></li>
</ul>
<p>짜잔!</p>
<br>

<ul>
<li>null값 빼고 response</li>
</ul>
<p><code>@JsonInclude(JsonInclude.Include.*NON_NULL*)</code></p>
<br>


<blockquote>
<p>⚠️ 화살표 디렉토리 수정
<code>rm -rf .git</code>
<code>git rm --cached . -rf</code></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[#6. POST]]></title>
            <link>https://velog.io/@chacha_w/%EC%9B%B9%ED%94%84-6.-POST</link>
            <guid>https://velog.io/@chacha_w/%EC%9B%B9%ED%94%84-6.-POST</guid>
            <pubDate>Thu, 03 Nov 2022 03:29:20 GMT</pubDate>
            <description><![CDATA[<h2 id="json">Json</h2>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/19e82bf4-4678-465d-b65f-30f9bf36dc3d/image.png" alt=""></p>
<h2 id="get-post-put-delete">get, post, put, delete</h2>
<p>기본적으로 많이 쓰는 메서드❗️</p>
<p>get : 서버에서 데이터를 가져올 떄</p>
<p>post : 서버로 데이터를 밀어낼 때</p>
<h1 id="post">Post</h1>
<ol>
<li>URL에 데이터가 포함되지 않아 외부에 노출되지 않는다.</li>
<li>메시지 본문에 데이터를 포함한다.</li>
<li>바이너리 및 대용량 데이터 전송이 가능하다.<br>

</li>
</ol>
<h2 id="usercontroller">UserController</h2>
<ul>
<li>controller에 새로운 java class <code>UserController</code> 추가</li>
</ul>
<pre><code class="language-java">@RestController
@RequestMapping(&quot;/user&quot;)
public class UserController {

    @PostMapping(&quot;/post&quot;)
    public void post(@RequestBody Map&lt;String, Object&gt; requestData) {

        requestData.entrySet().forEach(stringObjectEntry -&gt; {
            System.out.println(&quot;key : &quot; + stringObjectEntry.getKey()
                    + &quot;value : &quot; + stringObjectEntry.getValue());
        });
    }

    @PostMapping(&quot;/post-object&quot;)
    public void postObject(@RequestBody PostUserRequest requestData) {
        System.out.println(&quot;Test POST OBJECT&quot;);
        System.out.println(requestData.toString());
    }
}</code></pre>
<h2 id="postuserrequest">PostUserRequest</h2>
<ul>
<li>dto에 새로운 클래스 <code>PostUserRequest</code> 추가</li>
</ul>
<pre><code class="language-java">public class PostUserRequest {
    private String id;
    private String name;
    private String email;
    private String address;
    private String password;

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    @Override
    public String toString() {
        return &quot;PostUserRequest{&quot; +
                &quot;id=&#39;&quot; + id + &#39;\&#39;&#39; +
                &quot;, name=&#39;&quot; + name + &#39;\&#39;&#39; +
                &quot;, email=&#39;&quot; + email + &#39;\&#39;&#39; +
                &quot;, address=&#39;&quot; + address + &#39;\&#39;&#39; +
                &quot;, password=&#39;&quot; + password + &#39;\&#39;&#39; +
                &quot;, phoneNumber=&#39;&quot; + phoneNumber + &#39;\&#39;&#39; +
                &#39;}&#39;;
    }

    @JsonProperty(&quot;phone_number&quot;)
    private String phoneNumber;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}</code></pre>
<h3 id="talendapi-test">TalendAPI Test</h3>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/404f3f4c-acb7-4a54-a666-ecc6406824e7/image.png" alt="">
Talend 에서 request 보내면
<img src="https://velog.velcdn.com/images/chacha_w/post/f40bc259-7c38-4c8c-9c19-138b2f852193/image.png" alt="">
짜잔!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#5. GET]]></title>
            <link>https://velog.io/@chacha_w/%EC%9B%B9%ED%94%84-5.-GET</link>
            <guid>https://velog.io/@chacha_w/%EC%9B%B9%ED%94%84-5.-GET</guid>
            <pubDate>Thu, 03 Nov 2022 03:26:39 GMT</pubDate>
            <description><![CDATA[<p> <img src="https://velog.velcdn.com/images/chacha_w/post/f5496aaa-fa05-4f36-a9eb-5c93ed52ba52/image.png" alt=""></p>
<h3 id="get-mapping">Get Mapping</h3>
<p>request : ~를 주세요 → get ~
요청값이 바뀌면 get도 바뀔 수 있어야함</p>
<p>소스 트리 꼬이면 <code>git mv 디렉토리</code> 명령어로 이동 시킬 수 있음 - git mv \main \src</p>
<p>그리고 <code>git status</code> → deleted &amp; renamed 확인 가능</p>
<ul>
<li>com.example.Student_에 controller 패키지 추가</li>
<li>controller에 new class</li>
</ul>
<blockquote>
<p>💡 빨간 글씨에 alt+enter → 필요한 것 자동으로 import 해줌!!</p>
</blockquote>
<br>

<h3 id="query-requestparam"><strong>Query RequestParam</strong></h3>
<p> <a href="http://localhost:8080/greeting/hello?name=%EC%B9%9C%EA%B5%AC">http://localhost:8080/greeting/hello?name=친구</a></p>
<p><code>(@RequestParam(required = false, defaultValue = &quot;&quot;)</code></p>
<p><code>@RequestParam(required = false, defaultValue = &quot;1&quot;) int level)</code></p>
<p>map&lt;s, s&gt;  해당 영역을 &lt;Key, Value&gt;로 확인</p>
<p>&lt;name, Inkyung&gt;, &lt;level, 3&gt;
<br></p>
<h3 id="http">HTTP</h3>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/d075ff5d-1539-452a-a0f0-96cea8117378/image.png" alt=""></p>
<blockquote>
<p>https : 보안 영역</p>
</blockquote>
<ul>
<li>서버 - 클라이언트 모델</li>
<li>무상태 프로토콜</li>
<li>TCP Protocol 위에서 동작 기본 포트는 80</li>
</ul>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/5fd0b982-f303-4761-93bf-7090946a5b17/image.png" alt=""></p>
<h3 id="dto">DTO</h3>
<p>클래스로 뭉쳐서 데이터를 받겠다!</p>
<h3 id="json">Json</h3>
<p>: <em>JavaScript Object Notation</em></p>
<ul>
<li>텍스트로 이루어져 있으므로, 사람과 기계 모두 읽고 쓰기 쉽다.</li>
<li>프로그래밍 언어와 플랫폼에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기에 좋다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[#6. box , 기능 추가]]></title>
            <link>https://velog.io/@chacha_w/TIL6.-box-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80</link>
            <guid>https://velog.io/@chacha_w/TIL6.-box-%EA%B8%B0%EB%8A%A5-%EC%B6%94%EA%B0%80</guid>
            <pubDate>Mon, 31 Oct 2022 05:11:31 GMT</pubDate>
            <description><![CDATA[<p><code>git reset —hard</code>  : 커밋하지 않은 것들 다 날라</p>
<p><code>git checkout 로그의 캐시값</code>  → 해당 로그의 버전으로 돌아감</p>
<pre><code class="language-jsx">const Square = () =&gt; {
    const sqStyle = {
      width: 50,
      height: 50,
      backgroundColor:randomHexColor(),
    };
    return &lt;View style={sqStyle} /&gt;;
  };

  const [squares, setSquares] = useState([Square(), Square(), Square()]);</code></pre>
<pre><code class="language-powershell">const randomHexColor = () =&gt; {
  return &#39;#000000&#39;.replace(/0/g, () =&gt; {
    return (~~(Math.random() * 16)).toString(16);
  });</code></pre>
<p>원하는 것이 있으면 방법 찾아서 적용 (함수)</p>
<p>원하는 것 → 랜덤 색상 상자</p>
<ul>
<li>색상 값은 #000000 ~ #FFFFFF</li>
</ul>
<pre><code class="language-jsx">const randomHexColor = () =&gt; {
  return &#39;#000000&#39;.replace(/0/g, &quot;a&quot;);
};  // 0을 찾으면 &#39;a&#39;로 바꿔줘</code></pre>
<pre><code class="language-jsx">const randomHexColor = () =&gt; {
  return &#39;#aaaaaa&#39;.replace(/a/g, () =&gt; {
    return &quot;0&quot;
  });
};         // &#39;a&#39;를 0으로 바꿔줘 , (arrow function)</code></pre>
<p>#000000 : 검은색</p>
<p>#aaaaaa : 회색</p>
<p><code>(~~Math.random()*16))</code> <code>.toString(16);</code></p>
<p>~~ flow : 소수점 버림, 16진수로 자름</p>
<blockquote>
<p>arrow function</p>
</blockquote>
<p><code>git log</code> : 커밋 내역 보여줌, 빠져나가려면 <code>q</code></p>
<p><code>git branch</code>  </p>
<p> <code>git checkout main</code> : 체크아웃</p>
<p><code>git log</code> → 다시 최신버전으로 복원</p>
<pre><code class="language-jsx">&lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;ADD SQUARE&quot; 
            onPress={() =&gt; setSquares([...squares, Square()])}/&gt;
        &lt;/View&gt;
        &lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;DELETE SQUARE&quot; 
            onPress={() =&gt; setSquares(squares.filter((v, i) =&gt; i != squares.length-1))}/&gt;</code></pre>
<p>v = variables
i = index</p>
<p><delete> 인덱스 ≠ lengh-1 이면 필터링해서 숨김</p>
<p align="center"><img src="https://velog.velcdn.com/images/chacha_w/post/67c69bab-275a-4f5c-b3d3-ad3d19e0e9e3/image.png" width="100px" height="300px"></p>
  아니 이거 사진크기 왜 안줄어드는겨


<h4 id="git-check-out">git check out</h4>
<img src="https://velog.velcdn.com/images/chacha_w/post/d39e939e-6f94-4b44-9bae-1b33ca21a869/image.png">
]]></description>
        </item>
        <item>
            <title><![CDATA[#5. onPress]]></title>
            <link>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-5.-onPress</link>
            <guid>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-5.-onPress</guid>
            <pubDate>Mon, 31 Oct 2022 04:59:03 GMT</pubDate>
            <description><![CDATA[<ul>
<li><code>git branch</code> - branch 변경(check out-왔다갔다), 다른 branch의 필요한 기능 cherry pick 가능 <br>

</li>
</ul>
<p><code>expo start</code>  : pc-mobile 핫스팟으로 연결, 또는 공유기로 연결 → 같은 네트워크, 같은 망 어딘가에 있는 걸 찾음</p>
<p><code>expo start —tunnel</code> : 학교 pc, 학교 wifi로 연결 → tunnel(터널) 뚫어서 망 거쳐서 연결됨</p>
<ul>
<li>onPress : 누를 때 동작하는 핸들러</li>
</ul>
<pre><code class="language-powershell">onPress={() =&gt; console.log(&quot;Click CHANGE FLEX DIRECTION&quot;)}</code></pre>
<ul>
<li><p>flex direction : 방향 제어</p>
</li>
<li><p>state</p>
</li>
</ul>
<p>const [변경할 변수 이름, 변경하는 함수 이름] = useState(0);</p>
<blockquote>
<p>npx expo start</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/chacha_w/post/15c1574a-f4bc-4fc4-985a-4096fe80af6f/image.png" alt=""></p>
<h2 id="consolelog-실행하려면-npx-실행하기">console.log() 실행하려면 npx 실행하기!!!!!!!</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[#4. Image, Text]]></title>
            <link>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-4</link>
            <guid>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-4</guid>
            <pubDate>Mon, 31 Oct 2022 04:42:23 GMT</pubDate>
            <description><![CDATA[<p><a href="https://reactnative.dev/">React Native · Learn once, write anywhere</a></p>
<p><a href="https://docs.expo.dev/">Expo Documentation</a></p>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/import">import - JavaScript | MDN</a></p>
<p><code>expo start —tunnel</code></p>
<ul>
<li>git clone 한 경우에는 npm install 해줘야함</li>
</ul>
<p>컴포넌트 쓸 때마다 필요한거 찾아서 쓰기</p>
<ul>
<li>제일 기본 포맷</li>
</ul>
<pre><code class="language-jsx">import React from &quot;react&quot;;

const App = () =&gt; {
  return (&lt;&gt;
   &lt;Text&gt;hello~~&lt;/Text&gt; //이렇게 하면 제일 위쪽 상단바에 가있ㅅ음ㅜㅜ
  &lt;/&gt;); 
}

export default App;</code></pre>
<p><code>npx expo install expo-constants</code></p>
<ul>
<li>View : UI를 잡아주기 위한 기본 틀!</li>
</ul>
<p><code>&lt;View style={{ paddingTop:Constants.statusBarHeight }}&gt;&lt;/View&gt;</code></p>
<p>padding-top css와 동일한 요소임</p>
<pre><code class="language-jsx">import React from &quot;react&quot;;
import { Text, View } from &quot;react-native&quot;;

const App = () =&gt; {
  return (&lt;&gt;
    &lt;View style={{ paddingTop:Constants.statusBarHeight }}&gt;&lt;/View&gt;
    &lt;Text&gt;hello~~&lt;/Text&gt;

  &lt;/&gt;);
}

export default App; //위에 const App이랑 동일한 이름, 이렇게 내보내서 쓸거다!</code></pre>
<p><code>git status</code> : modified 확인</p>
<p><code>git log</code> : 이전 작업 내역 확인</p>
<p><code>git reset —hard</code> : 이전 소스로 복원</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#3. View, Button]]></title>
            <link>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-3</link>
            <guid>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-3</guid>
            <pubDate>Mon, 31 Oct 2022 04:26:08 GMT</pubDate>
            <description><![CDATA[<ul>
<li>클라이언트, 실제 사용자와의 communication이 중요함</li>
</ul>
<blockquote>
<p>create project: view, button</p>
</blockquote>
<p><code>expo init LayoutProps</code> - ‘LayoutProps’ 폴더 생성</p>
<p>github - new repo 생성 ‘Props_201904385’</p>
<pre><code class="language-powershell">git remote add origin https://github.com/hufs-mobile/Props_201904385.git
# 에러나면 git remote remove origin 하고 다시
git branch -M main
git push -u origin main</code></pre>
<p>✅  에러나서 git add 하고 커밋 하고 다시 푸시!</p>
<pre><code class="language-powershell">git add .
git commit -m &quot;커밋 메세지 작성&quot;
git push -u origin main</code></pre>
<ul>
<li>깃헙에 Props라는 repo 만들고 - LayoutProps 폴더를 연결하는 것이 push</li>
</ul>
<p><a href="https://computer-science-student.tistory.com/381">[맥, Mac] 터미널에서 vscode(visual studio code) 열기 설정</a></p>
<p>→ 설정 해줬음!</p>
<p><code>code .</code>  - 해당 디렉토리의 vscode 열림</p>
<p>App.js → <code>expo start —tunnel</code> → Qr code 나옴</p>
<p><a href="https://reactnative.dev/">React Native · Learn once, write anywhere</a></p>
<p>리액트의 StyleSheet → 속성(색, 크기 등등)</p>
<p><code>&lt;Button&gt;&lt;/Button&gt;</code></p>
<p><code>&lt;Button/&gt;</code></p>
<p>title은 required!</p>
<pre><code class="language-JavaScript">import React from &quot;react&quot;;
import { Button, View, ScrollView, StyleSheet } from &quot;react-native&quot;; //view, scrollview, stylesheet 쓸거임

const App = () =&gt; {
  return (&lt;&gt;
    &lt;View style={[styles.container, styles.playingSpace]}&gt;

    &lt;/View&gt;
    &lt;ScrollView style={[styles.container]}&gt;
      &lt;View style={[styles.controlSpace]}&gt;
        &lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;1&quot;/&gt;
        &lt;/View &gt;
        &lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;2&quot;/&gt;
        &lt;/View&gt;
        &lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;3&quot;/&gt;
        &lt;/View&gt;
        &lt;View style={[styles.buttonView]}&gt; 
          &lt;Button title=&quot;4&quot;/&gt;
        &lt;/View&gt;
        &lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;5&quot;/&gt;
        &lt;/View&gt;
        &lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;6&quot;/&gt;
        &lt;/View&gt;
        &lt;View style={[styles.buttonView]}&gt;
          &lt;Button title=&quot;7&quot;/&gt;
        &lt;/View&gt;
      &lt;/View&gt;
    &lt;/ScrollView&gt;

  &lt;/&gt;);
}

const styles = StyleSheet.create({  //여기에 스타일 만들고 위에 view에 연결해줘야함
  container: {
    height:&#39;50%&#39; //높이 반반으로
  },
  playingSpace:{
    backgroundColor: &#39;lightyellow&#39;,
    borderColor: &#39;blue&#39;,
    borderWidth: 3
  },
  controlSpace: {
    backgroundColor: &#39;#A5A5A5&#39;,
    flexDirection: &#39;row&#39;, 
    flexWrap: &#39;wrap&#39;
  },
  buttonView: {
    width: &#39;50%&#39;,
    padding: 10
  }
});

export default App;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[#2. Git]]></title>
            <link>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-2.-Git</link>
            <guid>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-2.-Git</guid>
            <pubDate>Mon, 31 Oct 2022 04:21:01 GMT</pubDate>
            <description><![CDATA[<h1 id="git">Git</h1>
<blockquote>
<p><a href="https://git-scm.com/">Git</a></p>
</blockquote>
<p><strong>SCM</strong> : Source Control Management</p>
<ul>
<li>다른 관리 툴도 많음</li>
</ul>
<ol>
<li>homebrew, git 설치</li>
<li>git config 설정
<code>git config —global [user.name](http://user.name) “이름”</code>
<code>git config —global [user.email](http://user.email) “이메일”</code>
<code>git config —list</code></li>
<li><code>git clone “레포 주소 링크”</code></li>
<li>새로운 레포 생성 web_학번
private, gitignore=java
클론하고 “학번.txt” 파일 생성</li>
<li>git status</li>
<li><code>git add 201904385.txt</code> : 깃에 파일 추가</li>
<li><code>git commit</code>
vi 창 (command mode) - commit 메세지 작성 후 커밋 가능
<code>i</code> - insert <code>esc</code> <code>:wq</code> <code>enter</code></li>
</ol>
<blockquote>
<p>git commit -m &quot;커밋메시지&quot;
    # vim 편집기화면을 건너뛰고 한줄짜리 메시지와 함께 곧바로 커밋할 수 있음</p>
</blockquote>
<blockquote>
<p>git commit --ammend
    # 방금 전 올린 commit message를 수정할 수 있음</p>
</blockquote>
<ol start="8">
<li><code>git push</code> : 서버에 넣음</li>
<li><code>git pull</code> : cd test_web 가서 풀 하면 교수님이 만드신 파일 내 폴더에도 생김 - 서버의 변경사항을 내 pc에 적용</li>
<li>다 하고 status 보면 nothing to commit, working tree clean</li>
<li>파일 내용 변경 있으면 다시 git add 하고 푸시</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[#1.  React Native 소개]]></title>
            <link>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-1</link>
            <guid>https://velog.io/@chacha_w/%EB%AA%A8%ED%94%84-1</guid>
            <pubDate>Mon, 31 Oct 2022 02:48:05 GMT</pubDate>
            <description><![CDATA[<h1 id="reactnative">ReactNative</h1>
<p><u>페이스북이 만든 오픈소스 모바일 애플리케이션 프레임워크</u>
Javascript로 iOS와 Android를 동시에 개발할 수 있다.</p>
<ul>
<li><p>보통은 OS에 맞는 언어로 개발- iOS는 <code>Swift</code>와 <code>Objective-C</code>, Android는 <code>Kotlin</code>, <code>Java</code></p>
</li>
<li><p>하나의 서비스를 위해 iOS와 Android를 따로 개발하면 유지보수 비용과 시간이 많이 필요하다. 이를 해결하기 위해 하이브리드 웹앱, RN, 하이브리드 앱 등 등장</p>
</li>
</ul>
<p>ios/android 소스가 다르면 양쪽이 다 잘 돌아가는지 점검해야함 - 한쪽만 되는 경우 왕왕
양쪽을 다 할 수 있는 언어를 만들자! → <code>React Native</code>!</p>
<blockquote>
<p><a href="https://reactnative.dev/">React Native · Learn once, write anywhere</a></p>
</blockquote>
<p>오픈소스 - 신뢰성, 상용화 가능? / 오픈소스의 라이선스가 무엇인지 확인해야함</p>
<h3 id="reactnative의-장점">ReactNative의 장점</h3>
<ul>
<li>컴포넌트 기반으로 재사용성이 뛰어나다</li>
<li>리액트 기반이기 때문에 러닝커브가 적다.</li>
<li>크로스플랫폼으로 개발하기 때문에 생산성이 좋다.</li>
<li>모바일 앱 디버깅이 아닌 자바스크립트 디버깅을 사용한다.</li>
<li>따라서, Hot Reloading을 사용할 수 있기 때문에 소스코드 수정 후 다시 빌드해서 확인하는 네이티브 앱 방식과 다르게 실시간으로 확인이 가능하다.</li>
</ul>
<h3 id="reactnative의-단점">ReactNative의 단점</h3>
<ul>
<li>아무래도 네이티브 앱보다는 성능이 떨어질 수밖에 없다.</li>
<li>네이티브 브릿지를 통해 자바스크립트 스레드와 연결해서 동작하더라도, 네이티브 방식보다는 성능이 떨어진다.</li>
<li>자바스크립트 스레드와 네이티브 스레드는 5ms주기로 네이티브 브릿지를 통해 통신한다.</li>
<li>5ms이상 시간이 걸리는 처리를 할 떄는 성능 저하를 경험할 수 있다.<br>

</li>
</ul>
<h1 id="expo">Expo</h1>
<p>리액트 네이티브를 베이스로 ios, aos, 웹 등을 개발하고 쉽게 빌드, 배포할 수 있게 도와주는 프레임워크!</p>
<blockquote>
<p><a href="https://docs.expo.dev/">Expo Documentation</a></p>
</blockquote>
<h3 id="expo의-장점">Expo의 장점</h3>
<ul>
<li>xcode나 안드로이드 스튜디오를 따로 배우지 않고 expo만으로도 앱 개발이 가능. expo가 이 두가지보다 상위버전 이기에, 내부적으로 두가지의 작업을 해낼 수 있다.</li>
<li>양쪽 소프트웨어(안드로이드/ios)를 오픈할 필요도, 각기 다른 플랫폼들에서 테스트를 거칠 필요도 없다.</li>
<li>윈도우에서 ios 앱을 빌드하는 것이 가능</li>
<li><blockquote>
<p>이는 서버로 데이터를 보내고, 서버에서 파일을 가지고 응답할 수 있다는 것@!
앱 하나로 양쪽 소프트웨어를 사용하는 디바이스에서 실행이 가능</p>
</blockquote>
</li>
<li>&#39; over the air updates &#39; : 앱을 자바스크립트로 작업하고, 내용을 변경할 때 따로 앱스토어에 승인을 요청할 필요가 없음</li>
<li><blockquote>
<p>보통 앱 개발 시에는 new버젼을 만들어 앱스토어에 퍼블리쉬 한 후, 인증을 받는 과정을 거쳐야 하지만 expo를 사용할 경우엔 생략됨.</p>
</blockquote>
</li>
<li>또한 자바스크립트로 작업되어 내부적으로 자동 업데이트가 이뤄지기 때문에 직접 수정하고 에러를 고치는 시간을 단축할 수 있음!</li>
</ul>
<br>

<h2 id="expo-시작하기">Expo 시작하기</h2>
<ul>
<li><a href="http://nodejs.org">nodejs.org</a> → 들어가서 설치<ul>
<li>node -v 버전 확인</li>
</ul>
</li>
<li>create a snack → expo go 에서 qr로 확인</li>
</ul>
<p>*<em>- expo 설치  *</em>
<code>$ npm install expo-cli --global</code>
뭔가 설치가 안돼서 애먹었는데 앞에 <code>$ sudo</code> 붙여서 실행하니까 해결됐음</p>
<p>*<em>- 프로젝트 생성 *</em>
<code>expo init 프로젝트이름</code> blank 선택하고 enter</p>
<p><strong>- expo 실행</strong>
해당 폴더 안에 들어가서 <code>expo start --tunnel</code></p>
<ul>
<li>tunnel : 외부 네트워크에서도 캐스트 가능 (와이파이, 5G 등)</li>
<li><code>expo start --web</code> : 웹에서도 변동사항 확인 가능</li>
</ul>
<p><strong>vscode에서 react ES7 설치</strong>
<strong>폴더 선택</strong>
<br></p>
<h4 id="터미널-명령어">터미널 명령어</h4>
<p><code>ls</code> - 폴더 촤라락 보여줌</p>
<p><code>cd 폴더명</code> → 해당 폴더로 이동  /  <code>cd..</code> 상위 폴더로 이동 / <code>cd 폴더명 앞글자 + Tab</code></p>
<p><code>pwd</code> 현재 폴더 위치</p>
<p><code>mkdir</code></p>
<p>shift + 오른쪽 마우스 열기 → 터미널 열기</p>
]]></description>
        </item>
    </channel>
</rss>