<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>it-ju.log</title>
        <link>https://velog.io/</link>
        <description>frontend developer</description>
        <lastBuildDate>Mon, 24 Feb 2025 04:11:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>it-ju.log</title>
            <url>https://velog.velcdn.com/images/it-ju/profile/dcb5adbb-831c-4563-a0b8-7b2b9c369443/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. it-ju.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/it-ju" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[HIG 10.머티리얼]]></title>
            <link>https://velog.io/@it-ju/HIG-10.%EB%A8%B8%ED%8B%B0%EB%A6%AC%EC%96%BC</link>
            <guid>https://velog.io/@it-ju/HIG-10.%EB%A8%B8%ED%8B%B0%EB%A6%AC%EC%96%BC</guid>
            <pubDate>Mon, 24 Feb 2025 04:11:04 GMT</pubDate>
            <description><![CDATA[<p>apple 플랫폼에서 머티리얼은 레이어간의 분리를 시각적으로 전달하고 위치감을 유지시킴
이를 통해 생동감을 주고 콘텐츠의 깊이감을 풍부하게 함</p>
<h1 id="모범-사례">모범 사례</h1>
<h3 id="머티리얼의-종류">머티리얼의 종류</h3>
<ol>
<li><p>blur 흐림</p>
</li>
<li><p>vibrancy 생동감</p>
</li>
<li><p>blending mode 혼합 모드
이를 조합하여 앱간 화면 전환에 부드러운 전환을 줌
<img src="https://velog.velcdn.com/images/it-ju/post/712ff283-7cb6-4cb5-992c-fab99d09a5f5/image.png" alt=""></p>
</li>
<li><p>의미론적 의미에 따라 시스템 머티리얼 효과를 선택</p>
</li>
<li><p>머티리얼 적용 시 적절한 대비감을 사용하여야 함</p>
</li>
<li><p>흐림이나 생동감효과와 같이 이용할 머티리얼 사용 시 대비와 시각적 분리감을 위해서 적당한 두께의 콘텐츠나 고려하기.</p>
</li>
<li><p>반투명도는 시각적 미리알림 효과로 진행을 유지하는 느낌을 줌</p>
</li>
</ol>
<h1 id="플랫폼-고려사항">플랫폼 고려사항</h1>
<h2 id="ios-ipados">iOS, iPadOS</h2>
<p><img src="https://velog.velcdn.com/images/it-ju/post/da4b8f49-aa4b-46be-86f6-f6a2535775a3/image.png" alt="">
표준 시스템 색상은 생동감 있는 버전에서 사용할 수 없지만 iOS 및 iPadOS는 각 머티리얼에 맞게 특별히 디자인된 각 레이블, 채우기 및 분리자의 생동감 있는 색상을 정의</p>
<p>채우기는 4차색까지 있으나 3차색까지만 사용 됨(4차 레이블은 대비가 적어서 사용하지 않음)
<img src="https://velog.velcdn.com/images/it-ju/post/0fdbafac-5de0-4621-836f-522afa6f25b3/image.png" alt=""></p>
<p>분리선은 1개의 종류만 사용 됨
<img src="https://velog.velcdn.com/images/it-ju/post/796f596e-c4b9-4faa-8286-a2c109c2f331/image.png" alt=""></p>
<h2 id="macos">macOS</h2>
<p>윈도우, 메뉴, 팝오버, 사이드바, 제목 막대 등의 기본 스타일에 맞게 머티리얼을 선택할 수 있음
<img src="https://velog.velcdn.com/images/it-ju/post/d585d1ce-66f7-4eaa-94c9-45b484d84f8d/image.png" alt=""></p>
<ol>
<li>생동감 설정: 사용자가 선택할 수 있는 옵션으로, 생동감이 활성화되면 콘텐츠가 더 선명하게 보임</li>
<li>배경 혼합 모드 (Blending Modes) - 윈도우 뒤 혼합 (Behind-Window Blending)<ul>
<li>정의: 윈도우 뒤에 있는 콘텐츠를 표시해주며, 앱이나 게임의 진행 상태를 유지</li>
<li>사용 예시: 메뉴, 시트, 사이드바 등에서 자동으로 사용됩니다.</li>
</ul>
</li>
<li>배경 혼합 모드 (Blending Modes) - 윈도우 내 혼합 (In-Window Blending)<ul>
<li>정의: 윈도우 내의 콘텐츠가 다른 윈도우 구성요소를 통해 표시</li>
<li>사용 예시: 도구 막대가 윈도우 콘텐츠와 자연스럽게 혼합되며, 도구 막대 아래에서 스크롤될 때 연속성을 느낄 수 있음</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG 9. 포용성]]></title>
            <link>https://velog.io/@it-ju/HIG-9.-%ED%8F%AC%EC%9A%A9%EC%84%B1</link>
            <guid>https://velog.io/@it-ju/HIG-9.-%ED%8F%AC%EC%9A%A9%EC%84%B1</guid>
            <pubDate>Sun, 23 Feb 2025 16:11:15 GMT</pubDate>
            <description><![CDATA[<p>포용성은 사람을 이해하는 태도에서의 디자인이다.
사람들의 생각과 감정에 대한 선입견을 검토하고 변화하는 지식과 이해에 대해서 열린 자세를 가져야 포용성 있는 디자인을 할 수 있다.</p>
<h1 id="포용성을-고려한-디자인">포용성을 고려한 디자인</h1>
<p>직관적인 경험을 주는 디자인이 좋은 디자인이므로 이를 위해서 사람의 목표와 관점을 조사하여 <strong>공감</strong>할 필요가 있다.</p>
<p>여러 관점으로 검토할 때 중요한 것
포용성 =/= 불쾌감을 주지 않는 것
불쾌감을 주지 않는 것에 관점을 두지 않고 포용성에 관점을 두면 불쾌감도 방지할 수 있음</p>
<h1 id="포용성-있는-표현">포용성 있는 표현</h1>
<ol>
<li>학술적인 어조를 조심하고 직접적으로 작성</li>
<li>사람을 언급할 때, <strong>여러분</strong> 또는 <strong>당신</strong>을 사용하기<ul>
<li>우리 : 소프트웨어 또는 회사를 지칭, 너무 개인적으로 보일 수 있음</li>
<li>사용자, 플레이어 : 거리감 또는 환영받지 못하는 느낌을 줌</li>
</ul>
</li>
<li>전문적이거나 기술적 용어는 꼭 용어를 설명하도록</li>
<li>구어체 표현은 일반적인 표현으로 바꾸기</li>
<li>유머는 주관적이므로 신중하게 쓸 필요가 있음</li>
</ol>
<h1 id="접근가능성-유지하기">접근가능성 유지하기</h1>
<ol>
<li>명확한 인터페이스 적용(플랫폼에 따라 디자인을 변경하도록)</li>
<li>온보딩을 통해서 설명을 포함하기</li>
</ol>
<h1 id="성-정체성">성 정체성</h1>
<ol>
<li>불필요한 성별표기를 피하기</li>
<li>꼭 필요한 경우 논바이너리, 자발적 신원 규정, 명시 거부등의 옵션제공</li>
</ol>
<h1 id="사람-및-세팅">사람 및 세팅</h1>
<ol>
<li>사람을 나타낼 때 다양한 인종, 유형, 나이 등을 표현하기</li>
</ol>
<h1 id="고정관념-피하기">고정관념 피하기</h1>
<ol>
<li>평범한 질문도 누군가 경험하지 못할 수 있다는 상황을 고려하기</li>
</ol>
<h1 id="접근성">접근성</h1>
<ol>
<li>장애를 가진 사람을 제외하는 이미지와 표현 삼가기</li>
<li>장애를 인정하고 장애가 없는 사람을 정상, 건강, 일반 으로 표현하지 않기</li>
<li>모든 사람들이 사용할 수 있도록 간결성과 인식용이성을 우선시하기</li>
</ol>
<h1 id="언어">언어</h1>
<ol>
<li>현지화를 위해 번역 텍스트와 리소스 제공</li>
<li>문화를 고려한 평이한 표현 사용하기</li>
<li>각 국가에서의 색상의 의미 고려하기</li>
</ol>
<hr>
<p>포용성이 접근성과 관련이 있는줄 알았는데 접근성만 고려하기엔 포용성이 훨씬 더 큰 개념이였다.
디자인은 사람을 공감하는 자세가 필요하다는 것을 한 번 더 인식한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG 8. 레이아웃]]></title>
            <link>https://velog.io/@it-ju/HIG-8.-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</link>
            <guid>https://velog.io/@it-ju/HIG-8.-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</guid>
            <pubDate>Tue, 18 Feb 2025 00:58:31 GMT</pubDate>
            <description><![CDATA[<p>일관된 레이아웃은 사용자에게 모든 기기에서 같은 경험을 하도록 도와줍니다.</p>
<h2 id="적응성">적응성</h2>
<p>모든 앱과 기기는 시스템 컨텍스트가 변경 될 경우 조정이 필요함
SwiftUI 또는 자동 레이아웃을 사용하면 동적으로 조정되는 것을 확인할 수 있음
일반적인 기기 및 시스템 변형의 종류</p>
<p>화면크기, 해상도, 색상 공간
기기방향
다이나믹 아일랜드 및 카메라 제어기와 같은 시스템 기능
iPad의 외장 디스플레이 지원, 디스플레이 확대/축소 및 멀티태스킹 모드
다이나믹 타입 텍스트 크기변경
왼쪽/오른쪽으로 레이아웃 방향 변경
날짜/시간/숫자/형식/서체변경 등 지역기반 다국어</p>
<ol>
<li>안정영역, 여백 안내선을 활용하여 레아이웃 디자인</li>
<li>텍스트 크기 변경에 대비</li>
<li>가장 큰 레이아웃과 작은 레이아웃을 먼저 테스트하고 현지화 작업도 하기</li>
<li>필요한 경우, 아트워크의 크기도 조정</li>
</ol>
<h2 id="시각적-계층">시각적 계층</h2>
<ol>
<li>상단에서 하단으로, 중요도에 따라서 배치</li>
<li>중요한 정보에 충분한 공간을 주기</li>
<li>정보를 시각적으로 그룹화하고 필요한 경우 영역을 분리</li>
<li>정렬과 들여쓰기를 통해서 정보계층 구조화</li>
<li>추가할 항목의 경우 시각적 힌트 제공</li>
<li>구성요소끼리 너무 가까운 경우 구분이 어려움</li>
</ol>
<h2 id="안내선-및-안전영역">안내선 및 안전영역</h2>
<p>레이아웃 안내선은 화면에서 콘텐츠 배치, 정렬, 간격을 조정하도록 하는 직사각형 영역을 정의함</p>
<h3 id="안전영역">안전영역</h3>
<p>탐색막대, 탭막대, 도구막대 등 기타 도구에 가려지지 않는 영역
각 플랫폼에서 주요기능을 고려해서 안전영역을 설정해야함</p>
<h1 id="플랫폼-고려사항">플랫폼 고려사항</h1>
<h2 id="iosipados">IOS,IPadOS</h2>
<ol>
<li>가로세로 지원하기</li>
<li>시각적 콘텐츠를 확장하여 화면을 채우기(아트워크 , 스크롤 등)</li>
<li>IOS게임에서 풀 블리드 인터페이스를 사용하기</li>
<li>전각버튼 삽입(오른쪽 아래 안전영역 하단)</li>
<li>가로방향의 경우 양쪽에 화면제어기 배치</li>
<li>하단에 상호작용제어기랑 겹치지 않게 하기</li>
<li>값을 추가하거나 경험을 향상시킬 경우에만 상태막대 가리기</li>
<li>다양한 상태막대에 대응(ex.키보드 나올 경우 안전영역이 좁아짐)<h2 id="macos">macOS</h2>
</li>
<li>윈도우 하단에 제어기나 중요정보 배치하지 않기</li>
<li>상단 가장자리에 카메라 하우징에 콘텐츠 피하기<h2 id="watchos">watchOS</h2>
</li>
<li>화면의 한 가장자리에서 다른 가장자리로 확장하도록 디자인
 베젤이 패딩역할을 함</li>
<li>인터페이스에 4개 이상의 제어기를 나란히 배치하지 않기
 2개정도가 좋음</li>
<li>동작에 반응하도록 회전을 지원</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG 7. 이미지]]></title>
            <link>https://velog.io/@it-ju/HIG-7.-%EC%9D%B4%EB%AF%B8%EC%A7%80</link>
            <guid>https://velog.io/@it-ju/HIG-7.-%EC%9D%B4%EB%AF%B8%EC%A7%80</guid>
            <pubDate>Wed, 12 Feb 2025 04:09:38 GMT</pubDate>
            <description><![CDATA[<p>이미지는 모든 지원기기에서 적절한 비율로 조절되어야한다.</p>
<h2 id="해상도">해상도</h2>
<p>비트맵 이미지는 생성 시에 해상도가 결정 됨
모든 상황에서 고해상도 에셋을 제공할 수 있도록 만들기</p>
<ol>
<li>ipad @2x / ios @2x및 @3x / mac @1x,@2x</li>
<li>이름규칙 &#39;@1x&#39;,&#39;@2x&#39;,&#39;@3x&#39;</li>
<li>해상도를 낮춰서 디자인 후 고해상도 에셋 생성(정렬때문)</li>
</ol>
<h2 id="포맷">포맷</h2>
<ol>
<li>비트맵이미지, 래스터작업물 / 인터레이스가 미적용된 PNG파일</li>
<li>24비트 png / 포맷 8비트 색상팔레트</li>
<li>사진 / jpeg 또는 heic파일</li>
<li>고해상도 플랫아이콘, 인터페이스 아이콘 및 아트워크 / pdf 또는 svg</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG_6. 아이콘]]></title>
            <link>https://velog.io/@it-ju/HIG6.-%EC%95%84%EC%9D%B4%EC%BD%98</link>
            <guid>https://velog.io/@it-ju/HIG6.-%EC%95%84%EC%9D%B4%EC%BD%98</guid>
            <pubDate>Wed, 12 Feb 2025 03:25:48 GMT</pubDate>
            <description><![CDATA[<p>효과적인 아이콘은 이해를 도와줌</p>
<h1 id="모범-사례">모범 사례</h1>
<ol>
<li>간소화된 디자인으로 세부사항을 줄이기</li>
<li>시각적인 일관성 유지(크기, 세부정보, 선 굵기, 시점, 무게감)
<img src="https://velog.velcdn.com/images/it-ju/post/1be0059d-c6ff-4c89-9805-7d4e4b29e329/image.png" alt=""></li>
<li>아이콘은 텍스트와 굵기가 유사하게</li>
<li>시각적 보정으로 아이콘의 무게중심을 맞추기</li>
</ol>
<p><img src="https://velog.velcdn.com/images/it-ju/post/1c67df00-418f-4360-b5b3-f6ee3713148e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/it-ju/post/12895737-8428-42cd-b3f7-7702ce87b995/image.png" alt="">
위보다 아래가 더 시각적으로 안정감이 있음
5. 필요한 경우 색상을 넣는 선색상태버전 제공
6. 성별 등을 아이콘에 넣지 않는 포용성있는 디자인 생성
7. 꼭 필요한 경우만 텍스트 포함
8. 사용자 아이콘을 만드는 경우 pdf와 svg 두개를 제공
9. VoiceOver가 읽을 수 있도록 레이블 제공
10. apple의 하드웨어 모형 사용은 안됨(자주 변하기때문), 디자인리소스 사용</p>
<h2 id="플랫폼-고려사항">플랫폼 고려사항</h2>
<h3 id="macos">macOS</h3>
<p>1.문서아이콘 </p>
<ul>
<li>사용자 설정문서는 오른쪽 상단이 접혀있으므로 오른쪽 상단에 이미지 없도록</li>
<li>문서유형을 나타내는 이미지</li>
<li>작은크기는 디테일을 줄이기</li>
<li>512x512px @1x, 1024x1024px @2x
256x256px @1x, 512x512px @2x
128x128px @1x, 256x256px @2x
32x32px @1x, 64x64px @2x
16x16px @1x, 32x32px @2x</li>
<li>이미지 캔버스에 10%는 여백설정</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG_5. 다크모드]]></title>
            <link>https://velog.io/@it-ju/HIG5.-%EB%8B%A4%ED%81%AC%EB%AA%A8%EB%93%9C</link>
            <guid>https://velog.io/@it-ju/HIG5.-%EB%8B%A4%ED%81%AC%EB%AA%A8%EB%93%9C</guid>
            <pubDate>Wed, 12 Feb 2025 03:16:14 GMT</pubDate>
            <description><![CDATA[<h1 id="다크-모드">다크 모드</h1>
<p>다크모드는 어두운 환경에서 더 나은 시각적 환경을 제공하기 위한 시스템 화면 모드 설정
밝은색은 어둡게 어두운색(220~)은 약간 밝게 조정된다.</p>
<h1 id="모범-사례">모범 사례</h1>
<ol>
<li>화면 모드 설정은 공통으로 사용하게. 개별설정하지 않도록</li>
<li>다크모드, 라이트모드를 모두 설정</li>
<li>콘텐츠 대비를 확인하기.</li>
<li>경우에 따라서 다크모드만 지원해도 괜찮음</li>
</ol>
<h2 id="색상">색상</h2>
<ol>
<li>설정색상 사용</li>
<li>충분한 대비(4.5:1)를 사용하기. 작은텍스트는 7:1</li>
<li>흰색 배경색상의 명도를 다크모드에서 낮추기</li>
</ol>
<h2 id="아이콘-및-이미지">아이콘 및 이미지</h2>
<ol>
<li>SF Symbols을 사용해서 동적색상 사용</li>
<li>필요한 경우 아이콘은 별도로 디자인하기</li>
</ol>
<ul>
<li>filled 아이콘인 경우, 다크모드에서는 line 아이콘으로 디자인</li>
</ul>
<ol start="3">
<li>풀컬러 이미지와 아이콘은 두 화면에서 모두 확인</li>
</ol>
<h2 id="레이블">레이블</h2>
<ol>
<li>시스템 색상 사용</li>
<li>직접 텍스트를 그리는 대신 시스템 제공보기를 사용</li>
</ol>
<h2 id="플랫폼-고려-사항">플랫폼 고려 사항</h2>
<h3 id="iosipados">ios,ipados</h3>
<ol>
<li>다크모드는 기본 / 저심도 - 어두운색이 덜 어두움</li>
<li>다크모드는 시스템 배경색으로 만들기 꼭<h3 id="mac">mac</h3>
</li>
<li>가능하면 배경에 약간의 투명도로 시각적 조화를 계속 유지할 수 있음</li>
</ol>
<ul>
<li>색상을 따로 하지 않는 경우에만 추가하기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG_기본사항 4. 색상]]></title>
            <link>https://velog.io/@it-ju/HIG%EA%B8%B0%EB%B3%B8%EC%82%AC%ED%95%AD-4.-%EC%83%89%EC%83%81</link>
            <guid>https://velog.io/@it-ju/HIG%EA%B8%B0%EB%B3%B8%EC%82%AC%ED%95%AD-4.-%EC%83%89%EC%83%81</guid>
            <pubDate>Sat, 01 Feb 2025 05:01:41 GMT</pubDate>
            <description><![CDATA[<p>색상은 브랜드를 드러내고, 시각적 일관성을 제공하고, 정보를 이해하도록 돕는 좋은 수단이다.</p>
<h1 id="모범-사례">모범 사례</h1>
<ol>
<li>앱은 색상을 절제</li>
<li>동일한 색으로 다른 항목을 사용하지 않도록</li>
<li>라이트모드와 다크모드 모두 고려</li>
<li>주변환경을 고려한 색 테스트</li>
<li>다양한 기기에서 앱 테스트</li>
<li>아트워크와 반투명의 영향을 고려</li>
<li>시스템 제공 색상 제어기를 사용</li>
</ol>
<h1 id="포용적-색상">포용적 색상</h1>
<p>모든 사람에게 색상을 통해 전하는 정보를 동일하게 이해하도록 하는 색상 체계</p>
<ol>
<li>색상에만 의존하는 식별은 금지</li>
<li>대비를 충분히 사용</li>
<li>색상의 문화적 인식을 고려</li>
</ol>
<h1 id="시스템-색상">시스템 색상</h1>
<p>시스템의 <strong>동적 색상</strong>은 <strong>목적</strong>에 의해서 재정의 됨. 
배경색, 전경색, 구분선 색상등으로 분류가 정해진 색상체계를 하나씩 복제하거나 재정의하는 것은 시스템 색상체계를 해칠 수 있음. 또한 동적 색상은 자동으로 라이트 모드와 다크 모드에 따라 자동으로 적용되므로 하나의 단일값을 바꾸는 것이 전체의 일관성을 해칠 수 있음.</p>
<ol>
<li>하드코딩 금지, 색상 API사용</li>
<li>동적 색상은 복제금지</li>
<li>동적 색상 재정의 금지</li>
</ol>
<h1 id="색상-관리">색상 관리</h1>
<p><img src="https://velog.velcdn.com/images/it-ju/post/09470423-b7d2-4fbb-b488-ca758e2742e2/image.png" alt="">
일반적인 색상 공간(전체 색영역이라고도 함)은 sRGB와 Display P3</p>
<ol>
<li>이미지에 색상 프로필 적용</li>
<li>호환 가능한 경우 시각적 경험을 향상하도록 와이드 컬러를 사용</li>
<li>필요할 경우 색상 공간별 이미지와 색상 변형을 제공</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG_기본사항 3. 브랜딩]]></title>
            <link>https://velog.io/@it-ju/HIG%EA%B8%B0%EB%B3%B8%EC%82%AC%ED%95%AD-3.-%EB%B8%8C%EB%9E%9C%EB%94%A9</link>
            <guid>https://velog.io/@it-ju/HIG%EA%B8%B0%EB%B3%B8%EC%82%AC%ED%95%AD-3.-%EB%B8%8C%EB%9E%9C%EB%94%A9</guid>
            <pubDate>Fri, 31 Jan 2025 06:18:32 GMT</pubDate>
            <description><![CDATA[<p>브랜딩은 아이덴티티의 집합체니까 일관되고 명확하게 브랜드를 알아볼 수 있도록 함이 목적인 것 같다.
앱 아이콘도 브랜딩의 사례로 들 수 있음.
그래서 애플 앱스토어에서는 마케팅 리소스와 아이덴티티 가이드라인을 제공해서 효과적인 홍보를 위한 수단으로 사용하고 있음.</p>
<hr>
<h1 id="모범-사례">모범 사례</h1>
<ol>
<li>글에 고유한 스타일 지정</li>
<li>강조 색상 사용</li>
<li>사용자 서체는 기능 사용을 고려하여 적용</li>
<li>브랜드 &lt; 콘텐츠<ul>
<li>로고때문에 공간을 너무 할애하지 않도록</li>
<li>필요하지 않은 경우 꼭 로고가 화면을 채우지 않도록</li>
</ul>
</li>
<li>표준화된 패턴으로 편안함을 느끼도록 구성</li>
<li>실행화면을 브랜딩 기회로 삼지 않기<ul>
<li>브랜딩은 온보딩 화면에서</li>
</ul>
</li>
<li>Apple 상표가 앱 이름이나 이미지에 표시되지 않도록</li>
</ol>
<hr>
<p>브랜드를 구성함에 있어서 체계적인 스타일링 시스템이 필요하다는 것을 느꼈다. 또한 이러한 시스템이 아무리 중요하더라도 질적 콘텐츠가 더 중요하다는 것을 명심해야한다. 양질의 컨텐츠가 체계화 된 디자인 시스템을 만났을 때, 완벽한 브랜딩으로 작용할 수 있을 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG_기본사항 2. 앱 아이콘]]></title>
            <link>https://velog.io/@it-ju/HIG%EA%B8%B0%EB%B3%B8%EC%82%AC%ED%95%AD-2.-%EC%95%B1-%EC%95%84%EC%9D%B4%EC%BD%98</link>
            <guid>https://velog.io/@it-ju/HIG%EA%B8%B0%EB%B3%B8%EC%82%AC%ED%95%AD-2.-%EC%95%B1-%EC%95%84%EC%9D%B4%EC%BD%98</guid>
            <pubDate>Fri, 31 Jan 2025 06:06:35 GMT</pubDate>
            <description><![CDATA[<p>앱 아이콘은 목적과 성격을 전달하고 서비스를 한 눈에 알아볼 수 있게 함
우리도 프로젝트에서 앱 아이콘을 구성해야하는데 그 목적과 모범사례를 통해서 더 좋은 아이콘을 제작하도록 고려해보자.</p>
<h1 id="모범사례">모범사례</h1>
<ol>
<li>간결성</li>
<li>플랫폼별 디자인 제공
<img src="https://velog.velcdn.com/images/it-ju/post/2b497684-ff5d-4b49-81a2-baafe5cd6858/image.png" alt="">
[출처]<a href="https://developer.apple.com/kr/design/human-interface-guidelines/app-icons">https://developer.apple.com/kr/design/human-interface-guidelines/app-icons</a></li>
<li>필수일 경우에만 텍스트 포함</li>
<li>사진보다 그래픽</li>
<li>아이콘이 UI를 반복하지 않도록</li>
<li>아이콘 크기 <strong>1024</strong>x<strong>1024 px</strong></li>
<li>아이콘 일관성 유지, 크기에 따라서 세부사항 간소화</li>
<li>아이콘은 사각형 이미지로 제작</li>
<li>화면 가장자리까지 불투명하게 제작</li>
<li>대체 앱 아이콘 제공을 고려</li>
<li>(저작권)Apple 하드웨어 제품을 본뜬 모양을 사용하지 않도록</li>
</ol>
<h1 id="플랫폼-고려사항">플랫폼 고려사항</h1>
<h2 id="ios-ipados">iOS, iPadOS</h2>
<ol>
<li>시스템 아이콘에 어울리게 어둡고 색조가 적용되는 아이콘 디자인</li>
<li>간소화 버전을 고려</li>
<li>밝은 아이콘을 어두운 아이콘의 기초로 사용</li>
<li>색조에 흑백 음영을 넣기</li>
<li>아이콘에 테두리 넣지않기(자동으로 1px추가됨)</li>
</ol>
<h2 id="macos">macOS</h2>
<ol>
<li>익숙한 도구를 묘사하여 아이콘 디자인</li>
<li>아이콘에 대상체를 표시할 때 질량이 느껴지게 디자인</li>
<li>드롭 그림자 사용</li>
<li>사실묘사를 위해 내부그림자와 하이라이트 사용</li>
<li>모서리가 둥근 직사각형 외에는 윤곽 정의하지 않도록</li>
<li>외부바운딩 안에 모든 콘텐츠를, 내부바운딩 안에 주요 콘텐츠를 넣도록
<img src="https://velog.velcdn.com/images/it-ju/post/cd685f55-aba9-4d03-a79a-51464dfd28c8/image.png" alt=""></li>
</ol>
<h2 id="tvos">tvOS</h2>
<ol>
<li>2~5개의 레이어를 분리시켜 깊이감 있게 구성</li>
<li>콘텐츠가 잘리지 않도록 안정영역 포함</li>
<li>그림자와 그라디언트를 적절히 사용해서 시차효과와 충돌하지 않도록 구성</li>
</ol>
<h2 id="visionos">visionOS</h2>
<ol>
<li>배경레이어 + 대상체(1~2개의 레이어) 를 3D로 구성</li>
<li>배경은 불투명한 풀 블리드 이미지, 선명한 테두리, 구멍이나 오목한 부분 없이</li>
<li>레이어는 사각형으로 제공</li>
<li>정면에서 깊이감이 너무 느껴지지 않도록.</li>
<li>사용자 설정반사 하이라이트나 그림자를 사용하지 않도록</li>
</ol>
<h2 id="watchos">watchOS</h2>
<ol>
<li>원형</li>
<li>배경은 검은색X</li>
</ol>
<h1 id="명세">명세</h1>
<h2 id="속성">속성</h2>
<blockquote>
<p>sRGB(색상), 회색감마 2.2(흑백음영), PNG</p>
</blockquote>
<p>visionOS를 제외한 나머지 아이콘은 Display P3색상을 지원함</p>
<table>
<thead>
<tr>
<th>플랫폼</th>
<th>레이어</th>
<th>투명도</th>
<th>애셋 모양</th>
<th>앱 아이콘 크기</th>
</tr>
</thead>
<tbody><tr>
<td>iOS, iPadOS</td>
<td>단일</td>
<td>아니요</td>
<td>사각형</td>
<td>1024x1024 (App Store)</td>
</tr>
<tr>
<td>macOS</td>
<td>단일</td>
<td>예, 적절함</td>
<td>모서리가 둥근 사각형</td>
<td>1024x1024 (App Store)</td>
</tr>
<tr>
<td>tvOS</td>
<td>다중</td>
<td>아니요</td>
<td>사각형</td>
<td>1280x768 (App Store)</td>
</tr>
<tr>
<td>visionOS</td>
<td>다중</td>
<td>예, 적절함</td>
<td>사각형</td>
<td>1024x1024 (App Store 및 홈 보기)</td>
</tr>
<tr>
<td>watchOS</td>
<td>단일</td>
<td>아니요</td>
<td>사각형</td>
<td>1024x1024 (App Store)</td>
</tr>
</tbody></table>
<hr>
<p>서지영강사님이 앱 아이콘 크기를 1024x1024로 만들라는 이유가 이거였구나 생각함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HIG_기본사항 1. 접근성(Accessibility)]]></title>
            <link>https://velog.io/@it-ju/HIG%EA%B8%B0%EB%B3%B8%EC%82%AC%ED%95%AD-1.-%EC%A0%91%EA%B7%BC%EC%84%B1Accessibility</link>
            <guid>https://velog.io/@it-ju/HIG%EA%B8%B0%EB%B3%B8%EC%82%AC%ED%95%AD-1.-%EC%A0%91%EA%B7%BC%EC%84%B1Accessibility</guid>
            <pubDate>Wed, 29 Jan 2025 16:40:14 GMT</pubDate>
            <description><![CDATA[<p>애플의 휴먼 인터페이스 가이드라인의 기본사항.
열심히 읽고 잘 익혀봅시다.</p>
<hr>
<h1 id="접근성">접근성</h1>
<blockquote>
<p>누구나 제품이나 서비스를 이용하는데 불편함 없이 이용할 수 있는 정도</p>
</blockquote>
<p>접근성은 단순히 장애인, 정보약자 계층 등을 위한 것 뿐만 아니라 어느사람이든 어떤 상황에 발생할 수 있는 불편함을 고려한 설계이기도 하다. 사람들은 떄때로 다양한 시기에 상호작용에 불편함을 겪을 수 있다.</p>
<h1 id="접근성을-고려한-설계">접근성을 고려한 설계</h1>
<h2 id="모범사례">모범사례</h2>
<ol>
<li>애플의 <strong>손쉬운 사용</strong>을 염두하고, <strong>간결성</strong>과 <strong>인식용이성</strong>을 우선시하여 디자인<ul>
<li>손쉬운 사용 : 개인이 원하는 방향으로 인터페이스와 소통하는 기능
  (VoiceOver, 동작 줄이기, 더 큰 텍스트 등)</li>
<li>간결성 : 복잡한 작업을 친숙하고 일관적이게 상호작용하도록 함</li>
<li>인식 용이성 : 시각, 청각, 촉각 중 하나를 사용하지 않아도 인식에 문제가 없도록 함</li>
</ul>
</li>
<li><strong>개인화</strong> 지원<ul>
<li>다양한 상황과 모든 기기, 개인적인 커스텀에서도 경험을 즐기도록 함</li>
<li><strong>다양한 기기 지원 + 표준구성요소</strong>를 함께 지원</li>
<li>(애플의 표준 구성요소)<a href="https://developer.apple.com/kr/design/human-interface-guidelines/components">https://developer.apple.com/kr/design/human-interface-guidelines/components</a></li>
</ul>
</li>
<li><strong>손쉬운 사용</strong>을 통하여 기능을 <strong>테스트</strong></li>
</ol>
<h1 id="상호작용">상호작용</h1>
<p>보조 기술로 기기와 상호작용 할 때 지원방향</p>
<h2 id="보조기술">보조기술</h2>
<ol>
<li><p><strong>VoiceOver</strong></p>
<ul>
<li><strong>대상</strong>: 시각을 이용하기 어려운 사용자</li>
<li><strong>설명</strong>: 화면의 텍스트, 버튼, 이미지 등을 읽어주는 스크린 리더 기능</li>
</ul>
</li>
<li><p><strong>AssistiveTouch</strong></p>
<ul>
<li><strong>대상</strong>: 손이나 팔 등 신체의 일부를 사용하기 어려운 사용자</li>
<li><strong>설명</strong>: 화면 제스처를 대신할 수 있는 가상 버튼이나 메뉴를 제공하여, 물리적인 터치나 제스처를 사용하지 않고도 기기를 제어</li>
</ul>
</li>
<li><p><strong>포인터 제어 (Pointer Control)</strong></p>
<ul>
<li><strong>대상</strong>: 손이나 손가락으로 포인터를 제어하기 어려운 사용자</li>
<li><strong>설명</strong>: 손목, 머리, 또는 다른 신체 부위를 사용하여 포인터를 제어할 수 있게 해주는 기능</li>
</ul>
</li>
<li><p><strong>스위치 제어 (Switch Control)</strong></p>
<ul>
<li><strong>대상</strong>: 손이나 팔의 움직임이 제한적인 사용자</li>
<li><strong>설명</strong>: 다양한 스위치나 버튼을 사용해 화면을 탐색하고 상호작용할 수 있는 기능으로, 신체의 다른 부위나 외부 장치를 이용해 기기를 제어</li>
</ul>
</li>
<li><p><strong>Dwell Control</strong></p>
<ul>
<li><strong>대상</strong>: 눈이나 머리 움직임을 이용해 상호작용이 필요한 사용자</li>
<li><strong>설명</strong>: 사용자가 화면을 일정 시간 동안 응시하면, 해당 항목을 선택하고 실행하는 방식으로, 눈이나 머리의 움직임만으로 화면을 제어</li>
</ul>
</li>
</ol>
<h2 id="제스처">제스처</h2>
<ol>
<li>플랫폼의 기본 제스처를 지우지 않도록</li>
<li>쉬운 제스처를 사용</li>
<li>제스처의 대체방식을 추가로 제공</li>
<li>가능하면 두 가지 이상의 물리적 상호작용으로 접근방식을 제안</li>
<li><em>사용자 설정 제스처의 경우, 앱과 상호작용할 수 있는 대체 방식을 제공하는 보조 기술을 지원</em></li>
<li>접근성 API를 통해, 드래그 앤 드롭을 식별하고 상호작용 할 수 있게 안내</li>
</ol>
<h2 id="버튼-및-제어기">버튼 및 제어기</h2>
<ol>
<li>터치스크린 기기 최소 44*44px</li>
<li>visionOs 60px이상 간격</li>
<li>버튼에 대한 설명과 특징을 지정</li>
<li>일관된 스타일 계층으로 중요성 나타내기</li>
<li>시스템 제공 스위치의 구성요소를 그대로 사용</li>
<li>색상 외에도 시각적 지표를 추가하는 것을 고려하기</li>
</ol>
<h2 id="사용자-입력">사용자 입력</h2>
<ol>
<li>키보드외 음성입력 지원</li>
<li>Siri와 단축어를 지원하여 음성만으로도 중요한 작업을 수행하도록 지원</li>
<li>일반 텍스트 선택을 막지않기.</li>
</ol>
<h2 id="햅틱">햅틱</h2>
<blockquote>
<p>촉각 또는 촉감을 통한 피드백, 예시로 <strong>진동</strong>이나 <strong>압력변화</strong></p>
</blockquote>
<ol>
<li>시스템 정의 햅틱을 지원
사용자가 혼란을 느끼지 않도록 일관된 햅틱을 사용</li>
</ol>
<h1 id="voiceover">VoiceOver</h1>
<p>시각적 콘텐츠에 대한 청각적 설명</p>
<h2 id="콘텐츠-설명">콘텐츠 설명</h2>
<ol>
<li>의미가 있는 모든 이미지 설명제공</li>
<li>인포그래픽에 설명제공</li>
<li>이미지가 장식용인 경우 보조기술에서 가리기</li>
<li>각 페이지에 제목 지정, 섹션에도 적절한 머릿말 제공</li>
<li>모든 사람이 비디오 및 오디오 콘텐츠를 즐기도록 정보제공</li>
</ol>
<h2 id="탐색">탐색</h2>
<ol>
<li>모든 요소를 탐색하도록 하기</li>
<li>요소의 그룹과 정렬 또는 연결을 지정하여 경험을 향상</li>
<li>레이아웃이 변경되면 VoiceOver도 변경</li>
<li>버튼 또는 제어기가 다른 웹,앱을 여는 경우 예측 가능하도록 표시</li>
<li>중요한 인터페이스 요소에 대체텍스트 제공</li>
<li>필요할 경우, VoiceOver 로터 지원<ul>
<li>VoiceOver로터 : 제스쳐 기반 컨트롤 도구, 스와이프나 스크롤로 읽기방식 전환시킴</li>
</ul>
</li>
<li>키보드만으로 모든 구성요소를 탐색하고 상호작용하도록 지원</li>
</ol>
<h1 id="텍스트-표시">텍스트 표시</h1>
<p>&#39;타이포그래피&#39;에서 더 자세히 다룰 예정
[애플 타이포그래피]<a href="https://developer.apple.com/kr/design/human-interface-guidelines/typography">https://developer.apple.com/kr/design/human-interface-guidelines/typography</a>
[애플 디자인리소스] <a href="https://developer.apple.com/design/resources/#ios-apps">https://developer.apple.com/design/resources/#ios-apps</a>
애플 디자인 리소스에서 각 플랫폼에 대한 다이나믹타입 크기표를 다운받을 수 있음</p>
<table>
<thead>
<tr>
<th>텍스트 스타일</th>
<th><strong>iOS / iPadOS (기본)</strong></th>
<th><strong>macOS</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>표준 크기</strong> (Default)</td>
<td>17pt</td>
<td>13pt</td>
</tr>
<tr>
<td><strong>헤드라인</strong> (Headline)</td>
<td>28pt</td>
<td>24pt</td>
</tr>
<tr>
<td><strong>서브헤드라인</strong> (Subheadline)</td>
<td>22pt</td>
<td>20pt</td>
</tr>
<tr>
<td><strong>본문</strong> (Body)</td>
<td>17pt</td>
<td>13pt</td>
</tr>
<tr>
<td><strong>캡션</strong> (Caption)</td>
<td>12pt</td>
<td>12pt</td>
</tr>
<tr>
<td><strong>리스트 항목</strong> (List)</td>
<td>17pt</td>
<td>13pt</td>
</tr>
<tr>
<td><strong>타이틀</strong> (Title)</td>
<td>34pt</td>
<td>28pt</td>
</tr>
<tr>
<td><strong>기본 텍스트 크기</strong> (Body)</td>
<td><strong>17pt (기본)</strong></td>
<td><strong>13pt (기본)</strong></td>
</tr>
<tr>
<td><strong>더 큰 텍스트</strong> (Larger Text)</td>
<td>사용자가 크기 조정 가능</td>
<td>사용자가 크기 조정 가능</td>
</tr>
</tbody></table>
<hr>
<p>개인적으로 궁금한 부분
<strong>다이나믹 타입과 더 손쉬운 사용 글자크기</strong></p>
<blockquote>
<p>📌다이나믹 타입(Dynamic Type)
    접근성 향상을 위해 사용자가 조정할 수 있는 텍스트 크기의 종류</p>
</blockquote>
<blockquote>
<p>📌더 큰 손쉬운 사용 글자 크기 (Larger Accessibility Sizes)
    다이나믹 타입을 넘어서는 텍스트 크기의 타입, 시력 약자가 주로 사용</p>
</blockquote>
<hr>
<h2 id="고려사항">고려사항</h2>
<ol>
<li>각 플랫폼에서 다이나믹타입을 사용하고 앱의 <strong>레이아웃</strong> 점검</li>
<li>서체 크기가 증가할 때 텍스트 <strong>잘림 최소화</strong>해야 함<ul>
<li>열리고 닫는 형태가 아닌 경우 필요한 만큼 스크롤 하도록 지원</li>
</ul>
</li>
<li>큰 서체 사용 시 <strong>열의 수</strong>를 <strong>줄이고</strong> 가독성을 향상시키도록 지원<ul>
<li>서체 증가 시 한 열에서 제공하는 레이아웃을 변경</li>
</ul>
</li>
<li>서체 크기 증가 시, 중요 <strong>아이콘</strong>의 <strong>크기도 증가</strong></li>
<li>서체가 크더라도 <strong>정보계층</strong>은 <strong>일관</strong>되게 주요정보는 상단에 위치</li>
<li>볼드 텍스트를 킨 경우 보기 좋도록 </li>
</ol>
<h2 id="텍스트-표시의-주의사항">텍스트 표시의 주의사항</h2>
<ol>
<li>앱에서 얇은 글씨</li>
<li>꼭 필요하지 않은 경우, 폰트 변경.</li>
<li>텍스트 양쪽정렬</li>
<li>긴 구절 이텔릭체</li>
<li>전체대문자</li>
<li>읽기 어려운 폰트</li>
</ol>
<h1 id="색상-및-효과">색상 및 효과</h1>
<ol>
<li>색상만으로 주요한 정보전달은 피하기, 꼭 텍스트레이블과 글리프 추가하기</li>
<li>가급적 시스템 색상 사용</li>
<li>색상조합으로 상태 또는 값 구분은 피하기</li>
<li>색 반전을 고려하기</li>
<li>굵기와 크기에 따른 색상 대비비율을 고려하기</li>
</ol>
<table>
<thead>
<tr>
<th><strong>텍스트 크기</strong></th>
<th><strong>텍스트 굵기</strong></th>
<th><strong>최소 대비 비율</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>최대 17포인트</strong></td>
<td>모두</td>
<td>4.5:1</td>
</tr>
<tr>
<td><strong>18포인트 이상</strong></td>
<td>모두</td>
<td>3:1</td>
</tr>
<tr>
<td><strong>모두</strong></td>
<td>볼드체</td>
<td>3:1</td>
</tr>
</tbody></table>
<ol start="6">
<li>투명도를 줄일 때 흐림효과 추가</li>
</ol>
<h1 id="동작">동작</h1>
<ol>
<li>애니메이션에 의존하지 않고 앱을 사용하도록 하기</li>
<li>동작줄이기가 켜져있을 때, 제한 된 애니메이션을 재생하도록 구상<ul>
<li>바운스 효과 줄이기</li>
<li>레이어의 깊이를 애니메이션으로 표현하지 않기</li>
<li>흐림효과를 애니메이션으로 표현하지 않기</li>
<li>움직임을 없애도록 슬라이드를 페이드로 대치</li>
</ul>
</li>
<li>비디오 및 기타 움직임은 재생버튼으로 재생</li>
<li>움직이거나 깜빡이는 요소를 표시할 때 &#39;뇌전증&#39;을 일으킬 수 있음</li>
</ol>
<hr>
<p>여러가지 정리하면서 보니까 기존에 만들었던 웹사이트의 허점이 들어난다.
기억나는 것들을 간략하게 적어보면</p>
<ol>
<li>제스쳐의 대체방식 제공이 미흡</li>
<li>텍스트 선택을 강제로 막음(보이스 리더 사용을 막아버림..)</li>
<li>버튼의 크기와 형태에 대한 명확한 시스템이 없음</li>
<li>텍스트 스타일에 대한 지정이 없음</li>
<li>애니메이션의 남용
꼭.. 신경써서 사이트를 수정하도록 하자</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[사이트 개선) 온고롱 홈페이지 -1]]></title>
            <link>https://velog.io/@it-ju/%EC%82%AC%EC%9D%B4%ED%8A%B8-%EA%B0%9C%EC%84%A0-%EC%98%A8%EA%B3%A0%EB%A1%B1-%ED%99%88%ED%8E%98%EC%9D%B4%EC%A7%80-1</link>
            <guid>https://velog.io/@it-ju/%EC%82%AC%EC%9D%B4%ED%8A%B8-%EA%B0%9C%EC%84%A0-%EC%98%A8%EA%B3%A0%EB%A1%B1-%ED%99%88%ED%8E%98%EC%9D%B4%EC%A7%80-1</guid>
            <pubDate>Tue, 23 Apr 2024 03:39:44 GMT</pubDate>
            <description><![CDATA[<p>나의 온고롱 사이트 리팩토링 일지
이걸 리팩토링이라 할 지 고민은 된다. 그러면 업데이트 일지!</p>
<p>계획수립 =&gt; 일정정리 =&gt; 실행 =&gt; 검토 =&gt; 최종확인 순으로 진행예정</p>
<p>사이트 개선에 대한 계획과 목록을 정리한다.</p>
<h2 id="사이트-기준사양">사이트 기준사양</h2>
<table>
<thead>
<tr>
<th>WEB</th>
<th>ANDROID</th>
<th>IOS</th>
</tr>
</thead>
<tbody><tr>
<td>1920 * 1080</td>
<td>galaxy S9+</td>
<td>iphone 8</td>
</tr>
</tbody></table>
<h2 id="계획">계획</h2>
<ol>
<li>수정 계획<ul>
<li>공통<ul>
<li>배경색상 변경</li>
<li>폰트 크기 변경</li>
<li>상단메뉴 width</li>
<li>하단 소개 글자크기</li>
</ul>
</li>
<li>메인 페이지<ul>
<li>html코드 for문으로 데이터 넣기</li>
<li>리뷰, 인기상품 컴포넌트 디자인 변경(padding 추가)</li>
<li>검색창 말풍선 커서 표시</li>
<li>부드러운 스크롤 제거</li>
<li>하단 링크아이콘 크기설정(MB)</li>
<li>공통 코드 정리</li>
<li>상하단 네비게이션 바 추가</li>
</ul>
</li>
<li>오시는길 페이지<ul>
<li>하단 탭 디자인(음영감 좀 더 깊게)</li>
<li>공통 코드 정리</li>
</ul>
</li>
<li>고객센터 페이지<ul>
<li>코드 정리</li>
<li>궁금하신 사항 제거</li>
</ul>
</li>
<li>온고롱안내 페이지<ul>
<li>소개글 더 빠른 animation</li>
<li>소개글 스크롤 내리면 다 보여주기</li>
<li>주문순서 안내 수정하기</li>
</ul>
</li>
<li>주문하기 페이지<ul>
<li>디자인 개선</li>
<li>달력페이지 완성하기</li>
<li>시계페이지 완성하기</li>
<li>주문신청 단계이동 작성 전 막기</li>
<li>주문완료 시 페이지 정리 및 이동링크</li>
</ul>
</li>
</ul>
</li>
</ol>
<h2 id="일정">일정</h2>
<ul>
<li>메인페이지(22~23)</li>
<li>오시는길페이지(23)</li>
<li>온고롱안내(23~24)</li>
<li>주문하기(24~25)</li>
<li>공통(25)</li>
<li>검토(25~26)</li>
<li>부족한 부분 정리(27)</li>
</ul>
<h2 id="22일-진행사항">22일 진행사항</h2>
<ol>
<li>코드 복제 후 기존코드 저장</li>
<li>메인페이지 코드 확인</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[이슈) baronha_react-native-multiple-image-picker:compileDebugKotlin FAILED]]></title>
            <link>https://velog.io/@it-ju/%EC%9D%B4%EC%8A%88-baronhareact-native-multiple-image-pickercompileDebugKotlin-FAILED</link>
            <guid>https://velog.io/@it-ju/%EC%9D%B4%EC%8A%88-baronhareact-native-multiple-image-pickercompileDebugKotlin-FAILED</guid>
            <pubDate>Thu, 18 Apr 2024 07:25:40 GMT</pubDate>
            <description><![CDATA[<h3 id="이슈-발생의-과정">이슈 발생의 과정</h3>
<p>react-native-multiple-image-picker 라이브러리 사용 중 아래의 코드를 삽입 후 처리하는 과정에서 오류가 발생</p>
<p>import도 잘 되어있고, 가이드에 맞게 처리했는데 openPicker를 찾지 못함</p>
<pre><code class="language-tsx">const selectPhotoPickerAndroid = async () =&gt; {
    const options = {
      maxSelectedAssets: 10,
      doneTitle: &#39;선택완료&#39;,
      cancelTitle: &#39;X&#39;,
      selectedColor: &#39;#048AD4&#39;,
    };
    try{
      const response = await openPicker(options);
      console.log(response);
    }catch(e){
      console.log(e);
    }
  };
</code></pre>
<h3 id="에러메세지">에러메세지</h3>
<p>TypeError: Cannot read property ‘openPicker’ of null</p>
<h3 id="원인">원인</h3>
<p>컴파일 에러로 인해서 openPicker가 불러와지지 않는 상황
<img src="https://velog.velcdn.com/images/it-ju/post/0d9e36ad-e4e5-4348-8564-00c75f56641f/image.png" alt=""></p>
<p><a href="https://github.com/baronha/react-native-multiple-image-picker/issues/134">깃허브 이슈내용</a>에 따르면 rn0.73으로 업그레이드한 후 Android는 일부 파일을 찾을 수 없다는 오류를 보고한다고 함</p>
<h3 id="해결방안">해결방안</h3>
<p>찾을 수 없는 R.drawable.ps_image_placeholder의 R을 com.luck.picture.lib.R로 변경</p>
<ol>
<li><p>콘솔창에 원인에 있는 코드라인 클릭
<img src="https://velog.velcdn.com/images/it-ju/post/667d68c4-6b4a-4c20-8136-c60a89a8c3de/image.png" alt=""></p>
</li>
<li><p>R을 com.luck.picture.lib로 바꾸기 ( 216라인)</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/it-ju/post/f831db4e-f6e5-4c3c-8c98-3a7fc1ff1513/image.png" alt=""></p>
<ol start="3">
<li>다른 코드라인도 반복!!</li>
</ol>
<h3 id="결론">결론</h3>
<p>다른 라이브러리와 React-native 업데이트 이후 호환 문제였다.</p>
<p>수정안을 다른사람이 올려주지 않았다면 처리가 어려웠을 듯 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git init, git commit, git fork 원격저장소 복제하기]]></title>
            <link>https://velog.io/@it-ju/git-init-git-commit-git-fork-%EC%9B%90%EA%B2%A9%EC%A0%80%EC%9E%A5%EC%86%8C-%EB%B3%B5%EC%A0%9C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@it-ju/git-init-git-commit-git-fork-%EC%9B%90%EA%B2%A9%EC%A0%80%EC%9E%A5%EC%86%8C-%EB%B3%B5%EC%A0%9C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 15 Apr 2024 10:28:55 GMT</pubDate>
            <description><![CDATA[<p>이전까지 나는 github desktop을 이용해서 push, pull, commit등을 진행했다.
하지만 다양한 사용방법을 정확하게 익혀야 협업에 도움을 받을 수 있기에
정리한다!</p>
<h1 id="git-용어">git 용어</h1>
<ol>
<li><p><strong>Repository(저장소)</strong> : 코드나 문서를 저장하는 프로젝트 저장공간</p>
</li>
<li><p><strong>local Repository(로컬 저장소)</strong> : 개발자의 컴퓨터에서 작업되는 프로젝트 저장공간</p>
</li>
<li><p><strong>Remote Repository(원격 저장소)</strong> : 클라우드 서비스(ex)GitHub)를 통해 인터넷 서버에 저장된 공간</p>
</li>
<li><p><strong>Commit(커밋)</strong> : 저장소에 변경된 내용을 메세지와 함께 기록</p>
</li>
<li><p><strong>Branch(브랜치)</strong> : 여러 작업을 동시에 협업하며 수행할 때 사용하는 관리 개념</p>
</li>
<li><p><strong>Merge</strong> : 브랜치 작업 완료 시 기존 코드와 합치는 명령어</p>
</li>
<li><p><strong>Pull</strong> : 원격 저장소에 변경사항을 로컬 저장소에 가져오는 명령어</p>
</li>
<li><p><strong>Push</strong> : 로컬 저장소에 변경사항을 원격 저장소로 업로드하는 명령어</p>
</li>
<li><p><strong>Pull Request</strong> : GitHub 호스팅을 통해 코드 수정을 요구하거나 토론하며 개선하는 개념</p>
</li>
<li><p><strong>Fork</strong> : 다른 사용자의 저장소를 나의 계정으로 복제하는 것(원본 저장소와 독립적 관리 가능)</p>
<h1 id="1-repository-생성---git-init">1. Repository 생성 - git init</h1>
</li>
</ol>
<blockquote>
<p>저장소를 생성할 위치의 directory에서 cmd창을 열고 <code>git init</code>
: 사용할 원격저장소를 현재 디렉토리 기준으로 생성한다.</p>
</blockquote>
<h2 id="사용법">사용법</h2>
<ol>
<li>저장소를 생성할 위치에서 cmd를 입력해서 명령프롬포트를 연다.</li>
</ol>
<img src='https://velog.velcdn.com/images/it-ju/post/96da3ffe-9509-4ad4-a5d1-b7b147094a4d/image.png' style='width: 800px; margin: 0 auto;' title='저장소를 생성할 위치의 디렉토리' />

<hr>
<img src='https://velog.velcdn.com/images/it-ju/post/ca069794-da09-465b-a4a6-1c737d717524/image.png' style='width: 800px; margin: 0 auto;' title='cmd 입력' />

<hr>
<ol start="2">
<li>명령프롬포트에 <code>git init</code> 을 입력한다.
<img src="https://velog.velcdn.com/images/it-ju/post/56ae0a00-88cd-4308-8dd8-a7ebb6389fd4/image.png" alt=""></li>
</ol>
<hr>
<ol start="3">
<li>성공했다면 생성 된 .git 파일을 확인할 수 있다.
<img src="https://velog.velcdn.com/images/it-ju/post/270672c0-fd0d-43d1-b746-80f02187ab6f/image.png" alt=""></li>
</ol>
<h1 id="2-작업상태-추가---git-add">2. 작업상태 추가 - git add</h1>
<blockquote>
<p><code>git add &lt;파일명/디렉토리 경로&gt;</code>
: 변경 파일 또는 디렉토리를 스테이징 영역(staging area)에 추가
<code>git add .</code>
: 현재 디렉토리의 모든 변경내용을 스테이징 영역에 추가(하위 디렉토리만 포함)
<code>git add -A</code>
: 작업 디렉토리의 변경내용을 스테이징 영역에 추가(상위, 하위 디렉토리 포함)
<code>git add -p</code>
: 변경사항을 터미널에서 확인하면서 스테이징 영역에 추가</p>
</blockquote>
<p><code>git add</code>는 로컬 디렉토리상의 변경 된 내용을 스테이징 영역에 추가하는 명령어이다.
<code>commit</code>과 달리 깃 저장소의 변경이력에 어떠한 영향도 주지 않는다.</p>
<h2 id="사용법-1">사용법</h2>
<h3 id="1-git-add-파일명">1) git add &lt;파일명&gt;</h3>
<ol>
<li>파일생성(test 쓰려다 오타남;)
<img src="https://velog.velcdn.com/images/it-ju/post/228bd166-0dac-483b-973b-ed331678d379/image.png" alt=""></li>
<li>cmd 창에 <code>git add [파일명]</code> 입력
<img src="https://velog.velcdn.com/images/it-ju/post/4e8d6cde-e68f-4db6-87d2-3a3b31722c05/image.png" alt=""></li>
<li>작업상태 <code>git status</code>로 확인
<img src="https://velog.velcdn.com/images/it-ju/post/d45d018c-b418-4f76-b9a8-f2c372a04e3f/image.png" alt=""></li>
</ol>
<h3 id="2-git-add-">2) git add .</h3>
<ol>
<li>파일명 수정
<img src="https://velog.velcdn.com/images/it-ju/post/7c09467b-d26e-4a43-a66d-0192d7ac23fc/image.png" alt=""></li>
<li>cmd 창에 <code>git add .</code> 입력 후 작업상태 <code>git status</code>로 확인
<img src="https://velog.velcdn.com/images/it-ju/post/fb87048e-a538-49d4-a0d3-d0c91afc819b/image.png" alt=""></li>
</ol>
<h3 id="3-git-add--a">3) git add -A</h3>
<ol>
<li>하위폴더 생성 및 파일추가
<img src="https://velog.velcdn.com/images/it-ju/post/721f716b-19cb-402a-b937-ad47ee0a5ae8/image.png" alt=""></li>
<li>cmd 창에 <code>cd 하위폴더멍</code>으로 폴더 접근 후 <code>git add -A</code> 입력
<img src="https://velog.velcdn.com/images/it-ju/post/f99ca713-3a89-47d1-aeaf-2124374484c5/image.png" alt=""></li>
<li><code>git status</code>로 작업상태 확인
<img src="https://velog.velcdn.com/images/it-ju/post/45f91ea9-46d8-4282-ab81-f594a3caf1f5/image.png" alt=""></li>
</ol>
<h3 id="4-git-add--p">4) git add -p</h3>
<ol>
<li><p>파일추가 및 파일내용 변경
<img src="https://velog.velcdn.com/images/it-ju/post/de85b5db-c053-44b2-8d2a-e014d1dbdac4/image.png" alt=""></p>
</li>
<li><p>cmd 창에 <code>cd ..</code>으로 상위폴더 이동 후 <code>git add -p</code> 입력, 내용변경을 진행할 것이므로 y로 진행
<img src="https://velog.velcdn.com/images/it-ju/post/f823bbc4-88e4-47b4-ad6f-03e120f113bd/image.png" alt=""></p>
</li>
<li><p><code>git status</code>로 작업상태 확인
<img src="https://velog.velcdn.com/images/it-ju/post/014498c5-7e17-4518-b7e6-6ae87a1f7c32/image.png" alt=""></p>
</li>
</ol>
<p>🤔🤔 <code>git add -p</code>는 하위폴더의 변경상태는 적용되지 않네?</p>
<ol start="4">
<li>확인을 위해 한번 더 <code>git add -p</code>
<img src="https://velog.velcdn.com/images/it-ju/post/cba48b28-2e2b-4295-9d51-fb1df188195c/image.png" alt=""></li>
</ol>
<h3 id="-a-와-의--p차이"><code>-A</code> 와 <code>.</code>의 <code>-p</code>차이</h3>
<blockquote>
<p><code>git add -A</code>는 작업 디렉토리 상에 어디에 위치하든 항상 동일하게 모든 변경 내용을 스테이징으로 넘깁니다. 
반면에 <code>git add .</code>는 명령어를 실행한 디렉토리 이하에서 발생한 변경 내용만 포함하며, 해당 디렉토리 기준으로 상위 디렉토리의 변경 내용을 포함하지 않습니다. 
<code>git add -p</code>는 현재 디렉토리의 변경상태를 감지하여 hunk(조각)를 만들어서 스테이징으로 넘깁니다. 하위폴더의 변경사항을 감지하지 못합니다.</p>
</blockquote>
<h2 id="git-add-뒤에-옵션이-없으면"><code>git add</code> 뒤에 옵션이 없으면?</h2>
<p><img src="https://velog.velcdn.com/images/it-ju/post/68468d8b-e8f4-498c-a646-5bebfc7b1477/image.png" alt=""></p>
<p>뒤에 파일 명 없이 git add 했더니, 어떤 것도 더해지지 않았다.
문제사항을 보기 위해 git status 했다.
<img src="https://velog.velcdn.com/images/it-ju/post/1b162eac-4521-4309-90a8-174c4844e344/image.png" alt=""></p>
<p>브랜치 안에 커밋이 아직 없고 추척되지 않는 파일을 add시키라는 설명이 나와있다.
** 옵션은 선택이 아닌 필수! **</p>
<h2 id="add-취소하기---git-rm---cached">add 취소하기 - git rm --cached</h2>
<blockquote>
<p><code>git rm --cached 파일명</code> : add 된 파일을 깃이 추척하지 않는 상태로 스테이지에서 내린다.</p>
</blockquote>
<h3 id="사용법-2">사용법</h3>
<ol>
<li><p>cmd창에 <code>git rm --cached 파일명</code>를 입력한다.</p>
</li>
<li><p><code>git status</code>로 작업상태를 확인한다.</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/it-ju/post/7fb65d30-3de1-4d9e-a84f-104507949f07/image.png" alt=""></p>
<h2 id="-여러가지-hunk파일-조각-명령어-">** 여러가지 hunk(파일 조각) 명령어 **</h2>
<p>y : 이 조각(hunk) 이 이후 커밋에 포함될 수 있도록 stage 시킨다
n : 이 조각이 이후 커밋에 포함되지 않도록 stage 대상에서 제외한다
q : 종료; 이 조각 및 이후 모든 조각들을 stage 시키지 않는다
a : 이 조각과 이후 현재 파일 내 모든 조각들을 stage 시킨다
d : 이 조각 및 이후 현재 파일 내의 모든 조각들을 stage 시키지 않는다
g : 파일 내의 다른 조각들의 목록을 표시하고 이동할 조각 위치를 선택한다
/ : 정규표현식을 이용해 조각을 검색하고 해당 위치로 이동한다
j : 현재 조각에 대한 결정은 뒤로 미루고 다음 미확정 조각 위치로 이동한다
J : 현재 조각에 대한 결정은 뒤로 미루고 확정 여부와 상관없이 다음 조각 위치로 이동한다
k : 현재 조각에 대한 결정은 뒤로 미루고 이전 미확정 조각 위치로 이동한다
K : 현재 조각에 대한 결정은 뒤로 미루고 확정 여부와 상관없이 이전 조각 위치로 이동한다
s : 현재 조각을 더 작은 단위의 조각으로 나눈다
e : 현재 조각 내용을 직접 편집한다
? : 조각 관련 조작 도움말을 표시한다</p>
<h1 id="3-local-repository에-변경상태-저장---git-commit">3. local Repository에 변경상태 저장 - git commit</h1>
<blockquote>
<p><code>git commit -m &quot;커밋 메세지&quot;</code>
: staging area에 저장되어있는 변경 사항을 로컬저장소에 저장한다.
<code>git commit --amend -m &quot;수정된 메시지&quot;</code>
: commit상태의 메세지를 수정한다.</p>
</blockquote>
<h2 id="사용법-3">사용법</h2>
<ol>
<li>로컬저장소에 저장할 디렉토리에서 cmd를 열어서 <code>git commit -m &quot;커밋 메세지&quot;</code>를 입력
<img src="https://velog.velcdn.com/images/it-ju/post/f6958436-5402-4c84-9208-57fb4435b3d3/image.png" alt=""></li>
</ol>
<h2 id="메세지-수정하기">메세지 수정하기</h2>
<ol>
<li>cmd창에 <code>git commit --amend -m &quot;수정된 메시지&quot;</code>를 입력
<img src="https://velog.velcdn.com/images/it-ju/post/5e02a8bd-fbdb-4e63-be23-fe4faae0ad10/image.png" alt=""></li>
</ol>
<h1 id="4-remote-repository-연결---git-remote">4. Remote Repository 연결 - git remote</h1>
<blockquote>
<p><code>git remote add origin https://github.com/[본인계정명]/[디렉토리명]</code>
: github의 원격저장소(Remote Repository)와 내 디렉토리를 연결한다.
<code>git remote -v</code>로 연결상태를 확인할 수 있다.
<code>git remote remove origin</code>로 저장소연결을 삭제할 수 있다.</p>
</blockquote>
<h2 id="사용법-4">사용법</h2>
<ol>
<li><p>cmd창에 <code>git remote add origin https://github.com/[본인계정명]/[디렉토리명]</code>
<img src="https://velog.velcdn.com/images/it-ju/post/59933747-d7f3-4782-a044-f1ff6080877b/image.png" alt=""></p>
</li>
<li><p><code>git remote -v</code>로 연결 확인
<img src="https://velog.velcdn.com/images/it-ju/post/7e103ddf-c2ae-441c-9609-5520de7af1ff/image.png" alt=""></p>
</li>
</ol>
<h1 id="5-원격저장소에-push---git-push">5. 원격저장소에 push - git push</h1>
<blockquote>
<p><code>git push &lt;remote&gt; &lt;branch&gt;</code>
: remote는 저장소명 branch는 브랜치이름 으로 깃 저장소에 푸쉬함
<code>git push origin main</code>
: 메인 브랜치에 origin을 원격저장소로 푸쉬함</p>
</blockquote>
<p><code>git push &lt;remote&gt; &lt;branch&gt;</code> 사용자가 이 두 매개변수를 지정하지 않는다면 Git는 기본적으로 origin을 원격 저장소로, 현재 작업하고 있는 브랜치를 푸시할 브랜치로 지정한다.
현재 작업 중인 브랜치가 main인 경우, git push 명령어는 두 개의 기본 매개변수를 제공하기 때문에 git push origin main과 동일하게 실행된다.</p>
<h2 id="사용법-5">사용법</h2>
<ol>
<li><p>cmd에 <code>git push origin main</code> 입력
😨😨😨<span style='color:red;fontWeight:bold;letterSpacing:2px;'>ERROR</span>😨😨😨</p>
<img src='https://velog.velcdn.com/images/it-ju/post/21b10f08-7e3b-41c4-b458-1f321b092e34/image.png' style='width: 800px; margin: 0 auto;' title='경로오류' />
😢 에러코드
: failed to push some refs to 'https://github.com/itjuh/gitTEST'
https://github.com/itjuh/gitTEST라는 경로를 참조하여 push할 수 없음.
🤔 원인
: 저장소를 깃허브에 만들 지 않고 자동생성해준다 생각하고 바로 적었기 때문~
🙂 해결 
: 깃허브에 저장소 생성 후 http링크를 가져와서 연결했다.
</li>
<li><p><code>git remote remove origin</code>입력 : 원격저장소 주소변경을 위한 삭제</p>
</li>
<li><p><code>git remote add origin https://github.com/itjuh/testRepo.git</code>입력</p>
</li>
<li><p>cmd에 <code>git push origin main</code> 입력
😨😨😨<span style='color:red;fontWeight:bold;letterSpacing:2px;'>ERROR</span>😨😨😨</p>
<img src='https://velog.velcdn.com/images/it-ju/post/2b2f6c55-33a1-42a9-b800-e0fc280ebe14/image.png' style='width: 800px; margin: 0 auto;' title='경로오류' />

