<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev-tryit.log</title>
        <link>https://velog.io/</link>
        <description>경험하고, 도전하고, 배우자.</description>
        <lastBuildDate>Tue, 11 Apr 2023 02:53:25 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev-tryit.log</title>
            <url>https://velog.velcdn.com/images/dev-tryit/profile/fe2ccab3-4a35-432f-9168-7d85f3c96bb5/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev-tryit.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev-tryit" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[스크롤 위젯의 하위 위젯 버그에 대한 key의 활용 (+chatgpt)]]></title>
            <link>https://velog.io/@dev-tryit/%EC%8A%A4%ED%81%AC%EB%A1%A4-%EC%9C%84%EC%A0%AF%EC%9D%98-%ED%95%98%EC%9C%84-%EC%9C%84%EC%A0%AF-%EB%B2%84%EA%B7%B8%EC%97%90-%EB%8C%80%ED%95%9C-key%EC%9D%98-%ED%99%9C%EC%9A%A9-chatgpt</link>
            <guid>https://velog.io/@dev-tryit/%EC%8A%A4%ED%81%AC%EB%A1%A4-%EC%9C%84%EC%A0%AF%EC%9D%98-%ED%95%98%EC%9C%84-%EC%9C%84%EC%A0%AF-%EB%B2%84%EA%B7%B8%EC%97%90-%EB%8C%80%ED%95%9C-key%EC%9D%98-%ED%99%9C%EC%9A%A9-chatgpt</guid>
            <pubDate>Tue, 11 Apr 2023 02:53:25 GMT</pubDate>
            <description><![CDATA[<h2 id="보통-listview-같이-scroll-하는곳에서-key가-중요하다고-들었어-왜그래">보통 ListView 같이 scroll 하는곳에서 key가 중요하다고 들었어. 왜그래?</h2>
<p>ListView와 같은 스크롤 가능한 위젯에서는 많은 위젯이 동적으로 생성되고 제거됩니다. 이러한 과정에서 스크롤 위치를 유지하기 위해 Flutter는 스크롤 위치에 대한 정보를 저장하고 관리합니다.</p>
<p>이때, 스크롤 가능한 위젯의 하위 위젯들이 각각 고유한 키를 가지지 않으면, Flutter가 위젯을 동적으로 생성하거나 제거할 때 오류가 발생할 수 있습니다. 이는 위젯이 중복되거나 삭제되지 않아 스크롤 위치가 변경되지 않는 문제를 초래할 수 있습니다.</p>
<p>따라서, ListView와 같은 스크롤 가능한 위젯에서는 고유한 키를 지정하여 위젯을 식별하고, 스크롤 위치를 유지하는 것이 중요합니다. 특히, ListView.builder나 ListView.separated와 같이 동적으로 위젯을 생성하는 경우에는 key가 중요한 역할을 합니다.</p>
<h2 id="즉-스크롤-위젯의-하위-위젯들이-키를-갖고-있지-않으면-스크롤-위젯에-오류가-발생할-수-있다네">즉, 스크롤 위젯의 하위 위젯들이 키를 갖고 있지 않으면, 스크롤 위젯에 오류가 발생할 수 있다네?</h2>
<p>맞습니다. 스크롤 가능한 위젯의 하위 위젯들이 고유한 키를 갖고 있지 않으면, 스크롤 가능한 위젯이 동적으로 생성되거나 제거될 때 위젯의 상태가 유지되지 않을 수 있습니다. 이는 스크롤 위치가 변경되지 않아서 위젯이 중복되거나 삭제되지 않는 문제를 초래할 수 있습니다. 따라서 스크롤 가능한 위젯에서는 하위 위젯들에게 고유한 키를 부여하여 위젯을 식별하고 스크롤 위치를 유지하는 것이 중요합니다. 특히 동적으로 위젯을 생성하는 경우에는 키가 매우 중요합니다.</p>
<h2 id="즉-자식-위젯들은-valuekey를-넣으면-충분하겠네">즉, 자식 위젯들은 ValueKey를 넣으면 충분하겠네?</h2>
<p>ValueKey는 위젯의 값(value)에 의해 식별됩니다. 값이 같으면 같은 위젯으로 간주됩니다. 따라서 자식 위젯들이 고유한 값을 갖고 있다면 ValueKey를 사용할 수 있습니다.</p>
<p>하지만 스크롤 가능한 위젯에서는 자식 위젯이 생성 및 삭제되면서 값이 변경되는 경우가 많기 때문에 고유한 값이 유지되지 않을 수 있습니다. 따라서 고유한 값이 없거나 값이 변경될 가능성이 있는 경우에는 ObjectKey나 UniqueKey를 사용하는 것이 좋습니다. 이렇게 하면 스크롤 위치를 정확하게 유지할 수 있습니다.</p>
<h2 id="그렇군-고유값이-있다면-valuekey로-충분하고-그렇지-않다면-uniquekey-같은걸-쓰면-되겠네">그렇군. 고유값이 있다면 ValueKey로 충분하고, 그렇지 않다면, UniqueKey 같은걸 쓰면 되겠네?</h2>
<p>네, 그렇습니다. 만약 위젯이 고유한 값이 있다면 그 값을 기반으로 ValueKey를 사용하는 것이 좋습니다. 예를 들어, 리스트 뷰의 아이템이라면, 그 아이템이 가지고 있는 고유한 ID 값을 사용하여 ValueKey를 생성할 수 있습니다.</p>
<p>하지만, 만약 위젯이 고유한 값이 없다면, UniqueKey를 사용하여 위젯을 식별하는 것이 좋습니다. UniqueKey는 위젯이 생성될 때 랜덤한 값을 가지므로, 고유성이 보장됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter key의 역할 (+ chatgpt와의 대화)]]></title>
            <link>https://velog.io/@dev-tryit/Flutter-key%EC%9D%98-%EC%97%AD%ED%95%A0-chatgpt%EC%99%80%EC%9D%98-%EB%8C%80%ED%99%94</link>
            <guid>https://velog.io/@dev-tryit/Flutter-key%EC%9D%98-%EC%97%AD%ED%95%A0-chatgpt%EC%99%80%EC%9D%98-%EB%8C%80%ED%99%94</guid>
            <pubDate>Tue, 11 Apr 2023 02:23:57 GMT</pubDate>
            <description><![CDATA[<h3 id="statefulwidget-state가-있어-상위-위젯에-의해-statefulwidget이-다시-생성될-수-있다고-알고-있어-하지만-state는-다시-생성되지-않을-수-있지-왜냐하면-statefulwidget의-key를-통해-이전에-만들어진-widget에-연결된-state를-재사용할-수-있기-때문이야-이-말이-혹시-맞니">statefulWidget, state가 있어. 상위 위젯에 의해 statefulWidget이 다시 생성될 수 있다고 알고 있어. 하지만, state는 다시 생성되지 않을 수 있지. 왜냐하면, statefulWidget의 key를 통해 이전에 만들어진 widget에 연결된 state를 재사용할 수 있기 때문이야. 이 말이 혹시 맞니?</h3>
<p>부분적으로 맞습니다. Flutter에서 <code>StatefulWidget</code>은 위젯 트리에서 변경 가능한 상태를 관리하기 위해 사용됩니다. <code>StatefulWidget</code>은 위젯 트리의 구조가 변경되면 새로 생성될 수 있지만, 그와 동시에 <code>State</code> 객체는 상태 정보를 보존하기 위해 재사용될 수 있습니다.</p>
<p>하지만, 이것이 항상 <code>Key</code>를 사용하여 이전에 생성된 위젯과 연결된 <code>State</code>를 재사용하는 것은 아닙니다. <code>Key</code>는 위젯을 식별하기 위한 유일한 값입니다. <code>Key</code>를 사용하면, Flutter 프레임워크가 위젯 트리의 위치가 변경되거나 재구성되었을 때 이전에 생성된 위젯과 연결된 상태를 보존하거나 재사용할 수 있도록 돕습니다.</p>
<p><code>StatefulWidget</code>에 <code>Key</code>를 할당하지 않으면, 프레임워크가 위젯 인스턴스와 연관된 <code>State</code> 객체를 재사용할 수 없습니다. 이 경우, 위젯이 다시 빌드되면 새로운 <code>State</code> 객체가 생성됩니다.</p>
<p>따라서, 이전에 생성된 <code>StatefulWidget</code> 위젯과 연결된 <code>State</code>를 재사용하려면, 해당 위젯에 적절한 <code>Key</code>를 할당해야 합니다. 이렇게 하면 프레임워크가 필요한 경우 이전 상태를 보존하고 재사용할 수 있습니다.</p>
<hr>
<h3 id="key가-없으면-state가-절대-재사용되지-않아">key가 없으면 state가 절대 재사용되지 않아?</h3>
<p>일반적으로 <code>Key</code>가 없는 경우 <code>State</code> 객체가 재사용되지 않습니다. 그러나 <code>StatefulWidget</code>이 동일한 위치에 있고 위젯 트리의 구성이 변경되지 않은 경우, Flutter 프레임워크는 기존 <code>State</code> 객체를 계속 사용할 수 있습니다.</p>
<p><code>Key</code>는 위젯이 이동하거나 위젯 트리의 구성이 변경되었을 때, Flutter 프레임워크가 이전에 생성된 위젯과 연결된 상태를 보존하고 재사용할 수 있도록 도와줍니다. 따라서 위젯 인스턴스를 올바르게 식별하고 관리하려면 <code>Key</code>를 사용하는 것이 좋습니다.</p>
<p>요약하면, <code>Key</code>가 없으면 <code>State</code> 객체의 재사용은 제한적입니다. 동일한 위치에 있는 <code>StatefulWidget</code>에 대해서는 재사용이 가능하지만, 위젯의 위치가 변경되거나 위젯 트리의 구성이 변경된 경우에는 <code>State</code> 객체가 재사용되지 않습니다. 이러한 상황에서 상태를 보존하고 재사용하려면, <code>Key</code>를 사용해야 합니다.</p>
<hr>
<h3 id="위에-내가-설명한-내용이-어떤것이-미묘하게-잘못된걸까">위에 내가 설명한 내용이 어떤것이 미묘하게 잘못된걸까?</h3>
<p>제가 이해한 바로는, 주된 차이점은 다음과 같습니다.</p>
<p>원래의 설명:</p>
<ul>
<li><code>StatefulWidget</code>이 다시 생성되더라도 <code>Key</code>를 사용하여 이전에 생성된 위젯에 연결된 <code>State</code>를 재사용할 수 있다고 설명하셨습니다.</li>
</ul>
<p>수정된 설명:</p>
<ul>
<li><code>State</code> 객체는 일반적으로 동일한 위치에 있는 <code>StatefulWidget</code>에 대해 재사용됩니다. 하지만 위젯이 이동되거나 위젯 트리의 구성이 변경되었을 때, <code>Key</code>를 사용하여 이전에 생성된 위젯과 연결된 상태를 보존하고 재사용할 수 있습니다.</li>
</ul>
<p>원래의 설명에서는 <code>StatefulWidget</code>이 다시 생성되더라도 이전에 생성된 위젯에 연결된 <code>State</code>를 재사용할 수 있다고 언급되어 있지만, 이는 <code>Key</code>를 사용할 때만 해당됩니다. 일반적으로 <code>StatefulWidget</code>이 같은 위치에 있고 위젯 트리의 구성이 변경되지 않은 경우에는 <code>State</code> 객체가 재사용됩니다. 그러나 위젯의 위치가 변경되거나 위젯 트리의 구성이 변경되었을 때에는 <code>Key</code>를 사용하여 상태를 보존하고 재사용할 수 있습니다.</p>
<hr>
<h3 id="즉-너가-말하고-싶은-것은-key가-없어도-재사용될-수-있다-key는-위젯이-이동하거나-위젯-트리가-변경되었을-때-유용하다-이네">즉, 너가 말하고 싶은 것은, key가 없어도, 재사용될 수 있다. key는 위젯이 이동하거나 위젯 트리가 변경되었을 때 유용하다 이네?</h3>
<p>네, 정확하게 말씀하셨습니다. <code>Key</code>가 없어도 동일한 위치에 있는 <code>StatefulWidget</code>에 대해서는 <code>State</code> 객체가 재사용될 수 있습니다. 그러나 위젯이 이동하거나 위젯 트리의 구성이 변경되었을 때, 이전에 생성된 위젯과 연결된 상태를 보존하고 재사용하기 위해서는 <code>Key</code>를 사용해야 합니다.</p>
<p><code>Key</code>를 사용하면 Flutter 프레임워크가 위젯 트리에서 위젯 인스턴스와 관련된 상태를 올바르게 추적하고 관리할 수 있으므로, 상태가 보존되고 재사용될 수 있습니다. 따라서 <code>Key</code>는 위젯이 이동하거나 위젯 트리의 구성이 변경되었을 때 상태를 올바르게 관리하는 데 유용합니다.</p>
<hr>
<h3 id="key의-종류와-각각의-key는-언제-사용하면-좋은지-알려줘-그리고-원리도-알려주면-좋겠어">key의 종류와 각각의 key는 언제 사용하면 좋은지 알려줘. 그리고 원리도 알려주면 좋겠어.</h3>
<p>Flutter에서는 다양한 종류의 <code>Key</code>가 있으며, 각각이 특정 상황에 적합하게 설계되어 있습니다. 여기 몇 가지 주요 <code>Key</code> 유형과 사용 사례를 소개합니다.</p>
<ol>
<li><p><code>ValueKey</code>: <code>ValueKey</code>는 주어진 값에 기반하여 위젯을 구별하는 데 사용됩니다. 이 키는 데이터의 실제 값에 따라 위젯을 식별하므로, 동일한 유형의 위젯이 동일한 값을 표시할 때 유용합니다. 예: <code>ValueKey</code>를 사용하여 동일한 데이터를 표시하는 두 개의 리스트 항목을 구별할 수 있습니다.</p>
</li>
<li><p><code>ObjectKey</code>: <code>ObjectKey</code>는 주어진 객체에 기반하여 위젯을 구별하는 데 사용됩니다. 이 키는 객체의 참조에 따라 위젯을 식별하므로, 동일한 유형의 위젯이 동일한 객체를 참조할 때 유용합니다. 예: <code>ObjectKey</code>를 사용하여 동일한 객체를 참조하는 두 개의 카드 위젯을 구별할 수 있습니다.</p>
</li>
<li><p><code>UniqueKey</code>: <code>UniqueKey</code>는 각 인스턴스에 대해 고유한 값을 생성하여 위젯을 구별하는 데 사용됩니다. 이 키는 위젯 인스턴스를 고유하게 식별해야 할 때 유용합니다. 일반적으로 재사용되지 않는 경우에 사용됩니다. 예: <code>UniqueKey</code>를 사용하여 동적으로 생성된 위젯의 인스턴스를 구별할 수 있습니다.</p>
</li>
<li><p><code>GlobalKey</code>: <code>GlobalKey</code>는 전체 위젯 트리에서 고유하게 식별할 수 있는 키입니다. 이 키는 위젯 트리의 한 부분에서 다른 부분으로 데이터를 전달하거나, 상태를 보존하고 재사용할 때 유용합니다. 또한 <code>GlobalKey</code>를 사용하면 전체 애플리케이션에서 위젯 인스턴스에 직접 액세스할 수 있습니다. 그러나 남용하지 않도록 주의해야 합니다. 과도한 사용은 성능에 부정적인 영향을 미칠 수 있습니다. 예: 폼 위젯에서 유효성 검사를 수행하거나 글로벌로 액세스해야 하는 상태를 관리할 때 <code>GlobalKey</code>를 사용할 수 있습니다.</p>
</li>
</ol>
<p>원리: <code>Key</code>의 원리는 위젯 인스턴스와 연관된 상태를 올바르게 추적하고 관리하기 위해 Flutter 프레임워크에 도움을 주는 것입니다. 위젯이 이동하거나 위젯</p>
<hr>
<h3 id="위-key들은-지역적으로-작동해-전역적으로-작동해-그것에-따라-분류해줘-그리고-더-많은-key에-대해-알려줘-scroll-관련-key도-있더라">위 key들은 지역적으로 작동해? 전역적으로 작동해? 그것에 따라 분류해줘. 그리고 더 많은 key에 대해 알려줘. scroll 관련 key도 있더라.</h3>
<p>Flutter의 <code>Key</code>는 대부분 지역적으로 작동하며, <code>GlobalKey</code>만 전역적으로 작동합니다. 지역적인 키들은 주로 위젯의 하위 트리 내에서 작동하며, 전역 키는 전체 애플리케이션에서 작동합니다. 각 키를 지역적인 키와 전역적인 키로 분류하면 다음과 같습니다.</p>
<p>지역적인 키:</p>
<ol>
<li><code>ValueKey</code></li>
<li><code>ObjectKey</code></li>
<li><code>UniqueKey</code></li>
</ol>
<p>전역적인 키:</p>
<ol>
<li><code>GlobalKey</code></li>
</ol>
<p>추가적인 키:</p>
<ol>
<li><p><code>ScrollController</code> 및 <code>ScrollPhysics</code>: 스크롤 동작과 관련된 키입니다. <code>ScrollController</code>를 사용하면 스크롤 가능한 위젯의 스크롤 위치를 제어할 수 있으며, <code>ScrollPhysics</code>를 사용하면 스크롤 동작을 사용자 정의할 수 있습니다. 이러한 키는 스크롤 관련 위젯에서 사용됩니다.</p>
</li>
<li><p><code>PageStorageKey</code>: 이 키는 페이지 저장소를 위한 키로, 페이지 저장소는 스크롤 가능한 위젯의 스크롤 오프셋을 저장하고 복원하는 데 사용됩니다. 예를 들어, <code>ListView</code> 또는 <code>GridView</code>와 같은 스크롤 가능한 위젯에서 사용할 수 있습니다.</p>
</li>
<li><p><code>LabeledGlobalKey</code>: 이 키는 <code>GlobalKey</code>의 서브클래스로, 디버깅을 돕기 위해 문자열 레이블이 추가된 키입니다. 이 키는 위젯 인스턴스를 전역적으로 식별할 수 있게 해주는 동시에 디버깅에 유용한 정보를 제공합니다.</p>
</li>
<li><p><code>LocalKey</code>: <code>Key</code> 클래스의 추상 서브클래스로, 모든 지역적인 키의 기본 클래스입니다. <code>ValueKey</code>, <code>ObjectKey</code> 및 <code>UniqueKey</code>와 같은 다양한 지역적인 키 유형은 <code>LocalKey</code>에서 파생됩니다. 이 클래스를 사용하여 사용자 정의 지역 키를 생성할 수 있습니다.</p>
</li>
</ol>
<p>전역적인 키를 제외한 나머지 키들은 주로 지역적인 범위에서 작동하며, 위젯의 하위 트리 내에서 상태를 관리하는 데 도움을 줍니다. 전역 키는 전체 애플리케이션에서 작동하므로, 전역적으로 상태를 보존하거나 위젯에 액세스하는 경우에 유용합니다.</p>
<hr>
<h3 id="scrollcontroller와-scrollphysics는-key가-아닌-것-같은데">ScrollController와 ScrollPhysics는 key가 아닌 것 같은데?</h3>
<p>죄송합니다. 제가 오해를 일으키는 정보를 제공했습니다. 말씀하신대로 <code>ScrollController</code>와 <code>ScrollPhysics</code>는 키가 아닙니다. 이들은 스크롤 동작과 관련된 클래스이며, 키와 관련이 없습니다. 키와 관련된 추가 정보를 요청하셨으므로, 해당 내용을 다시 정리하겠습니다.</p>
<ol>
<li><code>ValueKey</code>: 지역적인 키</li>
<li>`ObjectKey</li>
</ol>
<hr>
<h3 id="정말-key들인-것만-남겨주고-모두-지역적인지-전역적인지-분류해줘-다른-분류가-필요하면-알려줘">정말 key들인 것만 남겨주고, 모두 지역적인지, 전역적인지 분류해줘. 다른 분류가 필요하면 알려줘.</h3>
<p>죄송합니다. 앞서 제공한 정보 중에서 실제 키와 관련된 것만 남기고 지역적인 키와 전역적인 키로 분류하겠습니다.</p>
<p>지역적인 키:</p>
<ol>
<li><code>ValueKey</code>: 주어진 값에 기반하여 위젯을 구별하는 데 사용됩니다.</li>
<li><code>ObjectKey</code>: 주어진 객체에 기반하여 위젯을 구별하는 데 사용됩니다.</li>
<li><code>UniqueKey</code>: 각 인스턴스에 대해 고유한 값을 생성하여 위젯을 구별하는 데 사용됩니다.</li>
<li><code>PageStorageKey</code>: 페이지 저장소를 위한 키로, 페이지 저장소는 스크롤 가능한 위젯의 스크롤 오프셋을 저장하고 복원하는 데 사용됩니다.</li>
</ol>
<p>전역적인 키:</p>
<ol>
<li><code>GlobalKey</code>: 전체 위젯 트리에서 고유하게 식별할 수 있는 키입니다. 위젯 트리의 한 부분에서 다른 부분으로 데이터를 전달하거나, 상태를 보존하고 재사용할 때 유용합니다.</li>
</ol>
<p>디버깅용 키:</p>
<ol>
<li><code>LabeledGlobalKey</code>: <code>GlobalKey</code>의 서브클래스로, 디버깅을 돕기 위해 문자열 레이블이 추가된 키입니다. 이 키는 위젯 인스턴스를 전역적으로 식별할 수 있게 해주는 동시에 디버깅에 유용한 정보를 제공합니다.</li>
</ol>
<p>일반적으로 키들은 지역적인 키와 전역적인 키로 분류됩니다. 지역적인 키들은 주로 위젯의 하위 트리 내에서 작동하며, 전역 키는 전체 애플리케이션에서 작동합니다. 디버깅용 키인 <code>LabeledGlobalKey</code>는 전역 키이지만, 주로 디버깅 목적으로 사용됩니다.</p>
<hr>
<h3 id="labeledglobalkey를-쓰는게-더-좋겠네-장단점이-있니">LabeledGlobalKey를 쓰는게 더 좋겠네? 장단점이 있니?</h3>
<p><code>LabeledGlobalKey</code>는 <code>GlobalKey</code>의 서브클래스로, 주로 디버깅 목적으로 사용됩니다. 문자열 레이블이 추가되어 있어 디버깅 과정에서 더 많은 정보를 제공합니다. 이 키를 사용하는 경우에 대한 장단점을 살펴보겠습니다.</p>
<p>장점:</p>
<ol>
<li>디버깅 정보 제공: <code>LabeledGlobalKey</code>는 디버깅 정보를 제공하여 문제가 발생했을 때 원인을 찾기 쉽게 만들어 줍니다. 문자열 레이블을 통해 위젯 인스턴스를 더 쉽게 식별할 수 있습니다.</li>
<li>전역 키의 모든 기능 포함: <code>GlobalKey</code>의 모든 기능을 포함하므로, 상태를 전역적으로 보존하거나 위젯 트리의 한 부분에서 다른 부분으로 데이터를 전달하는 데 사용할 수 있습니다.</li>
</ol>
<p>단점:</p>
<ol>
<li>성능: <code>LabeledGlobalKey</code>를 사용하면 추가적인 문자열 레이블이 필요하기 때문에 약간의 메모리 및 성능 오버헤드가 발생할 수 있습니다. 따라서 대규모 애플리케이션에서 불필요한 <code>LabeledGlobalKey</code> 사용은 최소화해야 합니다.</li>
<li>디버깅 이외의 목적에는 불필요: <code>LabeledGlobalKey</code>는 주로 디버깅에 유용한 정보를 제공하기 위한 목적으로 사용됩니다. 디버깅에 관련되지 않은 상황에서는 일반적인 <code>GlobalKey</code>를 사용하는 것이 좋습니다.</li>
</ol>
<p>결론적으로, <code>LabeledGlobalKey</code>는 디버깅 과정에서 유용하지만, 일반적인 상황에서는 불필요한 오버헤드를 초래할 수 있으므로 사용을 최소화하는 것이 좋습니다. 디버깅 이외의 경우에는 일반적인 <code>GlobalKey</code>를 사용하는 것을 권장합니다.</p>
<hr>
<h3 id="요즘-모바일-기기-사양을-봤을-때-유의미한-성능-오버헤드일까">요즘 모바일 기기 사양을 봤을 때 유의미한 성능 오버헤드일까?</h3>
<p>요즘 모바일 기기의 사양이 상당히 좋아졌기 때문에, 일부 <code>LabeledGlobalKey</code>를 사용하는 것이 성능에 큰 영향을 미치지 않을 수 있습니다. 하지만, 대규모 애플리케이션에서 여러 개의 <code>LabeledGlobalKey</code>를 사용하게 되면 성능과 메모리 오버헤드가 누적될 수 있습니다.</p>
<p>애플리케이션의 성능과 메모리 사용량을 최적화하는 것은 중요한 고려 사항입니다. 따라서 필요한 경우에만 <code>LabeledGlobalKey</code>를 사용하고, 그 외의 경우에는 일반적인 <code>GlobalKey</code>를 사용하는 것이 좋습니다. 이렇게 하면 애플리케이션의 성능과 메모리 사용량을 관리하는 데 도움이 됩니다.</p>
<p>개발 과정에서 디버깅이 필요한 경우에는 <code>LabeledGlobalKey</code>를 사용하고, 최종 배포 전에 일반적인 <code>GlobalKey</code>로 교체하는 것을 고려할 수 있습니다. 이렇게 하면 디버깅에 도움이 되는 동시에 애플리케이션의 성능을 유지할 수 있습니다.</p>
<hr>
<h3 id="전역-키를-사용하면-지역-키에-비해-얼마나-성능적으로-손해를-보는거야">전역 키를 사용하면, 지역 키에 비해 얼마나 성능적으로 손해를 보는거야?</h3>
<p><code>GlobalKey</code>와 지역 키(예: <code>ValueKey</code>, <code>ObjectKey</code>, <code>UniqueKey</code>) 간의 성능 차이는 상황에 따라 다릅니다. 일반적으로, <code>GlobalKey</code>는 전역적으로 고유하게 식별할 수 있는 키로, 더 복잡한 기능을 제공합니다. 이로 인해 <code>GlobalKey</code>가 지역 키에 비해 약간의 성능 오버헤드를 초래할 수 있습니다.</p>
<p>하지만, <code>GlobalKey</code>와 지역 키 간의 성능 차이는 대부분의 경우 크지 않습니다. 애플리케이션의 성능에 미치는 영향은 키의 사용 방식과 개수, 애플리케이션의 복잡성 등 다양한 요소에 따라 달라집니다.</p>
<p><code>GlobalKey</code>를 사용할 때 주의할 점은, 과도한 사용으로 인한 위젯 트리의 재구성이 빈번하게 발생할 경우 성능에 영향을 미칠 수 있다는 것입니다. 이러한 상황을 피하기 위해 필요한 경우에만 <code>GlobalKey</code>를 사용하고, 그 외의 경우에는 지역 키를 사용하는 것이 좋습니다.</p>
<p>결론적으로, <code>GlobalKey</code>와 지역 키 간의 성능 차이는 상황에 따라 다르지만 일반적으로 크지 않습니다. 애플리케이션의 성능을 최적화하려면 키를 적절하게 사용하는 것이 중요합니다.</p>
<hr>
<hr>
<h1 id="결론">결론</h1>
<p>각 키의 특징을 자세히 설명하면 다음과 같습니다.</p>
<ul>
<li><p>식별키(Identification Key): 위젯을 고유하게 식별하는 용도로 사용되는 키입니다. </p>
<ul>
<li><p>지역 키(Local Key)
ValueKey: 위젯의 값(value)에 의해 식별됩니다. 값이 같으면 같은 위젯으로 간주됩니다.
ObjectKey: 위젯의 객체(identity)에 의해 식별됩니다. 객체가 같으면 같은 위젯으로 간주됩니다.
UniqueKey: 랜덤한 유니크한 값에 의해 식별됩니다. 일반적으로 위젯의 생성 시점에 자동으로 생성됩니다.
BuildContextKey: 해당 위젯의 BuildContext에 의해 식별됩니다. 같은 BuildContext를 가지는 위젯끼리 같은 것으로 간주됩니다.
FocusKey: 위젯이 포커스를 가지는 여부에 따라 식별됩니다.
SemanticsObjectKey: 위젯의 semantics(의미론) 정보에 의해 식별됩니다. 접근성과 관련된 정보를 표현하는데 사용됩니다.
CompositeKey: 위젯의 여러 속성을 결합하여 식별자를 생성합니다.</p>
</li>
<li><p>전역 키(Global Key)
GlobalKey: 전체 위젯 트리에서 유일한 식별자를 가지는 키입니다. 다른 위젯에서 해당 키를 참조할 수 있습니다.
LabeledGlobalKey: GlobalKey와 비슷하지만, 개발자가 직접 키 값을 지정할 수 있습니다.</p>
</li>
</ul>
</li>
<li><p>저장키(Persistence Key): 위젯을 식별하고, 상태를 저장하거나 복원하기 위해 사용되는 키입니다.</p>
<ul>
<li>PageStorageKey: 위젯의 스크롤 위치나 상태 등을 저장하는 용도로 사용됩니다.
각 키의 역할과 특징을 이해하고 적절한 상황에서 적절한 키를 사용하는 것이 중요합니다.</li>
<li>TransitionKey: 애니메이션을 유지하고 다시 시작할 때 애니메이션의 이전 상태를 복원할 수 있습니다. </li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[(동기) Gensequence with Typescript]]></title>
            <link>https://velog.io/@dev-tryit/%EB%8F%99%EA%B8%B0-Gensequence-with-Typescript</link>
            <guid>https://velog.io/@dev-tryit/%EB%8F%99%EA%B8%B0-Gensequence-with-Typescript</guid>
            <pubDate>Sun, 12 Feb 2023 09:38:47 GMT</pubDate>
            <description><![CDATA[<p>Dart에서의 Iterable 패턴을 통한 map, filter, take, skip과 같은 함수를 제공한다.</p>
<p>아래 형태로 활용 가능하다.</p>
<pre><code>    const wordGroups = filteredLine.split(&#39;|&#39;);
    const words = genSequence(wordGroups)
        .concatMap(a =&gt; [a, ...a.split(regExpSpaceOrDash)])
        .concatMap(a =&gt; splitCamelCase(a))
        .map(a =&gt; a.trim())
        .filter(s =&gt; s.length &gt; 2)
        .filter(s =&gt; !regExpRepeatChars.test(s))
        .map(a =&gt; a.toLowerCase())
        .reduceToSequence((s, w) =&gt; s.add(w), new Set());</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[(비동기) RxJS With Typescript]]></title>
            <link>https://velog.io/@dev-tryit/RxJS-With-Typescript</link>
            <guid>https://velog.io/@dev-tryit/RxJS-With-Typescript</guid>
            <pubDate>Sun, 12 Feb 2023 09:09:03 GMT</pubDate>
            <description><![CDATA[<p>RxJs는 Observer 패턴을 통해, 여러 사용자가 값을 구독하고, 감시하는 형태의 비동기 프로그래밍 코딩 스타일을 제공한다. filter, map, take, skip 등과 같은 유용한 체이닝 함수들을 제공한다.</p>
<h3 id="설치">설치</h3>
<pre><code>yarn add rxjs</code></pre><h3 id="typescript-설정">typescript 설정</h3>
<pre><code>추가 설정이 필요 없다.</code></pre><h3 id="observer의-생성-및-사용">Observer의 생성 및 사용</h3>
<pre><code>(생성) pipe : 연산할 내용 기술
(사용) subscribe : pipe에서의 연산 내용을 사용한다.</code></pre><p>```
//const source = from(fetch(&#39;/api/endpoint&#39;));
//const source = fromEvent(document, &#39;click&#39;);
//const source = of(1, 2, 3, 4, 5);
//const source = interval(1000);
const source = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);</p>
<p>//비동기적으로 활용하기
//var o = ajax(&#39;/api/data&#39;);
var o = source.pipe(skip(5));
o.subscribe(val =&gt; console.log(val));</p>
<p>참고)
<a href="https://flyingsquirrel.medium.com/rxjs-rxjs-fruits-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%96%B4%EB%B3%B4%EA%B8%B0-265c69be3ed7">https://flyingsquirrel.medium.com/rxjs-rxjs-fruits-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%96%B4%EB%B3%B4%EA%B8%B0-265c69be3ed7</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter에서 ios 빌드시에 version name, version number가 공유 안되는 이슈]]></title>
            <link>https://velog.io/@dev-tryit/ios%EC%97%90-%EB%B2%84%EC%A0%84-%EB%B0%98%EC%98%81%EC%95%88%EB%90%A8-Flutter</link>
            <guid>https://velog.io/@dev-tryit/ios%EC%97%90-%EB%B2%84%EC%A0%84-%EB%B0%98%EC%98%81%EC%95%88%EB%90%A8-Flutter</guid>
            <pubDate>Wed, 08 Feb 2023 11:03:24 GMT</pubDate>
            <description><![CDATA[<pre><code>flutter build ios</code></pre><p>위 명령어를 통해, xcode 프로젝트에 버전 내용이 반영된다.
하지만, 버전 적용을 위해서 매번 위 명령어를 사용하는 것은 매우 비효율적이다.</p>
<p>이를 위해서, 프로젝트에서 자동으로 pubspec.yaml에서 버전을
반영받는 방법이 있다. 그것은 FLUTTER_BUILD_NUMBER, FLUTTER_BUILD_NAME 환경 변수를 활용하는 것이다.</p>
<p>ios/Runner.xcodeproj/project.pbxproj에서 아래 내용을 수정하면 된다.</p>
<ul>
<li><p>이전</p>
<pre><code>CURRENT_PROJECT_VERSION = your buildnumber
MARKETING_VERSION = your version</code></pre></li>
<li><p>이후</p>
<pre><code>CURRENT_PROJECT_VERSION = &quot;$(FLUTTER_BUILD_NUMBER)&quot;;
MARKETING_VERSION = &quot;$(FLUTTER_BUILD_NAME)&quot;;</code></pre></li>
</ul>
<p>주의: CURRENT_PROJECT_VERSION,MARKETING_VERSION key가 해당 파일에 3번 나오므로, 3개 모두 수정해주어야한다.</p>
<p>참고)
<a href="https://stackoverflow.com/questions/65277520/flutter-not-using-build-number-from-pubspec-yaml">https://stackoverflow.com/questions/65277520/flutter-not-using-build-number-from-pubspec-yaml</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Firebase Distribution을 통한 ios 배포 주의사항]]></title>
            <link>https://velog.io/@dev-tryit/ios-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%94%94%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B7%B0%EC%85%98-%EB%B0%B0%ED%8F%AC-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@dev-tryit/ios-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%94%94%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B7%B0%EC%85%98-%EB%B0%B0%ED%8F%AC-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 08 Feb 2023 10:58:48 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>ios는 ipa를 통해 배포할 수 있다.</p>
</li>
<li><p>아래의 이유로 배포 후에, 테스터가 앱을 다운로드 못할 수 있다.</p>
<ul>
<li>해당 ipa의 번들명이 애플 개발자 도구에 등록되어 있어야 한다.</li>
<li>애플 개발자 도구에 테스터의 udid가 등록되어 있어야 한다.</li>
</ul>
</li>
</ul>
<p>참고)
<a href="https://ios-development.tistory.com/251">https://ios-development.tistory.com/251</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[서명키를 통한 카카오 로그인 해시키 등록]]></title>
            <link>https://velog.io/@dev-tryit/%EC%84%9C%EB%AA%85%ED%82%A4%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%95%B4%EC%8B%9C%ED%82%A4-%EB%93%B1%EB%A1%9D</link>
            <guid>https://velog.io/@dev-tryit/%EC%84%9C%EB%AA%85%ED%82%A4%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%95%B4%EC%8B%9C%ED%82%A4-%EB%93%B1%EB%A1%9D</guid>
            <pubDate>Tue, 07 Feb 2023 06:57:26 GMT</pubDate>
            <description><![CDATA[<ul>
<li>보통 인터넷에 돌아다니는 글을 보면, 업로드키를 통해 <strong>카카오 로그인을 위한 해시키</strong>를 뽑아낸다.</li>
<li>하지만, 업로드키+서명키 구조로 바뀐 이후부터는 구글 플레이 스토어에서 관리하는 SHA-1을 통해서, <strong>카카오 로그인을 위한 해시키</strong>를 뽑아내야한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/ce12e0ea-270c-419e-a81c-3f5336c14991/image.png" alt=""></p>
<ul>
<li>SHA-1를 아래 명령어로 돌리면, <strong>카카오 로그인을 위한 해시키</strong>가 출력된다.</li>
</ul>
<pre><code>echo &lt;구글플레이 SHA-1 인증서지문 입력&gt; | xxd -r -p | openssl base64</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[업로드 키와 서명 키,  그리고 파이어베이스 로그인과의 관계]]></title>
            <link>https://velog.io/@dev-tryit/%EC%97%85%EB%A1%9C%EB%93%9C-%ED%82%A4%EC%99%80-%EC%84%9C%EB%AA%85-%ED%82%A4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B3%BC%EC%9D%98-%EA%B4%80%EA%B3%84</link>
            <guid>https://velog.io/@dev-tryit/%EC%97%85%EB%A1%9C%EB%93%9C-%ED%82%A4%EC%99%80-%EC%84%9C%EB%AA%85-%ED%82%A4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%8C%8C%EC%9D%B4%EC%96%B4%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8%EA%B3%BC%EC%9D%98-%EA%B4%80%EA%B3%84</guid>
            <pubDate>Thu, 02 Feb 2023 14:02:06 GMT</pubDate>
            <description><![CDATA[<p>Google Play Store는 Play 서명을 제공한다.</p>
<p>Play 서명은 업로드 키와 서명 키로 동작한다.</p>
<table>
<thead>
<tr>
<th>구분</th>
<th>보관</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>업로드 키</td>
<td>개발자가 보관 및 책임짐</td>
<td>업로드할 때 필요함, 최초 업로드 시 서명할 때 사용한 키가 업로드 키가 됨</td>
</tr>
<tr>
<td>서명 키</td>
<td>구글이 보관 및 책임짐</td>
<td>스토어에 출시할 때 필요함</td>
</tr>
</tbody></table>
<p>업로드 키는 예전에 서명키로서 사용되었었지만,
사용자가 업로드 키를 분실하는 문제가 많아져,
구글에서 따로 서명키를 관리하기로 하여,
이전에 개발자가 활용하던 키를 업로드 키라고 부르게 되었다.</p>
<h3 id="핵심">핵심</h3>
<p>이제는 업로드 키를 잃어버리더라도,
나중에 업로드 키를 교체할 수 있는 매커니즘이 추가되었다.</p>
<p>즉,
업로드키는 업로드할 때 필요하고, 피치 못할 사정이 있을 시 교체된다.
서명키는 구글에서 잘 관리해주고, 서명할 때 필요해졌다.</p>
<h3 id="주의">주의</h3>
<p>파이어베이스 로그인 시에,
디버그 때는 업로드키의 sha-1을 활용하여 로그인을 허용하고,
릴리즈 때는 서명키의 sha-1를 활용하여 로그인을 허용한다.</p>
<p>따라서, 로그인이 잘되도록 하기 위해서는,
업로드키, 서명키의 sha-1를 파이어베이스에 모두 등록해야한다.</p>
<h3 id="aab-apk">AAB, APK</h3>
<p>AAB는 서명하지 않은 배포 파일로서, 구글은 aab로 apk를 만듭니다. 그리고 apk를 서명키로 서명하여, 앱 스토어에 배포합니다.</p>
<p>APK 배포 파일, 21년 8월 이후로 APK로 배포할 수 없습니다.</p>
<h3 id="참고">참고)</h3>
<p><a href="https://cocoslime.github.io/blog/Android-App-Signing/">https://cocoslime.github.io/blog/Android-App-Signing/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인증서와 PKI(공개키 기반 구조)의 이해]]></title>
            <link>https://velog.io/@dev-tryit/%EC%9D%B8%EC%A6%9D%EC%84%9C%EC%99%80-PKI%EA%B3%B5%EA%B0%9C%ED%82%A4-%EA%B8%B0%EB%B0%98-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@dev-tryit/%EC%9D%B8%EC%A6%9D%EC%84%9C%EC%99%80-PKI%EA%B3%B5%EA%B0%9C%ED%82%A4-%EA%B8%B0%EB%B0%98-%EA%B5%AC%EC%A1%B0%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Sun, 29 Jan 2023 10:39:54 GMT</pubDate>
            <description><![CDATA[<ul>
<li>공개키 기반구조(Public Key Infrastructure, PKI)</li>
</ul>
<h3 id="1-pki란">1. PKI란</h3>
<ul>
<li>공인 인증기관이 인터넷상에서 사용자간에 법적 효력이 있는 인증서를 전자적으로 분배, 전달, 제공함으로써 비인가된 자로부터 개인 정보보호, 전자상거래 위변조 방지 등을 수행 가능</li>
<li>목적 : 누구나 안전하고 편리하게, 효율적으로 공개키를 획득, 사용하게 함. 사용하는 인증서 표준은 주로 x.509</li>
<li>pki는 공개키를 인증/등록 기관과 같이 신뢰성 있는 제3자를 통해 관리하고 전달함.</li>
</ul>
<h3 id="2-pki의-주요-구성-요소">2. PKI의 주요 구성 요소</h3>
<ul>
<li><p>인증서 (Certificate) : 인증기관의 개인키로 서명한 인증서, 나의 공개키나 공개키의 정보를 포함하는 인증서</p>
</li>
<li><p>인증기관 (Certification Authority, CA) : 인증서의 발급 및 관리</p>
</li>
<li><p>등록기관 (Registration Authority, RA) : 신원확인, 고객 데이터 유지 등 인증기관의 입증을 대행하는 등록기관</p>
</li>
<li><p>저장소 (Repository) : 공개된 저장소 역할 (저장 및 검색 등)
인증서 : 버전, 일련번호, 유효기간, 식별자 등을 포함. 공개키와 공개키 소유자를 연결해줌.</p>
</li>
<li><p>사용자 : Client
<img src="https://velog.velcdn.com/images/dev-tryit/post/07815d2f-e0a6-4dff-8085-454f379b20a7/image.png" alt=""></p>
<ol>
<li>사용자A가 인증서를 RA에 요청</li>
<li>신분 검증 후 RA는 CA에 인증서 발급 요청</li>
<li>CA는 공개키와 개인키를 생성하여 사용자A에게 개인키를 주고 공개키와 인증서는 인증서 저장소에 저장</li>
</ol>
</li>
</ul>
<h3 id="3-인증서-폐기-여부-확인-방법">3. 인증서 폐기 여부 확인 방법</h3>
<p>인증서 폐기 목록 (Certification Revocation List, CRL)</p>
<p>CRL은 폐기된 인증서를 식별하는 시간소인된 목록을 포함하는 서명된 데이터 구조입니다. 폐기된 인증서는 더 이상 신뢰되지 않아 인증에 사용할 수 없습니다. 일반적으로 CRL은 사용자의 고용 상태 또는 업무가 변경되거나, 사용자의 인증서 또는 개인 키가 노출되는 경우 액세스를 차단합니다. </p>
<p>공인인증기관 CA에서 이러한 인증서 폐기 목록을 관리한다. 따라서 인증기관을 통해 인증서 폐기 여부를 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[암호화 방식]]></title>
            <link>https://velog.io/@dev-tryit/%EC%95%94%ED%98%B8%ED%99%94-%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@dev-tryit/%EC%95%94%ED%98%B8%ED%99%94-%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Sun, 29 Jan 2023 09:14:02 GMT</pubDate>
            <description><![CDATA[<ul>
<li>단방향 암호화 (무결성)<ul>
<li>암호화 O, 복호화 X.</li>
<li>왜 필요한가? 데이터 변조 확인을 위해 필요하다.</li>
<li>해시라고도 한다. 해시는 데이터 크기를 줄이는 용도로도 사용된다. (복호화가 필요 없으므로, 크기를 줄일 수 있다.)</li>
<li>md5, sha</li>
</ul>
</li>
<li>양방향 암호화 (기밀성, 무결성, 인증)<ul>
<li>암호화 O, 복호화 O.</li>
<li>대칭키(비밀키로 암호화 복호화)<ul>
<li>혼자서 데이터를 활용할 때 사용</li>
<li>AES, Twofish</li>
</ul>
</li>
<li>비대칭키(개인키,공개키로 암호화 복호화)<ul>
<li>pkc(공개키 암호화 방식)라고도 한다.</li>
<li>여러명이 데이터를 공유할 때 사용</li>
<li>RSA</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[비대칭키를 활용하여 데이터 보내기 (기밀성, 무결성, 인증)]]></title>
            <link>https://velog.io/@dev-tryit/%EB%B9%84%EB%8C%80%EC%B9%AD%ED%82%A4%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%B4%EB%82%B4%EA%B8%B0</link>
            <guid>https://velog.io/@dev-tryit/%EB%B9%84%EB%8C%80%EC%B9%AD%ED%82%A4%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%B4%EB%82%B4%EA%B8%B0</guid>
            <pubDate>Sun, 29 Jan 2023 08:50:00 GMT</pubDate>
            <description><![CDATA[<p>핵심: 메시지+전자서명메시지로 내가 보낸 메시지임을 증명할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/5351e90b-a7c7-43b6-bb36-2a3c07e21807/image.png" alt=""></p>
<ul>
<li>개인키(Private key), 공개키(Public key)</li>
<li>개인키로 암호화하면, 공개키로 복호화할 수 있고,</li>
<li>공개키로 암호화하면, 개인키로 복호화할 수 있다.</li>
</ul>
<hr>
<h2 id="전자-서명의-이해">전자 서명의 이해</h2>
<p>A-B 시스템이 있을 때,
A가 B에게 안전한 메시지를 보내고 싶을 때 개인키, 공개키, 전자서명을 사용한다. 전자 서명? 공개키로 메시지를 암호화하는 것을 의미한다. 나만 복호화할 수 있기 때문에 전자서명했다고 한다.</p>
<p>A는 B에게 메시지 + 전자서명된메시지를 보낸다.
B는 메시지+전자서명메시지를 받았을 때, 공개키로 전자서명 메시지를 복호화할 수 있다. 이 때, 메시지가 같은지 여부로 해당 메시지의 진위 여부를 파악할 수 있다.</p>
<ul>
<li>위조된 문서 <ul>
<li>복호화 되지 않는다.</li>
<li>복호화한 메시지가 같이 온 메시지와 내용이 다르다.</li>
</ul>
</li>
</ul>
<p>즉, 메시지+전자서명메시지를 같이 보내면, 데이터 보낸 것의 무결성, 인증을 보장할 수 있다.</p>
<h3 id="속도를-위해서-메시지를-해시해서-해시된메시지를-전자서명하기도-한다">속도를 위해서, 메시지를 해시해서 해시된메시지를 전자서명하기도 한다.</h3>
<h2 id="기밀성의-이해">기밀성의 이해</h2>
<p>A는 B의 공개키를 갖고 문서를 암호화하면, B의 개인키로만 복호화할 수 있다.
B는 A의 공개키를 갖고 문서를 암호화하면, A의 개인키로만 복호화할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[비대칭키를 활용하여 데이터 받기 (무결성, 기밀성)]]></title>
            <link>https://velog.io/@dev-tryit/%EB%B9%84%EB%B0%80%ED%82%A4%EC%99%80-%EA%B3%B5%EA%B0%9C%ED%82%A4</link>
            <guid>https://velog.io/@dev-tryit/%EB%B9%84%EB%B0%80%ED%82%A4%EC%99%80-%EA%B3%B5%EA%B0%9C%ED%82%A4</guid>
            <pubDate>Sun, 29 Jan 2023 08:18:08 GMT</pubDate>
            <description><![CDATA[<p>핵심: 비밀키를 갖은 나만 메시지를 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/ac2ca63a-a265-4c11-bfd8-85d2a0d0af1a/image.png" alt=""></p>
<ul>
<li>개인키(Private key), 공개키(Public key)</li>
<li>개인키로 암호화하면, 공개키로 복호화할 수 있고,</li>
<li>공개키로 암호화하면, 개인키로 복호화할 수 있다.</li>
</ul>
<p>A-B 시스템이 있을 때,
A가 B에게 안전한 메시지를 받고 싶을 때 개인키, 공개키를 사용한다.</p>
<p>A는 개인키를 갖고 있고, B에게 공개키를 준다.
B는 공개키를 갖고 메시지를 암호화해서 A에게 전달한다.
이 과정에서, 네트워크에서 암호화된것이 탈취당해도, 복호화할 개인키가 없기 때문에, 해당 메시지를 확인할 수 없다.</p>
<p>오로지, 비밀키를 갖고 있는
<strong>A만</strong>
B의 내용을 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[색의 의미 ]]></title>
            <link>https://velog.io/@dev-tryit/%EC%83%89%EC%9D%98-%EC%9D%98%EB%AF%B8</link>
            <guid>https://velog.io/@dev-tryit/%EC%83%89%EC%9D%98-%EC%9D%98%EB%AF%B8</guid>
            <pubDate>Sat, 28 Jan 2023 09:53:32 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th>색</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td>레드</td>
<td>열정</td>
</tr>
<tr>
<td>핑크</td>
<td>낭만,부드러움,예민</td>
</tr>
<tr>
<td>옐로우</td>
<td>충동,호기심,낙관</td>
</tr>
<tr>
<td>오렌지</td>
<td>사교적, 역동적</td>
</tr>
<tr>
<td>브라운</td>
<td>진실,현실적</td>
</tr>
<tr>
<td>그린</td>
<td>온화,평화</td>
</tr>
<tr>
<td>블루</td>
<td>평온,질서,책임감,충성</td>
</tr>
<tr>
<td>퍼플</td>
<td>권위주의적,차분,오묘한</td>
</tr>
<tr>
<td>그레이</td>
<td>무게감,답답함</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[색의 조합(구성)]]></title>
            <link>https://velog.io/@dev-tryit/%EC%83%89%EC%9D%98-%EC%A1%B0%ED%95%A9%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@dev-tryit/%EC%83%89%EC%9D%98-%EC%A1%B0%ED%95%A9%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Sat, 28 Jan 2023 09:50:16 GMT</pubDate>
            <description><![CDATA[<h3 id="유사색-조합구성">유사색 조합(구성)</h3>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/55f7b681-f53c-40e3-a7d5-6f1ee180a174/image.png" alt=""></p>
<ul>
<li>활용 방법<ul>
<li>요하네스 이텐의 색상환에서 연속된 3가지 색, 또는 그 색들의 Tone, TInt, Shade을 이용한 3가지 색</li>
</ul>
</li>
<li>장점<ul>
<li>색이 유사하기에 시각적으로 피로하지 않다.</li>
</ul>
</li>
</ul>
<h3 id="동일색-조합구성">동일색 조합(구성)</h3>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/6314a482-a977-445b-819a-aea5ee9c5085/image.png" alt=""></p>
<ul>
<li>활용 방법<ul>
<li>하나의 색에 대해 원색, Tint와 Shade로 3가지 구성</li>
</ul>
</li>
<li>장점<ul>
<li>동일 색에 대해서 명도만 바꾸었기 때문에 통일감, 정리감, 안정감이 느껴진다.</li>
</ul>
</li>
</ul>
<h3 id="무채색-조합구성">무채색 조합(구성)</h3>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/5cae13a4-a270-42eb-90fc-65e49672a2f0/image.png" alt=""></p>
<ul>
<li>활용 방법<ul>
<li>채색(잉크) 없이, 명도(빛)를 조절한다.</li>
</ul>
</li>
<li>장점<ul>
<li>진지한 느낌, 무거운 느낌, 경외감 등을 느낄 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="보색-조합구성">보색 조합(구성)</h3>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/9b304ac2-b711-4f0c-afda-f92b7b6423e7/image.png" alt=""></p>
<ul>
<li>활용 방법<ul>
<li>색상환의 보색(반대색)을 활용한다.</li>
</ul>
</li>
<li>장점<ul>
<li>반대색을 활용하였기에, 눈에 잘 띈다.</li>
</ul>
</li>
</ul>
<h3 id="1차색-2차색-조합구성">1차색, 2차색 조합(구성)</h3>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/30e1023d-3a16-412f-9156-6a2c8784e41f/image.png" alt=""></p>
<ul>
<li>활용 방법<ul>
<li>1차색 조합, 2차색 조합</li>
</ul>
</li>
<li>장점<ul>
<li>원색을 활용했기 때문에 순순한 느낌을 줄 수 있다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[RGB vs CMYK 의 이해]]></title>
            <link>https://velog.io/@dev-tryit/RGB-vs-CMYK-%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@dev-tryit/RGB-vs-CMYK-%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Sat, 28 Jan 2023 09:13:35 GMT</pubDate>
            <description><![CDATA[<table>
<thead>
<tr>
<th>자연현상</th>
<th>이론</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>빛의 3원색</td>
<td>RGB색체계</td>
<td>[가산혼합(섞이면밝음)], 밝은 색을 표현하기 좋음</td>
</tr>
<tr>
<td>색의 4원색</td>
<td>CMYK색체계</td>
<td>[감산혼합(섞이면어두움)], 밝은 색을 표현하기 어려움</td>
</tr>
<tr>
<td>즉, 모니터 출력용이면 RGB를 활용하고, 인쇄 출력용이면 CMYK를 활용하자.</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<br/>
<div style="text-align: left"> 
<img src="https://velog.velcdn.com/images/dev-tryit/post/61510ade-3b67-4a7f-b286-ffc3d1540bbe/image.png"/>
</div>
- 사람 눈이 식별가능한 색의 수 > RGB 색의 수 > CMYK 색의 수
- RGB, CMYK의 경우 데이터 비트수를 늘리면 더 많은 색을 표현할 수 있을것이다. 그렇지만, 빛을 표현하고 잉크를 표현하는 하드웨어 기술들이 증가하지 않으면 의미 없을 것이다.
- 즉, 먼 미래까지는 눈으로 담는 것이 가장 생생할 것이다.
]]></description>
        </item>
        <item>
            <title><![CDATA[Tint, Tone, Shade의 이해]]></title>
            <link>https://velog.io/@dev-tryit/Tint-Tone-Shade%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@dev-tryit/Tint-Tone-Shade%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Sat, 28 Jan 2023 08:46:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev-tryit/post/b1f12c5a-29fd-4c25-bfef-34bf29b8b067/image.png" alt=""></p>
<table>
<thead>
<tr>
<th>용어</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Tint</td>
<td>흰색 + 특정색</td>
</tr>
<tr>
<td>Tone</td>
<td>회색(흰+검) + 특정색</td>
</tr>
<tr>
<td>Shade</td>
<td>검은색 + 특정색</td>
</tr>
</tbody></table>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/1be803d4-7525-4bc8-9a14-2438ed47a6b8/image.png" alt=""></p>
<ul>
<li>중앙에서부터 Color, Shade, Tone, Tint</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Color Vs Hue]]></title>
            <link>https://velog.io/@dev-tryit/Color-Vs-Hue</link>
            <guid>https://velog.io/@dev-tryit/Color-Vs-Hue</guid>
            <pubDate>Sat, 28 Jan 2023 08:42:59 GMT</pubDate>
            <description><![CDATA[<h1 id="버건디">버건디</h1>
<table>
<thead>
<tr>
<th>용어</th>
<th>설명</th>
<th>예시</th>
<th>그림</th>
</tr>
</thead>
<tbody><tr>
<td>Color</td>
<td>색</td>
<td>버건디</td>
<td><img src="https://velog.velcdn.com/images/dev-tryit/post/5b92af9d-cab5-45a5-913a-31ae6faced5c/image.png" alt=""></td>
</tr>
<tr>
<td>Hue</td>
<td>특정 색을 가장 많이 차지하는 색</td>
<td>빨간색</td>
<td><img src="https://velog.velcdn.com/images/dev-tryit/post/0fdde708-2312-43b4-9441-9d8ca9a1fde6/image.png" alt=""></td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[색의 분류와 색의 3속성]]></title>
            <link>https://velog.io/@dev-tryit/%EC%83%89Color%EC%9D%98-3%EC%86%8D%EC%84%B1</link>
            <guid>https://velog.io/@dev-tryit/%EC%83%89Color%EC%9D%98-3%EC%86%8D%EC%84%B1</guid>
            <pubDate>Sat, 28 Jan 2023 08:31:05 GMT</pubDate>
            <description><![CDATA[<h2 id="색의-분류">색의 분류</h2>
<h3 id="색은-연속적이지만-사람이-색을-표현하려면-이산적이어야-한다">색은 연속적이지만, 사람이 색을 표현하려면 이산적이어야 한다.</h3>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/85794074-be0a-40c0-9a07-6a7bfc510414/image.png" alt="">
컬러 그라디언트</p>
<h3 id="이산적분류-요하네스-이텐의-12색상환">(이산적분류) 요하네스 이텐의 12색상환</h3>
<p><img src="https://velog.velcdn.com/images/dev-tryit/post/87b67a47-2f3a-46d0-a23b-fbea08897ebf/image.png" alt=""></p>
<ul>
<li>1차색(3개) + 2차색(3개) + 3차색(6개)을 섞어서 12개의 색을 완성하였다.<h4 id="1차색-3개">1차색 (3개)</h4>
</li>
<li>절대로 다른 색을 섞어서 만들 수 없는 기본이 되는 색</li>
<li>노파빨(Yellow, Blue, Red)를 나타냄<h4 id="2차색-3개">2차색 (3개)</h4>
</li>
<li>1차색 2개를 섞으면 나오는 색</li>
<li>오보초(Orange, Purple, Green)을 나타냄<h4 id="3차색-6개">3차색 (6개)</h4>
</li>
<li>1차색 + 2차색을 섞어 나오는 색</li>
<li>Yellow-Oragne, Red-Orange, Red-Purple, Blue-Purple(남보라), Blue-Green(청록), Yellow-Green(연두)</li>
</ul>
<hr>
<h2 id="색의-3속성">색의 3속성</h2>
<ul>
<li>HSV는 hue, saturation, value의 약자이다.</li>
<li>원색(hue), 채도(saturation), 명도(value),<ul>
<li>원색 : 12 색상환이 아닌, 연속적인 색의 원색</li>
<li>채도 : 잉크가 얼마나 진한가?
(유채색 : 색 Yes + 빛 조절)</li>
<li>명도 : 빛이 얼마나 진한가?
(무채색 : 색 No, 빛만 조절)</li>
</ul>
</li>
</ul>
<h3 id="원색hue의-이해">원색(Hue)의 이해</h3>
<hr>
<p><img src="https://blog.kakaocdn.net/dn/cwtjDn/btqt19O9E9T/RvanEOconl3XzVnuJ5DMMk/img.png" alt="https://blog.kakaocdn.net/dn/cwtjDn/btqt19O9E9T/RvanEOconl3XzVnuJ5DMMk/img.png"></p>
<p>빨강, 주홍, 주황, 노랑, 연두와 같이 일반적으로 부르는 빛깔 이름을 뜻한다. </p>
<h3 id="명도value의-이해">명도(Value)의 이해</h3>
<hr>
<p><img src="https://blog.kakaocdn.net/dn/br7a6k/btqt1GNqPZy/hVFkxfqSKpQjW5JmCjT7rK/img.png" alt="https://blog.kakaocdn.net/dn/br7a6k/btqt1GNqPZy/hVFkxfqSKpQjW5JmCjT7rK/img.png"></p>
<p>여기서 하나의 색상에서도 밝은 색과 어두운 색까지 다양한 색상이 존재하는데 이렇듯 &#39;밝다&#39;와 &#39;어둡다&#39;로 표현하는 것을 명도라고 한다. <strong>화이트를 많이 섞을 수록 명도가 높아지고, 블랙이 많이 섞이게 되면 명도가 낮아진다.</strong> 이때에 화이트가 높은<strong>(명도가 높은) 컬러를 틴트(tint)</strong>, 블랙이 높은<strong>(명도가 낮은) 컬러를 쉐이드(shade)</strong>라고 한다.</p>
<h3 id="채도saturation의-이해">채도(Saturation)의 이해</h3>
<hr>
<p><img src="https://blog.kakaocdn.net/dn/cB5SYF/btqt0UMaMUL/kwGpnaGKg7akFL7Kklk8AK/img.png" alt="https://blog.kakaocdn.net/dn/cB5SYF/btqt0UMaMUL/kwGpnaGKg7akFL7Kklk8AK/img.png"></p>
<p>채도란 색의 선명함 정도를 말하며, 선명도가 높은지 낮은지에 따라 선명함이 달라진다. 여기서 채도가 0일 경우 무채색이라 칭한다</p>
]]></description>
        </item>
    </channel>
</rss>