<p>😢 에러코드
: failed to push some refs to &#39;<a href="https://github.com/itjuh/testRepo.git&#39;">https://github.com/itjuh/testRepo.git&#39;</a>
<a href="https://github.com/itjuh/testRepo.git%EB%9D%BC%EB%8A%94">https://github.com/itjuh/testRepo.git라는</a> 경로를 참조하여 push할 수 없음.
🤔 원인
: 저장소 내에 브랜치명이 main이 아니고 master임
🙂 해결 
: git push origin으로 브랜치명을 확인하고 다시 push함!</p>
<img src='https://velog.velcdn.com/images/it-ju/post/05b45af1-7870-45ca-9b0f-7496745bab50/image.png' style='width: 800px; margin: 0 auto;' title='경로오류' />

</li>
</ol>
<h2 id="비공개-저장소에-push">비공개 저장소에 push</h2>
<p>Private 저장소의 경우 Ssh key를 사용하여 업로드를 해야 함
<a href="https://github.com/settings/keys">https://github.com/settings/keys</a> 로 접속하면 ssh키를 등록할 수 있다고 함</p>
<blockquote>
<p><code>git remote add origin git@github.com:[사용자닉네임]/[저장소경로]</code>
<code>Enter passphrase for key &#39;/Users/.ssh/id_rsa&#39;:</code></p>
</blockquote>
<p><a href="https://ittrue.tistory.com/88">참고)git ssh 키 생성 및 등록</a>
<a href="https://www.daleseo.com/git-add/">참고) git add 사용법</a></p>
<h1 id="6-원격-저장소에서-pull---git-pull">6. 원격 저장소에서 pull - git pull</h1>
<blockquote>
<p><code>git pull</code>
: 원격 저장소에 있는 변경사항을 로컬저장소로 가져와서 자동으로 병합(merge)
<code>git pull [원격 저장소의 이름] [원격 저장소에서 받아오고자 하는 브랜치의 이름]</code>
: 원하는 저장소의 원하는 브랜치를 로컬저장소로 받아와서 병합</p>
</blockquote>
<h2 id="사용법-6">사용법</h2>
<ol>
<li><p>저장소 연결상태 확인 <code>git remote -v</code></p>
</li>
<li><p>저장 할 로컬 디렉토리에서 <code>git pull</code>입력
<img src="https://velog.velcdn.com/images/it-ju/post/55d30889-ec67-4f10-b061-444f234e8bf2/image.png" alt=""></p>
</li>
</ol>
<h1 id="7-새로운-브랜치-생성하기---git-branch">7. 새로운 브랜치 생성하기 - git branch</h1>
<blockquote>
<p><code>git branch [브랜치명]</code>
: 로컬 저장소에 새로운 버전을 관리할 브랜치를 생성한다.
<code>git push -u origin [브랜치명]</code>
: 원격 저장소에 생성된 브랜치를 push한다.</p>
</blockquote>
<h2 id="사용법-7">사용법</h2>
<ol>
<li>main브랜치 생성을 위해 로컬 저장소의 루트에서 <code>git branch -M main</code>을 입력</li>
<li>원격에 로컬 브랜치를 적용하기 위해서 <code>git push -u origin main</code>입력<img src='https://velog.velcdn.com/images/it-ju/post/48d8f402-38d3-41bf-a704-cdcab226e415/image.png' style='width: 800px; margin: 0 auto;' title='브랜치생성' /></li>
<li>브랜치 상태 확인을 위해서 <code>git branch --all</code>입력<img src='https://velog.velcdn.com/images/it-ju/post/27aac404-e06e-48fe-a5c2-c73d72ccab94/image.png' style='width: 800px; margin: 0 auto;' title='브랜치상태확인' />

</li>
</ol>
<h1 id="8-브랜치-삭제하기">8. 브랜치 삭제하기</h1>
<blockquote>
<p><code>git branch -d [브랜치명]</code>
: 로컬 저장소에 브랜치를 지운다.
<code>git push [원격이름:origin] --delete [브랜치명]</code>
: 원격 저장소에 브랜치를 지운다.</p>
</blockquote>
<h2 id="사용법-8">사용법</h2>
<ol>
<li><p>dev 브랜치를 삭제하기 위해 <code>git branch -d dev</code>를 입력</p>
</li>
<li><p>삭제된 것을 확인하기 위해 <code>git branch --all</code>을 입력</p>
<img src='https://velog.velcdn.com/images/it-ju/post/54507bbf-917a-4618-8379-aca4b15c0799/image.png' style='width: 800px; margin: 0 auto;' title='로컬브랜치상 삭제' />
🙄삭제되지 않았다.(`git branch`: 로컬저장소 브랜치 확인, `git branch --all`: 원격저장소 브랜치 확인)
</li>
<li><p>원격 저장소에 브랜치를 삭제하기 위해 <code>git push origin --delete dev</code>를 입력</p>
</li>
<li><p>삭제된 것을 확인하기 위해 <code>git branch --all</code>을 입력
<img src="https://velog.velcdn.com/images/it-ju/post/253425d9-db62-49b1-8fe4-6d5062120431/image.png" alt=""></p>
</li>
</ol>
<h1 id="8-브랜치-합치기---git-merge">8. 브랜치 합치기 - git merge</h1>
<blockquote>
<p><code>git merge [브랜치명]</code>
: 브랜치 합치기(1) name의 branch를 현재 branch 로 합친다(merge) 
<code>git rebase master</code>
: 브랜치 합치기(2) - 더 많이 사용하는 방법. </p>
</blockquote>
<h2 id="사용법-9">사용법</h2>
<ol>
<li>현재 브랜치 확인하기 위해 <code>git branch</code></li>
<li>main 브랜치의 업데이트 사항을 master 브랜치로 가져와야 하므로 <code>git switch master</code></li>
<li>현재 브랜치 확인하기 위해 <code>git branch</code></li>
<li>브랜치를 합치기 위해 <code>git merge main</code>
<img src="https://velog.velcdn.com/images/it-ju/post/aaab5264-3ee6-43f2-95dd-8a2eb724449b/image.png" alt=""></li>
<li>브랜치를 merge했는데 아직 처리가 안됐다. 이유는?
깃에서 병합처리를 완료하지 않았기 때문~<h3 id="pull-request-작성승인">pull request 작성/승인</h3>
<img src="https://velog.velcdn.com/images/it-ju/post/436ed7e6-3c66-401f-992c-e77fcb013654/image.png" alt=""></li>
</ol>
<p>요청이 성공적으로 반영되었다.</p>
<h1 id="9-브랜치-fork하기---git-fork">9. 브랜치 fork하기 - git fork</h1>
<blockquote>
<p><strong>fork</strong>
: 원본 저장소와 연결 된 상태로 내 깃허브 저장소로 복제하기
<strong>clone</strong>
: 원본 저장소를 내 저장소로 복제하기(연결이 끊김)</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/it-ju/post/42e00b61-0889-4920-aabe-54bc9293fb12/image.png" alt=""></p>
<h2 id="사용법-10">사용법</h2>
<ol>
<li>fork할 repository주소에서 fork를 클릭하여 create a new fork 진행
<img src="https://velog.velcdn.com/images/it-ju/post/84432744-8d87-40a5-bbce-55ab39fbb058/image.png" alt=""></li>
<li>포크 된 저장소 확인
<img src="https://velog.velcdn.com/images/it-ju/post/1b8191c1-14b4-4676-9c3e-e025b622687a/image.png" alt=""></li>
<li>fork 된 remote repository의 파일을 local repository로 clone하기
<code>git clone [경로] [디렉토리명]</code>
<img src="https://velog.velcdn.com/images/it-ju/post/f2909609-6a94-4ff9-9d87-8d1107ba8376/image.png" alt=""></li>
<li>fork 상태 업데이트
<img src="https://velog.velcdn.com/images/it-ju/post/0f4c110c-194f-4522-94aa-e93f7b19165d/image.png" alt=""></li>
<li>새로운 branch생성 후 pull request 보내기
<img src="https://velog.velcdn.com/images/it-ju/post/46e241a4-8706-4ba0-b401-3c751c8f93d9/image.png" alt=""></li>
</ol>
<p><img src="https://velog.velcdn.com/images/it-ju/post/2bfef912-3a73-49a2-b651-e68610e5c247/image.png" alt=""></p>
<hr>
<p>깃 명령어 사용해보니 github desktop처럼 편리한데 하루종일 걸렸다.
그래도 fork, clone, pull, push등등 여러가지를 해볼 기회가 있어서 뿌듯했다. 
자주 써야지, 까먹지 말자!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[react-native) radio button 구현하기]]></title>
            <link>https://velog.io/@it-ju/react-native-radio-button-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@it-ju/react-native-radio-button-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 09 Apr 2024 06:17:43 GMT</pubDate>
            <description><![CDATA[<p>리액트 네이티브에서 radio 형태의 컴포넌트를 구현하여야 하는 상황이 발행하였다.
따로 지원되는 라이브러리가 없으니 직접 구현하도록 하자!</p>
<h1 id="구현목표">구현목표</h1>
<img src='https://velog.velcdn.com/images/it-ju/post/31c8b1a9-1687-47ea-b8ca-4949b28e6005/image.png' style='marginRight: auto; height: 400px;'>

<h2 id="구성-나누기">구성 나누기</h2>
<ol>
<li>제품 상태의 TextInput 컴포넌트를 클릭</li>
<li>화면 하단에서 리스트가 있는 모달창이 올라옴</li>
<li>리스트는 radio button형태로 1개만 선택가능</li>
<li>선택한 리스트가 있다면 버튼 활성화 없다면 비활성화</li>
<li>모달창 밖을 클릭 시 선택없이 모달창 바뀌기</li>
<li>선택 리스트가 있는 상태에서 확인을 누르면 TextInput에 값 전달</li>
</ol>
<h2 id="textinput-구현">TextInput 구현</h2>
<p>제품상태 컴포넌트는 거래 컴포넌트와 유사한 구성을 가지므로 재사용이 가능하게 TextInput에 값을 여러가지 전달하기로 하였다.</p>
<p>세부적으로 구현해야 하는 기능은</p>
<ul>
<li>직접 입력 막기</li>
<li>TextInput 클릭 시 모달창 열리기</li>
<li>모달에서 선택 된 값 넣어주기</li>
</ul>
<pre><code>
&lt;TextInput
  multiline={isArea}
  style={isArea ? styles.inputArea : styles.inputText}
  value={value}
  placeholder={placeholder}
  onFocus={onPressHandler}
  inputMode={inputType ? undefined : &#39;none&#39;}
  onChangeText={inputType ? onChangeHandler : () =&gt; {}} /&gt;</code></pre><ul>
<li>직접입력은 inputMode={&#39;none&#39;}을 이용해서 막아주었다.</li>
<li>TextInput에 클릭이벤트가 적용되지 않아 onFocus를 이용해서 이벤트를 적용하였다.
-&gt; 이 부분은 포커스가 유지 될 때 적용되지 않아서 수정이 필요하다.</li>
<li>모달창에 선택 된 값은 상태관리 라이브러리 <code>zustand</code>를 이용하여 저장하고 value를 통해서 전달했다.</li>
</ul>
<pre><code>// store.ts

interface MyProduct {
  ...
  status: string;
}
interface ProductRegist {
  product: MyProduct;
  setProduct: (product: MyProduct) =&gt; void;
}
const useProductStore = create&lt;ProductRegist&gt;()(set =&gt; ({
  product: {} as MyProduct,
  setProduct: product =&gt; set(state =&gt; ({...state, product})),
}));
</code></pre><h2 id="modal-구현">Modal 구현</h2>
<h3 id="modal-열기-닫기">Modal 열기, 닫기</h3>
<p>모달창은 하단에서 슬라이드로 올라오는 형태로 선택리스트를 보여주는 형태를 가진다. 다른 컴포넌트도 모달창을 사용하고 있어서 공통컴포넌트로 묶고자 하지만 내부 디자인이 달라서 우선적으로 제품상태에 대한 항목만 작성하였다.</p>
<p>세부적으로 구현해야 하는 기능은</p>
<ul>
<li>슬라이드 형태로 나타나는 모달창 구현</li>
<li>길이는 전체화면을 덮지 않고 뒷 배경은 투명하며 하단부터 이동하도록 한다.</li>
<li>모달창 외부를 클릭 시 모달창이 닫히도록 설정한다.</li>
<li>데이터 받아와서 내부 리스트 구성하기(axios사용)</li>
</ul>
<pre><code>// 데이터 받아오기
  const [data, setData] = useState([]);
  const {modalState, setModalState} = useProductModal();

  let axiosUrl = &#39;&#39;;

  useLayoutEffect(() =&gt; {
    axios
      .get(axiosUrl)
      .then(response =&gt; {
        let newArray = response.data.map((d: productListData) =&gt; {
          return {key: d.codeId, value: d.codeNm};
        });
        setData(newArray);
      })
      .catch(e =&gt; {
        console.log(e);
      });
  }, []);</code></pre><pre><code>// modal구현
    &lt;Modal animationType={&#39;slide&#39;} visible={modalState} transparent={true}&gt;
      &lt;Pressable
        onPress={() =&gt; {
          setModalState(false);
        }}
        style={styles.modalBackground}&gt;&lt;/Pressable&gt;
      &lt;View style={styles.modal}&gt;
        &lt;View style={styles.title}&gt;
          &lt;Text style={styles.titleText}&gt;제품 상태&lt;/Text&gt;
        &lt;/View&gt;
        &lt;View style={styles.breadcrumb}&gt;
          &lt;Text style={styles.breadcrumbText}&gt;제품의 상태를 알려주세요&lt;/Text&gt;
        &lt;/View&gt;
        &lt;MakeList data={data} /&gt;
      &lt;/View&gt;
    &lt;/Modal&gt;</code></pre><ul>
<li>모달창 슬라이드는 animationType={&#39;slide&#39;}를 사용한다.</li>
<li>모달창의 visible상태를 <code>modalState</code>라는 boolean 타입의 useState로 구성하여 활용한다.</li>
<li>모달창 외부의 Pressable 버튼을 만들어서 <code>modalState</code>를 false로 바꿔준다. 이를 통해 모달창 닫기를 구현한다.</li>
<li>내부의 리스트의 값은 axios를 이용해서 값을 전달받아서 response.data를 mapping해서 <code>codeId</code>와 <code>codeNm</code>로 구성된 array로 리스트를 구성하였다.</li>
<li>리스트는 MakeList 의 data로 전달하여 각 항목의 컴포넌트를 구성 후 리턴받는다.</li>
<li>모달을 하단에 붙이기 위해 style은 높이를 주고 마진값을 설정하였다.<pre><code>//StyleSheet
modal: {
  marginBottom: 0,
  marginTop: &#39;auto&#39;,
  height: 570,
}</code></pre></li>
</ul>
<h3 id="radio-button-구현">radio button 구현</h3>
<p>제품의 상태는 한 가지 항목을 필수로 선택하도록 하고 있다. 체크박스의 형태는 별도로 필요없으니 구현하지 않는다. 제품상태는 형태가 같은 컴포넌트이므로 FlatList를 활용하여서 구성하였다.</p>
<p>세부적으로 구현해야 하는 기능은</p>
<ul>
<li>제품의 상태는 한 가지 항목만 선택가능</li>
<li>선택한 항목을 명시적으로 나타내기</li>
<li>선택을 취소할 수 있도록 함</li>
<li>선택항목이 있는 경우 하단의 버튼을 활성화</li>
<li>하단의 버튼을 누르면 모달이 닫히고 InputText에 값이 전달</li>
</ul>
<pre><code>  const [checkedNum, setCheckedNum] = useState&lt;number&gt;(-1);
  const [checked, setChecked] = useState&lt;string&gt;(&#39;&#39;);</code></pre><pre><code>  &lt;FlatList
      data={data}
      ListFooterComponent={&lt;ConfirmButton checked={checked} /&gt;}
      renderItem={({item, index}) =&gt; {
        let key = item.key ?? item.value ?? item;
        return (
          &lt;Pressable
            onPress={() =&gt; {
              if (matchSelected(index)) deSelected();
              else selected(index, key);
            }}&gt;
            &lt;View style={styles.list}&gt;
              &lt;Text
                style={
                  matchSelected(index)
                    ? [styles.listText, styles.textActive]
                    : styles.listText
                }&gt;
                {productStatusName(key)}
              &lt;/Text&gt;
              &lt;Text
                style={
                  matchSelected(index)
                    ? [styles.listTextDesc, styles.textActive]
                    : styles.listTextDesc
                }&gt;
                {productStatusDesc(key)}
              &lt;/Text&gt;
            &lt;/View&gt;
          &lt;/Pressable&gt;
        );
      }}
    /&gt;
  );
};</code></pre><ul>
<li>선택 된 순번과 선택 된 값을 저장하기 위해 useState를 활용하였다.</li>
<li>onPress속성에 선택 일치여부로 selected(선택)와 deSelected(선택해제)를 분기하였다.</li>
<li>index에는 한 가지 값만 들어가므로 radio button의 형태로 선택이 된다.</li>
<li>style도 선택 일치여부로 분기하여 선택항목을 명시적으로 보여주었다.</li>
<li>FlatList에 반복되지 않는 하단 버튼을 구현하기 위해
<code>ListFooterComponent</code>속성에 <code>&lt;ConfirmButton /&gt;</code>컴포넌트를 리턴하였다.</li>
</ul>
<pre><code>//ConfirmButton Component

const {setProduct, product} = useProductStore();
const {setModalState} = useProductModal();

  return (
    &lt;TouchableOpacity
      disabled={checked ? false : true}
      style={checked ? [styles.button, styles.buttonActive] : styles.button}
      onPress={() =&gt; {
        if (checked) {
          setProduct({...product, status: checked});
          setModalState(false);
        }
      }}&gt;
      &lt;Text style={styles.buttonText}&gt;확인&lt;/Text&gt;
    &lt;/TouchableOpacity&gt;
  );
// store.ts

const useProductStore = create&lt;ProductRegist&gt;()(set =&gt; ({
  product: {} as MyProduct,
  setProduct: product =&gt; set(state =&gt; ({...state, product})),
}));</code></pre><ul>
<li>확인버튼을 누르면 <code>zustand</code>로 설정한 Product의 status에 선택 된 항목을 전달한다.</li>
<li>확인버튼을 누르면 <code>zustand</code>로 설정한 ModalState의 값에 false를 전달하여 모달을 닫는다.</li>
</ul>
<h2 id="개선사항">개선사항</h2>
<p>모달창이 닫힌 후 포커스가 그대로 남아 있어서 onFocus가 동작하지 않는다.
그래서 동일한 동작에도 반복 될 수 있도록 onPressIn으로 변경하였다.</p>
<pre><code>    &lt;View style={styles.inputContainer}&gt;
      &lt;Text style={styles.inputTitle}&gt;{label}&lt;/Text&gt;
      &lt;TextInput
        multiline={isArea}
        style={isArea ? styles.inputArea : styles.inputText}
        value={value}
        placeholder={placeholder}
        onPressIn={onPressHandler}
        inputMode={inputType ? undefined: &#39;none&#39;}
        onChangeText={inputType ? onChangeHandler : () =&gt; {}}&gt;&lt;/TextInput&gt;
    &lt;/View&gt;</code></pre><p>모달창이 닫힌 후에 커서가 그대로 남아있지만 값은 value에 저장되어 수정되지 않는다.</p>
<h1 id="구현완료">구현완료!</h1>
<img src='https://velog.velcdn.com/images/it-ju/post/007cd654-7441-4360-a971-a9abc409d0a9/image.gif' style='marginRight: auto; height: 600px;'>]]></description>
        </item>
        <item>
            <title><![CDATA[폴더구조 component와 view에 대한 고찰]]></title>
            <link>https://velog.io/@it-ju/%ED%8F%B4%EB%8D%94%EA%B5%AC%EC%A1%B0-component%EC%99%80-view%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0</link>
            <guid>https://velog.io/@it-ju/%ED%8F%B4%EB%8D%94%EA%B5%AC%EC%A1%B0-component%EC%99%80-view%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0</guid>
            <pubDate>Tue, 02 Apr 2024 02:22:53 GMT</pubDate>
            <description><![CDATA[<p>react-native 프로젝트를 진행하면서 다른 프론트엔드 개발자(경력자)분들의 코드를 보는 기회가 많이 있다.
그러던 와중 궁금한 점이 발생되어 작성하는 오늘의 주제는</p>
<blockquote>
<p>** components folder와 view folder에 대한 고찰 **</p>
</blockquote>
<h2 id="발단-프론트개발자가-2명인데-구조가-2개">발단. 프론트개발자가 2명인데, 구조가 2개?</h2>
<p>우리 프로젝트는 나를 포함하여 프론트엔드 개발자가 3명인 있는 규모가 꽤 있는 프로젝트이다. 그리고 페이지 개발은 각 개발자가 파트를 나누어 진행하고 있다. 그러다보니 페이지의 일관성을 해치는 경우가 더러 발생하고 있는데, 그 중 한 가지에 대한 의문이 발생하게 된다.</p>
<p><img src="https://velog.velcdn.com/images/it-ju/post/0ac078c3-c84a-46de-8754-1f892805dc91/image.png" alt=""></p>
<blockquote>
<p><strong>case1</strong> A개발자는 각 컴포넌트를 components에 넣고 index.js에 담아서 export 시키고, view폴더에서는 컴포넌트의 출력만을 보여준다.
<strong>case2</strong> B개발자는 각 컴포넌트를 view에 componentNameView의 이름으로 넣고 components에서는 common component만 넣어둔다.</p>
</blockquote>
<h2 id="전개-c-개발자의-폴더구조는">전개. C 개발자의 폴더구조는?</h2>
<p>일단 C개발자인 나는 B개발자의 폴더구조를 따라서 코딩을 진행하고 있다. 이유는 B개발자와 협업을 통하여 같은 기능을 나누어 제작하고 있었기 때문이다. 그런데 두 방식에 따른 차이와, 어느방향이 좋을지에 대한 고찰이 필요한 시점인 듯 싶었다.</p>
<h2 id="위기-폴더-구조-파악하기">위기. 폴더 구조 파악하기</h2>
<p><img src="https://velog.velcdn.com/images/it-ju/post/73b71f5d-88db-41d9-9e2b-16fdde2aab3e/image.png" alt=""></p>
<p>** <code>_tests_</code> **
테스트 코드 폴더
** <code>api</code> **
api와 관련 된 로직을 정의해놓은 폴더
** <code>assets</code> **
프로젝트에 사용되는 이미지, 폰트 등이 들어가 있는 폴더
** <code>components</code> **
기능적 요소를 담당하는 폴더
하위에 각 페이지별 이름으로 나누어서 구성되어있음
** <code>screen</code> **
페이지를 모아주는 역할을 하는 폴더
하위에 <code>view</code>, <code>router</code>폴더로 구성되어 있음
** <code>stores</code> **
전역상태 라이브러리인 zustand를 정의해놓은 폴더
** <code>type</code> **
별도의 타입이 필요한 경우 타입을 정의해놓은 폴더</p>
<h2 id="절정-어떤-구성이-더-좋은건데---각각의-장단점">절정. 어떤 구성이 더 좋은건데? - 각각의 장단점</h2>
<h3 id="case1">case1</h3>
<p>** 장점. ** 각 컴포넌트들이 한 가지의 기능을 하고 index.js를 통해 export하고 있으므로 필요한 컴포넌트를 꺼내쓰기 편리함</p>
<p>** 단점. ** 컴포넌트의 재사용이 가능한지 여부를 찾아서 common으로 관리가 필요해보임.</p>
<h3 id="case2">case2</h3>
<p>** 장점. ** 공통 기능의 컴포넌트가 components폴더에 모여있어 필요 시 import해서 사용할 수 있음.</p>
<p>** 단점. ** 그 외의 단일페이지 컴포넌트가 view라는 이름으로 view폴더에 모여있어서 기능적인 부분을 재사용 할 때 중복코드가 발생할 수 있음.</p>
<h2 id="결말-우리는-componentscommon-이-필요해">결말. 우리는 components/common 이 필요해</h2>
<p>이렇게 폴더 구조를 뜯어보니 우리는 통일이 필요하다는 생각이 들었다.
components/common 를 만들어서 기능적인 부분을 원자화 한 다음에 재사용성을 늘리면 프로젝트의 완성도가 올라갈 것 같다.</p>
<p>react 공식문서에 파일구조에 대한 이야기가 있다.
<a href="https://ko.legacy.reactjs.org/docs/faq-structure.html">https://ko.legacy.reactjs.org/docs/faq-structure.html</a></p>
<p>결론</p>
<blockquote>
<p>너무 깊게 생각하지 마세요</p>
</blockquote>
<p>그래 일단, 코드를 구성하고 common폴더를 추가하자는 의견을 내보자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[이슈) react-native-vector-icons 오류에 대한 고찰 - 해결]]></title>
            <link>https://velog.io/@it-ju/react-native-vector-icons-%EC%98%A4%EB%A5%98%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@it-ju/react-native-vector-icons-%EC%98%A4%EB%A5%98%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Fri, 29 Mar 2024 17:00:00 GMT</pubDate>
            <description><![CDATA[<p>사이드 프로젝트 진행중에 나를 너무 괴롭히는 react-native-vector-icons에 대해 고찰한 부분을 정리한 글이다.</p>
<h1 id="발단-카메라-아이콘을-넣자">발단. 카메라 아이콘을 넣자.</h1>
<p>프로젝트의 상품등록 파트를 구성하기로 한 나는 와이어프레임을 열심히 뜯어봤다.
상단에 작은 카메라 아이콘 하나 들어가는 이미지 로드 컴포넌트를 구성해야 했고,
리액트 네이티브 아이콘 패키지를 사용해볼 기회가 생겼다.</p>
<p><img src="https://velog.velcdn.com/images/it-ju/post/3c2c6b8d-41a7-404d-813a-0e6cfa204627/image.png" alt=""></p>
<p>사실 이미 IOS에서 개발하시는 팀원께서 react-native-vector-icons 패키지를 설치해놨다.</p>
<p>그냥 가져다 쓰기만 하면 됬다.
아니 그랬어야 했다.</p>
<h1 id="전개-react-native-vector-icons-사용하자">전개. react-native-vector-icons 사용하자</h1>
<h3 id="1-react-native-vector-icons-패키지-설치하기">1. react-native-vector-icons 패키지 설치하기</h3>
<pre><code>npm install react-native-vector-icons
npm install -D @types/react-native-vector-icons</code></pre><p>아래줄은 타입스크립트용이다.</p>
<h3 id="2-폰트파일-이동하기">2. 폰트파일 이동하기</h3>
<p>node_modules/react-native-vector-icons/Fonts의 폰트파일을
android/app/src/main/assets/fonts을 만들어서 이동시킨다.</p>
<h3 id="3-원하는-아이콘-선택하기">3. 원하는 아이콘 선택하기</h3>
<p><a href="https://oblador.github.io/react-native-vector-icons/">아이콘디렉토리</a>
여기서 원하는 아이콘을 선택하여 이름을 알아둔다.</p>
<h3 id="4-코드-사용하기">4. 코드 사용하기</h3>
<pre><code>import Icons from &#39;react-native-vector-icons/MaterialCommunityIcons&#39;;

export defalut App(){
    ...
    return(
    ...
    &lt;Icons name=&quot;camera-outline&quot; size={20} color=&quot;#4F8EF7&quot; /&gt;
    )
}</code></pre><p>** 그런데 이 이상한 이미지는 뭐지? **
<img src="https://velog.velcdn.com/images/it-ju/post/b3bfa6a8-5227-4bf7-80b5-e8f71d154809/image.png" alt=""></p>
<p>** 나의 <code>camera-outline</code>은 어디간거지 **
<img src="https://velog.velcdn.com/images/it-ju/post/ac46798c-6311-445a-8877-49dcd016bdb0/image.png" alt=""></p>
<h1 id="위기-이미지가-다르다">위기. 이미지가 다르다.</h1>
<p>이제부터가 본격적으로 나를 괴롭히던 문제에 대한 이야기이다.
왜 다를까? 구글 도와줘..</p>
<h3 id="의심1-안드로이드용-설정">의심1. 안드로이드용 설정?</h3>
<p>구글에 검색하니 안드로이드용은 따로 설정해 줄 부분이 있다고 한다.</p>
<blockquote>
<p>android/app/bundle.gradle 파일에 코드 추가하기</p>
</blockquote>
<pre><code>project.ext.react = [
    enableHermes: false,  // clean and rebuild if changing
]
apply from: file(&quot;../../node_modules/react-native-vector-icons/fonts.gradle&quot;)</code></pre><p>역시 이유 없이 안 될리 없지 생각하고 리빌드했지만,
... 호락호락하지 않다.</p>
<h3 id="의심2-폴더이름-설정">의심2. 폴더이름 설정?</h3>
<p>다른 원인으로 .ttf를 옮긴 폴더명의 오류가 있나 살펴보게 된다.</p>
<pre><code>//create-icon-set.js

  const fontBasename = fontFile
    ? fontFile.replace(/\.(otf|ttf)$/, &#39;&#39;)
    : fontFamily;

  const fontReference = Platform.select({
    windows: `/Assets/${fontFile}#${fontFamily}`,
    android: fontBasename,
    web: fontBasename,
    default: fontFamily,
  });</code></pre><p>create-icon-set.js 파일에 의하면 windows에서 Assets경로를 받아오니 폴더명을 대문자로 바꿔봤다.</p>
<p>변화가 없다.</p>
<h3 id="의심3-별도의-설정이-필요한-것은-아닌가">의심3. 별도의 설정이 필요한 것은 아닌가?</h3>
<p>열심히 구글링한 결과로 나와 비슷한 현상이 있다는 이슈를 찾았다.
<a href="https://github.com/oblador/react-native-vector-icons/issues/1294">https://github.com/oblador/react-native-vector-icons/issues/1294</a></p>
<p>그러나 사용하는 장치의 문제로 내가 사용하는 에뮬레이터와 전혀 상관이 없었다.</p>
<h1 id="절정-왜-오류나는지-전혀-모르겠다">절정. 왜 오류나는지 전혀 모르겠다.</h1>
<p>안 넣지 뭐 라는 반 포기의 심정으로 다른 컴포넌트를 구성하였다.
그러나 아이콘을 너무 넣고 싶은,
<del>저 둘의 사랑을 보고싶지 않은</del> 이 마음이 해소되지 않는다.
<img src="https://velog.velcdn.com/images/it-ju/post/642709d8-44fb-4f1a-bf0b-bf6377a83a01/image.png" alt=""></p>
<h3 id="포기란-없다-react-native-강의-수강신청">포기란 없다. react-native 강의 수강신청</h3>
<p>그래서 이제 전문가의 직접적인 도움을 받고자 react-native 강의를 찾아봤다.
<a href="https://www.inflearn.com/course/%EB%B0%B0%EB%8B%AC%EC%95%B1-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C">배달앱 클론코딩</a>
조현영 강사님의 배달앱 클론코딩이다.</p>
<p>그래도 혹시 아이콘이 없으면 무용지물이니 먼저 질문을 한다.
<img src="https://velog.velcdn.com/images/it-ju/post/99a1a6d6-ac3e-4ea1-a610-0136a578bf91/image.png" alt=""></p>
<p>압도적 감사😭😭😭 바로 강의를 구매한다.</p>
<h3 id="강의수강">강의수강</h3>
<p>강의 자체는 스무스하게 진행되며 UX/UI를 고려한 코딩으로 실제 개발코드에도 적용할만큼 섬세한 부분이 많아서 좋았다.</p>
<p>좋아서 순간 강의를 수강한 목적을 잃었다.</p>
<p><img src="https://velog.velcdn.com/images/it-ju/post/cfd70834-ce0a-406d-b62f-9e76e8d47b5c/image.png" alt="">
순서대로 수강하고 있으면 아이콘은 언제고치는데?!!</p>
<h3 id="react-native-vector-icons-강의-수강">react-native-vector-icons 강의 수강</h3>
<p><img src="https://velog.velcdn.com/images/it-ju/post/9a2e4d7f-b507-4782-a167-150bdb13828c/image.png" alt=""></p>
<p>빛과 소금같은 강의를 수강한다.
오..
그런데..
나 이거 다 해본거잖아?</p>
<p>다시 살짝 좌절하고 고민에 빠진다.</p>
<ol>
<li>강사님 도와주세요. 저의 camera아이콘이 이렇게 이상한 gays가 나와요.</li>
<li>도와주세요... 근데 그 전에 한 번 만 더 찾아볼게요.</li>
</ol>
<p><code>쉽게 가자</code> 다짐했는데 잘 안된다.
한 번 더 고생하러 간다.</p>
<h3 id="의심4-값을-전달하는-과정에서-발생한-것은-아닌가">의심4. 값을 전달하는 과정에서 발생한 것은 아닌가?</h3>
<p>사실 패키지를 가져다 쓰면서 사용법 외에 내부코드를 상세하게 보지 않았지만,
필요하니까 열심히 찾아봤다.</p>
<pre><code>render() {
      const { name, size, color, style, children, ...props } = this.props;

      let glyph = name ? glyphMap[name] || &#39;?&#39; : &#39;&#39;;
      if (typeof glyph === &#39;number&#39;) {
        glyph = String.fromCodePoint(glyph);
      }
      ...

    return (
        &lt;Text selectable={false} {...props}&gt;
          {glyph}
          {children}
        &lt;/Text&gt;
      );
    }</code></pre><p>랜더링 시 <code>glyph</code>에 <code>name</code>파라미터 값을 토대로 <code>glyphMap</code>에서 number타입의 값을 반환받아서 <code>glyph</code>에 값을 할당하는 형태였다. </p>
<p>그래서 내가 전달하는 camera-outline이 있는지 확인하기 위해 glyphMap을 찾아봤다.
<a href="https://unpkg.com/browse/react-native-vector-icons@10.0.3/glyphmaps/MaterialCommunityIcons.json">https://unpkg.com/browse/react-native-vector-icons@10.0.3/glyphmaps/MaterialCommunityIcons.json</a></p>
<p><code>&quot;camera-outline&quot;: 986461,</code>
있다.</p>
<p>그리고 실제로 콘솔창에 <code>glyphMap[name]</code>값과 <code>name</code>을 출력하니 잘 받아오고 있었다.
<img src="https://velog.velcdn.com/images/it-ju/post/9094fbf2-fdaf-46f9-9bb9-76a33978b355/image.png" alt=""></p>
<h3 id="의심5-stringfromcodepointglyph">의심5. String.fromCodePoint(glyph)?</h3>
<blockquote>
<p><code>String.fromCodePoint()</code>
JavaScript String fromCodePoint()는 주어진 코드 포인트 값(ASCII 값) 시퀀스에 대한 문자열이나 요소를 반환하는 데 사용되는 JavaScript의 내장 메서드입니다.</p>
</blockquote>
<p><a href="https://en.wikipedia.org/wiki/List_of_Unicode_characters">https://en.wikipedia.org/wiki/List_of_Unicode_characters</a>
반환되는 코드 포인트 목록은 위의 링크에 나와있다.
보니까 거의 유니코드를 반환한다.</p>
<p>그럼 glyph에 number값을 넣어서 각 코드포인트에서 반환값을 가져온다는 것 같은데,
실제로 가져오는지 보고싶었지만 콘솔에 찍히지 않는다.
<img src="https://velog.velcdn.com/images/it-ju/post/9094fbf2-fdaf-46f9-9bb9-76a33978b355/image.png" alt="">
여기서 맨 왼쪽 값(네모박스 안에 /모양)이 <code>String.fromCodePoint(glyph)</code>값이다.</p>
<p>그래서 ttf파일의 형식으로 코드포인트를 구성해서 glyph로 인덱싱을 하나 생각하게 된다.</p>
<p>여기까지 도달했지만 ttf파일의 인코딩타입을 뜯어 볼 엄두가 나지 않았다.</p>
<h3 id="고민-결국-전문가에게-지원요청">고민. 결국 전문가에게 지원요청?</h3>
<p><code>1. 강사님 도와주세요. 저의 camera아이콘이 이렇게 이상한 gays가 나와요.</code>
2. 도와주세요... 근데 그 전에 한 번 만 더 찾아볼게요.</p>
<p>1번의 선택지를 선택하는 기로에 섰다.</p>
<p>강사님께 질문에 대한 과정을 정리하기 위해 폴더명을 다시 바꾸려고 했다.
의심2.에서 했던 Assets폴더명이 대문자인게 거슬려서 수정하려니 오류가 났다.</p>
<p>일단 삭제하자.</p>
<p>그런데...
...
...
...</p>
<h2 id="너-고생했지-살려줄게"><code>너 고생했지? 살려줄게</code></h2>
<p><img src="https://velog.velcdn.com/images/it-ju/post/b89c6c8a-8c8c-4380-be67-c11e5fcd58cf/image.png" alt=""></p>
<p>...
...!!
와
왜지 fonts 폴더를 삭제하니
아이콘이 뜬다.</p>
<h1 id="결말-문제해결-아이콘이-정상적으로-뜬다">결말. 문제해결, 아이콘이 정상적으로 뜬다.</h1>
<p>개발자들이 항상 하는 고민</p>
<blockquote>
<p>이게 왜 되지?</p>
</blockquote>
<p>그러게 이게 왜 될까.
fonts 폴더를 main에서 지우니 경로를 알아서 찾아간다.
이유는 모르겠습니다. 알게 되면 공유하겠습니다.</p>
<blockquote>
<p>혹시 모를 react-native-vector-icons incorrect icon issue를 해결하고 싶은 분들
main 안에 복사했던 assets/fonts 폴더를 삭제해보세요.</p>
</blockquote>
<p>** 나의 일주일을 괴롭히던 gays bye~ **</p>
<hr>
<p>0415) 추가내용. fonts 폴더 재 생성 후에도 잘 찾아감. 원인이 이게 아닌듯</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[windows flipper 설치오류]]></title>
            <link>https://velog.io/@it-ju/%ED%94%8C%EB%A6%AC%ED%8D%BC-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@it-ju/%ED%94%8C%EB%A6%AC%ED%8D%BC-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Mon, 25 Mar 2024 06:54:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/it-ju/post/092f06dc-e6a4-44b8-a881-2bd601c82894/image.png" alt=""></p>
<p>디버깅툴 플리퍼 설치과정중 오류로 인한 기록</p>
<blockquote>
<p><a href="https://fbflipper.com/">플리퍼 공식사이트</a></p>
</blockquote>
<p>위의 사이트에서 각 운영체제에 맞는 파일을 받는다.
다운받고나니 처음 본 확장자명 .tgz로 인해서 추가적으로 cmd로 파일압축을 해제 할 필요가 있었다.</p>
<ol>
<li><p>cmd창에 <code>tar</code>를 입력하기 -&gt;&gt;윈도우 내에 tar가 있는지 확인</p>
</li>
<li><p><code>tar -xvzf filename.tgz</code>로 압축풀기 -&gt;&gt;확장자가 .tgz</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/it-ju/post/d6ffa7c7-af82-4f90-b9aa-606f8771d055/image.png" alt=""></p>
<p>엄청난 패키지가 압축해제 되었다.</p>
<hr>
<p>일반 윈도우에서 해제 안된 이유가 있었다.
<img src="https://velog.velcdn.com/images/it-ju/post/a0e4517c-8227-4177-a68f-8925aa803e87/image.png" alt=""></p>
<p>알고보니 지금 사이트 링크오류로 인해서 플리퍼 윈도우 버전을 찾을 수 없다.
어찌할꼬-</p>
<hr>
<p>당장 못 고친다고 한다. 😨😨😨😨😨😨</p>
<blockquote>
<p><a href="https://github.com/facebook/flipper/issues/5517">https://github.com/facebook/flipper/issues/5517</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[React-native) 컴포넌트 사용 -2]]></title>
            <link>https://velog.io/@it-ju/React-native-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%82%AC%EC%9A%A9-2</link>
            <guid>https://velog.io/@it-ju/React-native-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%82%AC%EC%9A%A9-2</guid>
            <pubDate>Fri, 15 Mar 2024 04:13:29 GMT</pubDate>
            <description><![CDATA[<p>리액트 네이티브 컴포넌트 사용의 두번째 이야기!</p>
<p>잘 정리해놓자</p>
<h1 id="textinput">TextInput</h1>
<p>사용자 입력값을 받는 컴포넌트로 <code>&lt;input type=&#39;text&#39;&gt;</code>와 동일하게 사용 된다.
이벤트 핸들링도 가능하다.</p>
<pre><code>import React from &#39;react&#39;;
import { TextInput } from &#39;react-native&#39;;

export defalut function App(){
    const [text, onChangeText] = React.useState(&#39;Useless Text&#39;);
     const [number, onChangeNumber] = React.useState(&#39;&#39;);

    return(
        &lt;View&gt;
            &lt;TextInput 
                onChangeText={onChangeNumber}
                value={number}
                placeholder=&quot;useless placeholder&quot;
                // 숫자만 입력받음
                keyboardType=&quot;numeric&quot;
            /&gt;
            &lt;TextInput
              editable
              // TextArea
              multiline
              numberOfLines={4}
              maxLength={40}
              onChangeText={text =&gt; onChangeText(text)}
              value={value}
              style={{padding: 10}}
            /&gt;
        &lt;/View&gt;
    )
}</code></pre><p>TextInput에서 multiline속성으로 Textfield를 TextArea처럼 사용 할 수 있다.</p>
<h1 id="scrollview">ScrollView</h1>
<p>한 번에 렌더링 되는 스크롤이 가능한 뷰 위젯
스크롤 뷰에는 하나의 위젯만 넣어야 한다!</p>
<pre><code>&lt;ScrollView&gt;
    &lt;Text&gt;
        Lorem ipsum dolor sit amet, 
        consectetur adipiscing elit, 
        sed do eiusmod tempor incididunt ut 
        labore et dolore magna aliqua. 
    &lt;/Text&gt;
&lt;/ScrollView&gt;
</code></pre><h1 id="flatlist">FlatList</h1>
<p>데이터 양이 많은 경우 스크롤에 의해서 렌더링되는 뷰 위젯
data와 renderItem을 필수 props로 받음</p>
<ul>
<li>data : 만들 리스트의 source</li>
<li>renderItem : <code>data</code>의 값 하나하나를 render해주는 콜백함수</li>
<li>keyExtractor : id를 대신 할 key</li>
<li>getItemLayout : 동적크기를 사용 할 필요가 없는 경우 미리 크기를 지정</li>
<li>initialNumToRender : 초기 랜더링 개수<pre><code>const renderItem = useCallback(({item}) =&gt; &lt;ListItem item={item} /&gt;, [])
const keyExtractor = useCallback((item) =&gt; item.id.toString(), [])
const getItemLayout = useCallback(
 (data, index) =&gt; ({
     length: ITEM_HEIGHT,
     offset: ITEM_HEIGHT * index,
     index,    
 }), 
 []
);
</code></pre></li>
</ul>
<p><FlatList 
    data={DATA}
    renderItem={renderItem}
    keyExtractor={keyExtractor}
    getItemLayout={getItemLayout}
/></p>
<pre><code>렌더링 성능 향상을 위해서 renderItem과 keyExtreactor는 익명함수를 useCallback으로 사용하는 것이 좋다.


# SectionList
섹션이 있는 스크롤에 의해 렌더링 되는 뷰 위젯
renderItem과 sections을 필수 props로 받음
 - sections : flatList의 `data`와 같음 array형태의 source
 - renderItem : `sections`의 값 하나하나를 render해주는 콜백함수

사용법은 FlatList와 동일함

# Button
일반적인 클릭이벤트를 적용할 수 있는 버튼 위젯
title의 속성은 안드로이드에서 대문자로 표시 됨</code></pre><p>&lt;Button
  onPress={()=&gt;{buttonClickEvent()}}
  title=&quot;inner Text&quot;
  color=&quot;#841584&quot;
  disabled
  accessibilityLabel=&quot;Learn more about this purple button&quot;//웹 접근성을 위한 요소
/&gt;</p>
<pre><code># Switch
토글로 사용되는 버튼 위젯
 - trackColor : 토글 on/off 배경색상(ios는 ios_backgroundColor로 false상태 색상 지정)
 - thumbColor : 토글 버튼 원형 안쪽 색상
 - onValueChange : value 상태에 대한 setState()
 - value : 토글 상태가 on으로 전환(기본 값: false)
</code></pre><p>&lt;Switch
  trackColor={{false: &#39;#767577&#39;, true: &#39;#81b0ff&#39;}}
  thumbColor={isEnabled ? &#39;#f5dd4b&#39; : &#39;#f4f3f4&#39;}
  ios_backgroundColor=&quot;#3e3e3e&quot;
  onValueChange={toggleSwitch}
  value={isEnabled}
/&gt;
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React-native) 기본 정리 -1]]></title>
            <link>https://velog.io/@it-ju/react-native-%EA%B8%B0%EB%B3%B8-%EC%A0%95%EB%A6%AC-1</link>
            <guid>https://velog.io/@it-ju/react-native-%EA%B8%B0%EB%B3%B8-%EC%A0%95%EB%A6%AC-1</guid>
            <pubDate>Thu, 14 Mar 2024 09:55:31 GMT</pubDate>
            <description><![CDATA[<p>리액트 네이티브 프로젝트를 진행하면서 사용되는 기본적인 컴포넌트 사용법에 대해서
정리해보자</p>
<h1 id="components">Components</h1>
<p>react-native에서는 웹에서 사용하는 태그를 다음의 컴포넌트로 표현한다.</p>
<table>
<thead>
<tr>
<th align="center">분류</th>
<th align="center">컴포넌트</th>
<th align="center">웹 태그</th>
<th>용도</th>
</tr>
</thead>
<tbody><tr>
<td align="center">Layout</td>
<td align="center"><code>&lt;SafeAreaView&gt;</code></td>
<td align="center"><code>&lt;div&gt;</code></td>
<td>안전영역에서 컨텐츠 렌더링 컨테이너</td>
</tr>
<tr>
<td align="center">Layout</td>
<td align="center"><code>&lt;View&gt;</code></td>
<td align="center">a non-scrolling <code>&lt;div&gt;</code></td>
<td>레이아웃 컨테이너, 일부 터치이벤트, 스타일 지정</td>
</tr>
<tr>
<td align="center">Basic</td>
<td align="center"><code>&lt;Text&gt;</code></td>
<td align="center"><code>&lt;p&gt;</code></td>
<td>텍스트 스타일, 일부 터치이벤트</td>
</tr>
<tr>
<td align="center">Basic</td>
<td align="center"><code>&lt;Image&gt;</code></td>
<td align="center"><code>&lt;img&gt;</code></td>
<td>이미지 표시</td>
</tr>
<tr>
<td align="center">Basic</td>
<td align="center"><code>&lt;TextInput&gt;</code></td>
<td align="center"><code>&lt;input type=&#39;text&#39;&gt;</code></td>
<td>사용자의 입력값을 처리</td>
</tr>
<tr>
<td align="center">Layout</td>
<td align="center"><code>&lt;ScrollView&gt;</code></td>
<td align="center"><code>&lt;div&gt;</code></td>
<td>일반 스크롤 컨테이너</td>
</tr>
<tr>
<td align="center">Layout</td>
<td align="center"><code>&lt;FlatList&gt;</code></td>
<td align="center"></td>
<td>일반 컨테이너, 스크롤 시 렌더링 되는 특징</td>
</tr>
<tr>
<td align="center">Layout</td>
<td align="center"><code>&lt;SectionList&gt;</code></td>
<td align="center"></td>
<td>스크롤 시 렌더링, 섹션이 나누어져 있음</td>
</tr>
<tr>
<td align="center">UI</td>
<td align="center"><code>&lt;Button&gt;</code></td>
<td align="center"><code>&lt;button&gt;</code></td>
<td>클릭이벤트 처리</td>
</tr>
<tr>
<td align="center">UI</td>
<td align="center"><code>&lt;Switch&gt;</code></td>
<td align="center"></td>
<td>boolean 입력값을 렌더링, 토글버튼</td>
</tr>
</tbody></table>
<h1 id="사용">사용</h1>
<p>react-native는 <code>display: flex</code> <code>flex-direction: column</code>이 기본값이다.</p>
<h2 id="view">View</h2>
<pre><code>import React from &#39;react&#39;;
import {View} from &#39;react-native&#39;;

export defalut function App() =&gt;{
    return &lt;View 
            style={{
                borderColor: &#39;blue&#39;,
                borderWidth: &#39;1&#39;,}}&gt;
            &lt;/View&gt;
}</code></pre><h2 id="text">Text</h2>
<pre><code>import React from &#39;react&#39;;
import {View, Text, StyleSheet} from &#39;react-native&#39;;

type startMsg = {
    msg: string;
}
const styles = StyleSheet.create({
  container: {
     borderColor: &#39;blue&#39;,
     borderWidth: &#39;1&#39;,
  },
  item: {
    padding: 10,
    fontSize: 18,
    height: 44,
  },
});
export defalut function App(msg:startMsg) =&gt;{


    return &lt;View style={styles.container}&gt;
                &lt;Text style={styles.item}&gt;{msg}&lt;/Text&gt;
            &lt;/View&gt;
}</code></pre><h2 id="image">Image</h2>
<pre><code>import React from &#39;react&#39;;
import {Image} from &#39;react-native&#39;;

export defalut function ImgList(){
    return &lt;Image source={{uri: &#39;https://reactnative.dev/img/tiny_logo.png&#39;,}}&gt;
    &lt;/Image&gt;
}</code></pre><h2 id="scrollview">ScrollView</h2>
<p>부모요소를 기준으로 한 높이에서 스크롤을 제공함</p>
<pre><code>..
export defalut function App(){
    return &lt;ScrollView&gt;
        &lt;Text&gt;
          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
          eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
          minim veniam, quis nostrud exercitation ullamco laboris nisi ut
          aliquip ex ea commodo consequat. Duis aute irure dolor in
          reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
          pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
          culpa qui officia deserunt mollit anim id est laborum.
        &lt;/Text&gt;
    &lt;/ScrollView&gt;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[React 이론 -1]]></title>
            <link>https://velog.io/@it-ju/React-%EC%9D%B4%EB%A1%A0-1</link>
            <guid>https://velog.io/@it-ju/React-%EC%9D%B4%EB%A1%A0-1</guid>
            <pubDate>Tue, 12 Mar 2024 17:29:36 GMT</pubDate>
            <description><![CDATA[<p>면접준비를 하면서 react 개발관련 이론에 대해 정리해야할 필요성을 느꼈다.
기본기가 탄탄한 개발자가 되기 위해서 react 관련 면접질문에 대해 정리하도록 하자!</p>
<h1 id="react란">React란?</h1>
<blockquote>
<p>사용자 인터페이스를 만드는 자바스크립트 라이브러리
페이스북 개발팀에서 개발</p>
</blockquote>
<p>리액트는 타 프레임워크가 MVC, MVW패턴을 고려함과 달리 View만 신경쓴다. 데이터의 변화에 따라서 화면을 렌더링<sup>1</sup> 하면서 성능을 아끼고 최적화 한다.
<sub>렌더링: 사용자화면에 뷰를 보여주는 것</sub></p>
<p>어떻게? 
-&gt; Virtual DOM 방식을 사용해서 DOM처리 횟수를 줄이고 효율적으로 진행한다.</p>
<h1 id="virtual-dom">Virtual DOM?</h1>
<p>가상돔(Virtual DOM)을 이해하기 전에 먼저 돔(DOM)에 대한 이해가 필요하다. </p>
<h2 id="1-dom이란">1. DOM이란?</h2>
<blockquote>
<p>DOM(Document Object Model)은 객체로 문서의 구조를 표현하는 방법으로 XML이나 HTML로 작성되며 트리구조로 이루어져있다.</p>
</blockquote>
<h2 id="2-virtual-dom이란">2. Virtual DOM이란?</h2>
<blockquote>
<p>Virtual DOM은 이 트리구조로 작성된 자바스크립트 객체인 DOM을 추상화 한 모델이다.</p>
</blockquote>
<h2 id="3-virtual-dom의-작동원리">3. Virtual DOM의 작동원리</h2>
<ol>
<li>데이터가 업데이트 되면 전체 UI를 Virtual DOM에 리렌더링 함</li>
<li>이전의 Virtual DOM에 내용과 비교</li>
<li>변화 된 부분만 실제 DOM에 적용</li>
</ol>
<p>즉, 변화 된 부분만 적용하기 때문에 실제 DOM을 조작하는 것 보다 성능이 향상 될 수 있다.
이 Virtual DOM을 활용하는 것이 리액트의 가장 큰 특징이며 장점이고 핵심이다.</p>
<h1 id="jsx문법">JSX문법</h1>
<ol>
<li>자바스크립트 코드는 {}중괄호 구역 안에서 사용한다. <code>return &lt;p&gt;{text}&lt;/p&gt;</code></li>
<li>하나의 루트를 가지고 리턴한다. <code>return &lt;div&gt;&lt;/div&gt;</code></li>
<li>모든 태그를 잘 닫아야한다. <code>&lt;/&gt;</code></li>
</ol>
<h1 id="props와-state">props와 state</h1>
<h2 id="1-props">1. props?</h2>
<blockquote>
<p>리액트에서 컴포넌트에 속성을 설정 할 때 사용하는 요소</p>
</blockquote>
<p>props는 properties를 줄인 말로 컴포넌트 내부에서 속성을 설정할 때 사용되며 부모 컴포넌트에 의해 설정되며 값을 전달 할 수 있다.</p>
<h2 id="2-state">2. State?</h2>
<blockquote>
<p>컴포넌트 내부에서 바뀔 수 있는 값</p>
</blockquote>
<p>props가 부모 컴포넌트에서 값이 설정 됨과 다르게 state는 컴포넌트 내부에서 바뀔 수 있는 값이다.</p>
<h1 id="react-map함수">react map()함수</h1>
<p>컴포넌트를 반복시켜서 렌더링 할 때 자바스크립트 내장객체인 map()함수를 사용하게 된다. 리액트에서 map()함수는 자바스크립트의 함수와 동일하지만 반환값에 join()을 별도로 사용하지 않아도 된다는 편의점이 있다.</p>
<h2 id="1-map사용-시-주의점">1. map()사용 시 주의점</h2>
<p>react에서 map()함수를 사용해서 컴포넌트의 요소를 구성할 때 주의할 점은 key props값을 유일한 값으로 넣어주어야 한다는 점이다.</p>
<h2 id="2-key-props">2. key props?</h2>
<blockquote>
<p>react가 어떤 항목에 대해 변경, 추가 또는 삭제할지에 대한 식별 값</p>
</blockquote>
<p>react에서 컴포넌트 배열의 변화를 감지할 때 순차적으로 위에서부터 읽어들이게 된다. 이때 key를 설정하면 이 key값의 변화를 읽어 변화를 좀 더 빠르게 알아낼 수 있다. 그래서 key값은 유일한 값으로 설정해야 렌더링 성능 향상에 유리하다.</p>
<h1 id="component">Component?</h1>
<blockquote>
<p>리액트에서 요소를 구성하는 요소들의 집합체</p>
</blockquote>
<h2 id="1-class-type-component">1. class type component</h2>
<blockquote>
<p>state 기능 및 라이프사이클 기능을 사용할 수 있고 임의의 메서드를 정의할 수 있는 컴포넌트</p>
</blockquote>
<h3 id="1-1-클래스형-컴포넌트에서의-라이프사이클-메서드">1-1. 클래스형 컴포넌트에서의 라이프사이클 메서드</h3>
<ul>
<li>componentDidMount</li>
<li>componentDidUpdate</li>
<li>componentWillUnmount</li>
</ul>
<h3 id="1-2-클래스형-컴포넌트-사용">1-2. 클래스형 컴포넌트 사용</h3>
<pre><code>import { Component } from &#39;react&#39;;

class App extends Component{
    render(){
        const text = &#39;클래스형컴포넌트&#39;;
        return &lt;div&gt;{text}&lt;/div&gt;;
    }
}</code></pre><h2 id="2-function-type-component">2. function type component</h2>
<blockquote>
<p>컴포넌트의 라이프사이클을 useState와 useEffect로 관리하고 일반적인 함수의 형태로 선언되는 컴포넌트</p>
</blockquote>
<p>v16.8이후로 Hooks를 통한 함수형 컴포넌트의 상태관리가 가능하므로 함수형 컴포넌트의 사용을 권장하고 있다.</p>
<h3 id="2-1-함수형-컴포넌트-사용">2-1. 함수형 컴포넌트 사용</h3>
<pre><code>function App(){
    const text = &#39;함수형컴포넌트&#39;;
    return&lt;div&gt;{text}&lt;/div&gt;;
}
export defalut App;</code></pre><h2 id="3-차이점-및-장단점">3. 차이점 및 장단점</h2>
<ol>
<li>클래스형은 라이프사이클 메서드를 통해 컴포넌트의 라이프사이클을 관리한다.</li>
<li>클래스형에 비해 함수형이 선언이 편하며 자원소모도 적다.</li>
<li>클래스형은 state값을 this.state로 설정하고 this.setState로 핸들링한다. 함수형은 useState로 설정하고 핸들링한다.</li>
<li>클래스형은 props값을 this.props로 불러오고 함수형은 랜더함수의 파라미터로 전달받아 사용한다.</li>
</ol>
<h1 id="react-성능-최적화">react 성능 최적화?</h1>
<ol>
<li>상태를 업데이트 할 때 기존값을 업데이트 하지 않도록 함 - 불변성유지<ul>
<li>예시) 배열에 새로운 항목 추가 시 push 대신 concat 사용</li>
</ul>
</li>
<li>컴포넌트 배열 구성 시 key props값을 유일한 값으로 설정 - 변화 감지가 빠름</li>
<li>함수형 컴포넌트의 사용 - 메모리자원의 사용이 적고 빌드파일의 크기도 작음</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>