<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>owl-recorder.log</title>
        <link>https://velog.io/</link>
        <description>새벽 2시만 되면, 안 자고 싶어진다. </description>
        <lastBuildDate>Mon, 25 Aug 2025 12:35:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>owl-recorder.log</title>
            <url>https://velog.velcdn.com/images/owl-recorder/profile/df4ba912-ab3c-4eda-84c9-91b5e23ea410/image.webp</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. owl-recorder.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/owl-recorder" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[FEConf 2025 후기]]></title>
            <link>https://velog.io/@owl-recorder/FEConf-2025-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@owl-recorder/FEConf-2025-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Mon, 25 Aug 2025 12:35:39 GMT</pubDate>
            <description><![CDATA[<p>취소표를 양도 받을 수 있어서 방문했다. 
컨퍼런스는 참여해본 적이 별로 없었는데,
다녀오니 흥미로운 주제도 많았고, 열심히 하는 분들을 많이 보니 동기부여가 되었다. </p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/d7d9819a-e453-4a79-ad17-04f2109b1d7c/image.png" alt=""></p>
<p>거의 시간 맞춰갔더니 굳즈는 거의 스티커만 남은 상태! 
살짝 기대했는데 아쉬웠다. 1시간은 일찍 가야한다고 한다</p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/19e045a6-1b5a-439d-9c91-294b9fd7289c/image.png" alt=""></p>
<p>시간을 맞춰가서 앞부분은 잘 못들었는데, 
리액트는 컴포넌트 구조여서 애니메이션 구현할 때 어려웠던 부분이 있었다.
스벨트에서 transition API 를 사용하면 훨씬 수월하다는 내용이였던 것 같다. </p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/aa858995-9366-41e6-8cfb-b1ababa7721b/image.png" alt=""></p>
<p>부모 컴포넌트가 리랜더링 될 때 자식도 같이 리랜더링되는 것을 막기 위하여 useMemo 를 쓰지만, 많이 쓰면 오버헤드가 발생할 수도 있다. 
개발자가 기준을 가지고 사용해야하는데 React Compiler를 사용하면 Compiler 의 기준으로 자동으로 적용된다. 메모리의 과한 사용없이 성능 향상될 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/6be74f68-7b0b-411e-b214-9939d949d593/image.png" alt=""></p>
<p>퍼블리셔로 오래 일하다보니 CSS에 관심이 많고, 가장 관심이 있었던 섹션이였는데 내용이 살짝 아쉬웠다. (살짝 자랑만 하다 끝난 느낌.) 
오픈소스 아카데미라는 프로그램에 대해 공유 받았는데 이걸 진행해보고 싶기도 하다.</p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/fca2603e-2ec5-457c-91cc-1943ff7e4dde/image.png" alt=""></p>
<p>SEO는 매출하고 관련되어 있으니 가장 중요한 신경써야하는 부분 중 하나라고 생각한다
그런데 지표가 빠르게 상승하지 않아서, 항상 내가 하고 있는 게 맞는 지 의문스럽고 확실한 정답이 없다고 느껴져서 들었던 섹션이다. 
그런데 발표 내용이 명료하고 많은 고민을 하셨던게 느껴져서 발표자분과 함께 일하고 싶고 강남언니에서 일하고 싶어질 정도였다. </p>
<ul>
<li>동일하게 SEO를 적용해도 PC와 모바일의 차이가 있는데, 이것을 어떻게 해결해야할 지</li>
<li>퀼리티가 높은 페이지가 우선 노출된다고 했는데, 퀼리티가 높은 페이지의 기준이 어떻게 되는  지 를 테스트 해보고 싶다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/16e9c703-23c2-4b3e-98a0-727209f9fd50/image.png" alt=""></p>
<p>화면단에서 고화질 이미지 사용이나 컨텐츠가 많아지면서 성능 이슈를 항상 고민해서 들었던 섹션이다. GPU 사용은 생각하지 못 했던 방식이였다.</p>
<p>똑똑하고 정말 개발 좋아하신다고 느꼈던 분..</p>
<p>데이터 만 개 까지는 CPU 가 더 빨랐으나 그 이상은 GPU를 사용하는 것이 더 성능이 좋았다.</p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/4f801a87-90a6-4fb2-ae21-6feac912b928/image.png" alt=""></p>
<p>이전에 웹빌더 구축 퍼블리싱도 했었고, 웹빌더 관련된 기능 제작도 진행했던지라, 심지어 지금 웹빌더 회사에서 근무하고 있어서 들었던 섹션이다. </p>
<p>발표자는 웹에디터를 텍스트/블럭/그리드 에디터로 중 그리드 에디터를 구현하셨다.
항상 블록 에디터만 보다가 그리드 에디터를 처음 알게 되었는다. 
이커머스에서 오래 일하다보니 이 에디터가 판매자에게 더 많은 수익을 가져다줄 수 있는 에디터일까? 를 고민했는데, 디자인이 중요한 웹빌더에서는 더 유용할 것 같고 개발코드를 모르더라도 커스텀이 더 자유로울 것 같았다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강의록] HTTP 웹 기본 지식]]></title>
            <link>https://velog.io/@owl-recorder/%EA%B0%95%EC%9D%98%EB%A1%9D-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8-%EC%A7%80%EC%8B%9D</link>
            <guid>https://velog.io/@owl-recorder/%EA%B0%95%EC%9D%98%EB%A1%9D-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8-%EC%A7%80%EC%8B%9D</guid>
            <pubDate>Wed, 06 Aug 2025 12:03:12 GMT</pubDate>
            <description><![CDATA[<h1 id="인터넷-네트워크">인터넷 네트워크</h1>
<p><strong>인터넷 프로토콜의 4계층</strong>
4층 - 애플리케이션계층 : HTTP,FTP
3층 - 전송 계층 : TCP, UDP
2층 - 인터넷 계층 : IP
1층 - 네트워크 인터페이스 계층</p>
<h2 id="프로토콜">프로토콜</h2>
<h3 id="ip">IP</h3>
<ul>
<li>IP 주소에 패킷이라는 통신 단위로 데이터 전달.</li>
</ul>
<h4 id="패킷정보">패킷정보</h4>
<ul>
<li>출발지 IP, 목적지 IP, </li>
<li>전송 데이터</li>
</ul>
<h4 id="한계점">한계점</h4>
<ol>
<li>서비스가 불능이여도 패킷 전송, </li>
<li>패킷이 사라질 수 있고, 순서대로 오지 않을 수도 있음</li>
<li>같은 IP에서 여러개의 앱을 사용하는 경우 어디로 도착할지 구분하기 어려움. </li>
</ol>
<h3 id="tcpip">TCP/IP</h3>
<ul>
<li>IP 방식의 한계점을 극복한 프로토콜, 대부분의 애플리케이션에서 사용하는 프로토클</li>
<li>TCP 3 Way handshake - 가상연결 : 연결이 되었는 지 확인하고 데이터를 보냄 </li>
<li>데이터 전달 보증 : 데이터를 받았는 지 받은 서버가 이야기 함.</li>
<li>순서 보장 : 순서가 잘 못되면 받은 서버에서 재전달 요청을 보냄 </li>
</ul>
<h4 id="패킷정보-1">패킷정보</h4>
<ul>
<li>출발지 IP, 목적지 IP, </li>
<li>전송 데이터</li>
<li>출발지 port, 목적지 port</li>
<li>전송 제어, 순서, 검증 정보</li>
</ul>
<h3 id="udp">UDP</h3>
<ul>
<li>IP 와 거의 같음</li>
<li>포트, 체크섬이 추가된 개념</li>
<li>필요하면 애플리케이션내에서 UDP 를 수정/확장할 수 있고 TCP 3 Way handshake 최적화 등이 필요할 때 여기서 수정함. </li>
</ul>
<h2 id="port">port</h2>
<ul>
<li>같은 IP 내에서 프로세스를 구분하는 것.</li>
<li>0 ~ 65535 : 할당가능</li>
<li>0 ~ 1023 : 잘 알려진 포트 ,사용하지 않는 것이 좋음</li>
<li>20, 21 : FTP</li>
<li>23 : TELNET</li>
<li>80 : HTTP</li>
<li>443 : HTTPS</li>
</ul>
<h2 id="dns-domain-name-system">DNS (Domain Name System)</h2>
<ul>
<li>IP 에 이름을 부여하여 DNS 서버에 저장. </li>
</ul>
<h2 id="uri">URI</h2>
<h3 id="uri-uniform-resource-identifier">URI (Uniform Resource Identifier)</h3>
<h3 id="url-uniform-resource-locator">URL (Uniform Resource Locator)</h3>
<ul>
<li>리소스가 있는 위치 지정</li>
</ul>
<h4 id="형식">형식</h4>
<pre><code>    scheme://[userinfo@]host[:port][/path][?query][#fragment]</code></pre><ul>
<li>scheme : 주로 프로토콜 사용</li>
<li>userinfo : url 에 사용자 정보를 포함할 때 사용하나 거의 사용하지않음</li>
<li>host : 도메인명, ip명</li>
<li>port : http/https 는 port 생략 가능</li>
<li>path : 리소스가 있는 경로</li>
<li>query <ul>
<li>key-value 형태, </li>
<li>? 로 시작하고 &amp;로 추가 가능</li>
<li>query paramether/query string 으로 불림</li>
</ul>
</li>
<li>fragment <ul>
<li>잘 사용하지 않음</li>
<li>HTML 내부 북마크 등에서 사용하고 서버에 전송되지 않음</li>
</ul>
</li>
</ul>
<h3 id="urn-uniform-resource-name">URN (Uniform Resource Name)</h3>
<ul>
<li>리소스에 이름 부여</li>
<li>보편적이지 않은 방법</li>
</ul>
<h2 id="웹-브라우저-요청-흐름">웹 브라우저 요청 흐름</h2>
<p><code>https://google.com</code></p>
<ol>
<li>브라우저에 URL 을 입력한다.</li>
<li>브라우저가 DNS 서버를 조회하여 IP 를 찾는다. </li>
<li>브라우저가 scheme를 참고하여 port 정보를 찾는다 (HTTP 80/HTTPS 443) </li>
<li>브라우저가 HTTP 요청 메시지를 생성한다.</li>
<li>브라우저가 구글 서버에서 데이터를 받을 수 있는 지 확인한다 (TCP 3 Way handshake) </li>
<li>브라우저가 소켓 라이브러리를 통해 데이터를 전달한다.</li>
<li>구글 서버가 소켓의 HTTP 요청 메시지를 확인하고 내용을 해석한다</li>
<li>구글서버가 HTTP 응답 메시지를 만든다.</li>
</ol>
<h2 id="http-hyper-text-transfer-protocol">HTTP (Hyper Text Transfer Protocol)</h2>
<ul>
<li>모든 형태의 데이터를 전송할 수 있다.</li>
<li>서버 간의 데이터 통신할 때도 사용한다.</li>
</ul>
<h3 id="버전">버전</h3>
<h4 id="http-11">HTTP 1.1</h4>
<ul>
<li>TCP 프로토콜 사용</li>
<li>가장 많이 사용하는 버전</li>
</ul>
<h4 id="http-2">HTTP 2</h4>
<ul>
<li>TCP 프로토콜 사용</li>
</ul>
<h4 id="http-3">HTTP 3</h4>
<ul>
<li>UDP 프로토콜 사용</li>
</ul>
<h3 id="특징">특징</h3>
<h4 id="클라이언트-서버-구조">클라이언트 서버 구조</h4>
<ul>
<li>Request Response 구조</li>
</ul>
<ol>
<li>클라이언트는 서버에 요청을 보내고 대기 </li>
<li>서버가 요청에 대한 결과를 만들어서 응답 </li>
<li>응답받은 내용을 브라우저에 노출</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강의록] 타입스크립트 입문 - 기초부터 실전까지]]></title>
            <link>https://velog.io/@owl-recorder/%EA%B0%95%EC%9D%98%EB%A1%9D-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%85%EB%AC%B8-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-%EC%8B%A4%EC%A0%84%EA%B9%8C%EC%A7%80</link>
            <guid>https://velog.io/@owl-recorder/%EA%B0%95%EC%9D%98%EB%A1%9D-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%85%EB%AC%B8-%EA%B8%B0%EC%B4%88%EB%B6%80%ED%84%B0-%EC%8B%A4%EC%A0%84%EA%B9%8C%EC%A7%80</guid>
            <pubDate>Tue, 08 Apr 2025 10:45:59 GMT</pubDate>
            <description><![CDATA[<img src="https://velog.velcdn.com/images/owl-recorder/post/bb6683a8-503f-448c-8c77-7047d8f58ba9/image.png" width="300"/>

<ul>
<li>캡틴판교 : 타입스크립트 입문 - 기초부터 실전까지 </li>
</ul>
<hr>
<h2 id="강의록">강의록</h2>
<h3 id="type">type</h3>
<h4 id="튜플">튜플</h4>
<p>배열의 특정 index 의 타입을 지정하는 것</p>
<pre><code class="language-ts">const address: [string, number]</code></pre>
<h3 id="ts-config">ts config</h3>
<pre><code class="language-json">
{
  &quot;compilerOptions&quot;: {
    &quot;allowJs&quot;: true,             // js 사용 여부
    &quot;checkJs&quot;: true,            // js 파일에서 type 체크 여부
    &quot;noImplicitAny&quot;: false        // any 타입 허용 여부
  },
  &quot;include&quot;: [&quot;./src/**/*&quot;]
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강의록] 타입스크립트로 블록체인 만들기]]></title>
            <link>https://velog.io/@owl-recorder/%ED%9A%8C%EA%B3%A0-%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%94-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@owl-recorder/%ED%9A%8C%EA%B3%A0-%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%94-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 07 Apr 2025 00:21:16 GMT</pubDate>
            <description><![CDATA[<img src="https://velog.velcdn.com/images/owl-recorder/post/ec30ebe4-aae6-49c5-b8f2-b354874ac2c9/image.png" width="300px">

<ul>
<li>노마드코더 : 타입스크립트로 블록체인 만들기</li>
</ul>
<hr>
<p>몇 번 시도하다가 드디어 완강!</p>
<p>블록체인을 실제로 만든다고 생각했는데, 그런 건 아니었고,
타입스크립트에 좀 더 중점을 둔 강의였다. </p>
<ul>
<li>데이터 타입,</li>
<li>접근제어자</li>
<li>type, interface, class  </li>
<li>javascript 와 typescript 호환</li>
<li>ts config</li>
<li>기능 만들기 (블록체인)</li>
</ul>
<p>내용은 다른 강의와 비슷한데.
깊게 설명해줘서 유익했다. 
<br></p>
<hr>
<br>

<h2 id="강의록">강의록</h2>
<br>

<h3 id="접근제어자">접근제어자</h3>
<table>
<thead>
<tr>
<th><strong>키워드</strong></th>
<th><strong>설명</strong></th>
<th><strong>접근 범위</strong></th>
<th><strong>특징</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>public</strong></td>
<td>클래스, 메소드, 변수 등을 외부에서 접근 가능하게 만듦</td>
<td>클래스 외부와 내부, 다른 클래스에서 모두 접근 가능</td>
<td>모든 곳에서 접근 가능</td>
</tr>
<tr>
<td><strong>private</strong></td>
<td>클래스 내부에서만 접근할 수 있도록 제한</td>
<td>클래스 내부에서만 접근 가능</td>
<td>외부에서는 접근 불가, 클래스 내부에서만 사용 가능</td>
</tr>
<tr>
<td><strong>protected</strong></td>
<td>클래스 내부와 그 클래스를 상속한 자식 클래스에서만 접근 가능</td>
<td>클래스 내부 및 자식 클래스에서만 접근 가능</td>
<td>자식 클래스에서 접근 가능, 외부에서는 불가</td>
</tr>
<tr>
<td><strong>static</strong></td>
<td>인스턴스 없이 클래스 자체에서 접근할 수 있도록 만듦</td>
<td>클래스 이름을 통해 접근 가능</td>
<td>클래스 레벨에서 접근 가능, 객체 인스턴스 필요 없음</td>
</tr>
</tbody></table>
<ul>
<li>static 은 javascript 문법</li>
</ul>
<h3 id="read-only">read-only</h3>
<ul>
<li>외부에서 접근은 가능하지만 수정은 불가능. </li>
</ul>
<pre><code class="language-typescript">     public read-only food: strong = &#39;kimchi&#39;;</code></pre>
<h3 id="타입type-과-인터페이스interface">타입(Type) 과 인터페이스(Interface)</h3>
<ul>
<li>타입을 지정하는 것보다 타입스크립트가 타입을 추론하게 하는 것이 좋다. </li>
<li>타입스크립트에서는 클래스와 오브젝트의 타입을 정의할 때는 interface 를 그 외에는 type 을 사용할 것을 권고함. </li>
</ul>
<h4 id="타입type">타입(Type)</h4>
<ul>
<li>복합 타입, 유니언 타입등 다양한 타입 정의 가능</li>
<li>같은 이름의 타입을 새로 정의하면 에러 발생 </li>
</ul>
<pre><code class="language-typescript">// type 으로 변수 타입 지정
type food = string
type StringOrNumber = string | number;  // 유니언 타입

// type 으로 객체 타입 지정
type food = {
    snack : string,
    meal : string
}

// 확장
type food = snack &amp; {
    meal: string
}</code></pre>
<h4 id="인터페이스interface">인터페이스(Interface):</h4>
<ul>
<li>다른 인터페이스를 상속하여 확장할 수 있다.</li>
<li>추상클래스로도 클래스의 형태를 정의할 수 있지만 javascript 로 변환한 뒤에도 코드가 남아있기 떄문에 인터페이스로 작성하는 것이 더 가볍다. </li>
<li>같은 이름의 인터페이스를 새로 정의하면 각 인터페이스가 결합됨. </li>
</ul>
<pre><code class="language-typescript">interface food = {
    snack : string,
    meal : string
}

interface food = {
    snack : string,
    meal : string
}

// 확장
interface worldFood extends food {
    koreafood: string
}</code></pre>
<h3 id="typescript-에서-javascript-를-사용하는-법">typescript 에서 javascript 를 사용하는 법</h3>
<ul>
<li>d.ts 파일 사용 (Declaration File)</li>
<li>패키지나 라이브러리는 js 로 개발된 경우가 많아서 타입지정이 필요하다 <code>.node_modules/@types</code> 에 관련된 타입이 지정되어있다.</li>
</ul>
<h3 id="javascript-를-typescript-처럼-사용하는-법">javascript 를 typescript 처럼 사용하는 법</h3>
<ul>
<li>jsdoc 을 사용하면 js 소스에서 type hint를 볼 수 있음<ul>
<li><a href="https://jsdoc.app/">https://jsdoc.app/</a></li>
</ul>
</li>
<li><code>@ts-check</code> 주석은 type 이 맞지 않을 경우 에러를 표시함</li>
</ul>
<pre><code class="language-js">    // @ts-check

    /**
     * show error 
     * @param errorMessage 
     * @returns 
     */
</code></pre>
<h3 id="tsconfigjson">tsconfig.json</h3>
<pre><code class="language-json">{
  &quot;include&quot;: [&quot;src&quot;],
  &quot;compilerOptions&quot;: {
    &quot;outDir&quot;: &quot;build&quot;,
    &quot;target&quot;: &quot;ES6&quot;,          // target 버전으로 컴파일됨
    &quot;lib&quot;: [&quot;ES6&quot;],              // es6 에 대한 정보를 가지고 있음. 메서드 자동 완성 등을 지원함.
    &quot;strict&quot;: true,              // javascript 사용 어려움. d.ts 파일 사용 등 타입 정의 필요
    &quot;esModuleInterop&quot;: true,
    &quot;module&quot;: &quot;CommonJS&quot;      // node.js 에서 사용하는 모듈 시스템 사용 가능 
  }
}</code></pre>
<h3 id="crypto-module">crypto module</h3>
<ul>
<li>node 의 내장 모듈인 crypto 모듈을 사용하여 SHA-256 해시를 생성</li>
</ul>
<pre><code class="language-js">    crypto.createHash(&quot;sha256&quot;).update( {해시로 변경하고 싶은 문자} ).digest(&quot;hex&quot;);</code></pre>
<ul>
<li><code>crypto.createHash(&quot;sha256&quot;)</code> : SHA-256 해시 객체를 생성.<ul>
<li>SHA-256 : 256비트(32바이트) 길이의 고유한 해시 값을 생성하는 암호화 알고리즘</li>
</ul>
</li>
<li><code>.update( {해시로 변경하고 싶은 문자} )</code> : 데이터를 해시 객체에 추가합니다.</li>
<li><code>.digest(&quot;hex&quot;)</code> : 최종 해시 값을 계산하고, 16진수 문자열 형식으로 반환.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[간트차트 만들기 - phase1 기능 구현]]></title>
            <link>https://velog.io/@owl-recorder/%EA%B0%84%ED%8A%B8%EC%B0%A8%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EA%B8%B0%EB%8A%A5-%EB%A7%8C%EB%93%A4</link>
            <guid>https://velog.io/@owl-recorder/%EA%B0%84%ED%8A%B8%EC%B0%A8%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EA%B8%B0%EB%8A%A5-%EB%A7%8C%EB%93%A4</guid>
            <pubDate>Tue, 11 Mar 2025 16:40:15 GMT</pubDate>
            <description><![CDATA[<h1 id="phase1-기능">[phase1 기능]</h1>
<h2 id="일감-등록수정">일감 등록/수정</h2>
<ul>
<li><code>react-datepicker</code> 라이브러리를 사용하여 날짜 선택 기능 제공</li>
</ul>
<h2 id="list">list</h2>
<ul>
<li>등록된 일감을 바그래프로 확인 가능. </li>
<li>등록된 날짜가 지나면 바그래프의 색상이 달라짐</li>
<li>등록된 일감은 상세일정으로 나눠서 표시할 수 있음. </li>
<li>일감을 완료시킬 수 있음.</li>
</ul>
<h2 id="history">history</h2>
<ul>
<li>수정 날짜와 수정내역을 확인할 수 있음</li>
</ul>
<h2 id="filter">filter</h2>
<ul>
<li>미완료/완료된 일감을 구분하여 확인 가능 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[간트차트 만들기 - 1. 프로젝트 설계]]></title>
            <link>https://velog.io/@owl-recorder/%EC%82%AC%EC%9D%B4%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B0%84%ED%8A%B8%EC%B0%A8%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-1.-%EA%B3%84%ED%9A%8D</link>
            <guid>https://velog.io/@owl-recorder/%EC%82%AC%EC%9D%B4%EB%93%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B0%84%ED%8A%B8%EC%B0%A8%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-1.-%EA%B3%84%ED%9A%8D</guid>
            <pubDate>Mon, 10 Mar 2025 15:21:56 GMT</pubDate>
            <description><![CDATA[<p>간트차트는 프로젝트의 일정관리를 위해서 작성하는 바형태의 그래프이다. 
이미지처럼 왼쪽에 과업과 날짜를 기입하고 오른쪽에 날짜를 바형태로 표시한다. </p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/0953a519-a579-4ba8-9ae5-20973fab3a51/image.png" alt=""></p>
<p>타고난 J 라 계획+일정짜는 것을 좋아하는데, 
간트차트를 만들려면 엑셀로 한땀한땀만들거나 돈을 내고 서비스를 이용해야한다.<br>엑셀로 만드는 것은 너무 번거로워서 웹사이트로 만들어보려고 한다. </p>
<h2 id="stack">[STACK]</h2>
<ul>
<li>vite</li>
<li>react, react-query, typescript, zustand</li>
<li>styled-components</li>
<li>supabase</li>
</ul>
<h2 id="기능">[기능]</h2>
<h3 id="phase1">[phase1]</h3>
<ul>
<li>일감 등록/수정</li>
<li>list<ul>
<li>등록된 일감을 바그래프로 확인 가능. </li>
<li>등록된 날짜가 지나면 바그래프의 색상이 달라짐</li>
<li>등록된 일감은 상세일정으로 나눠서 표시할 수 있음. </li>
<li>일감을 완료시킬 수 있음.</li>
</ul>
</li>
<li>history  <ul>
<li>수정 날짜와 수정내역을 확인할 수 있음</li>
</ul>
</li>
<li>filter  <ul>
<li>미완료/완료된 일감을 구분하여 확인 가능 </li>
</ul>
</li>
</ul>
<h3 id="phase2">[phase2]</h3>
<ul>
<li>excel 다운로드</li>
<li>excel을 email 로 발송</li>
</ul>
<h3 id="phase3">[phase3]</h3>
<ul>
<li>여러 프로젝트를 만들고 프로젝트마다 다른 사람을 초대할 수 있음. </li>
<li>history<ul>
<li>수정한 사람 표시</li>
</ul>
</li>
<li>로그인, 회원가입</li>
</ul>
<h2 id="프로젝트-구조">[프로젝트 구조]</h2>
<pre><code class="language-bash">    npm create vite@latest</code></pre>
<p>npm 을 이용하여 Vite + React + Typescript 로 Scaffolding 하였다. </p>
<pre><code>src/
│   ├── assets/             # 이미지, 폰트 등 정적 리소스
│   ├── components/            # 리액트 UI 컴포넌트
│   ├── env/                # 환경 변수 위치
│   ├── model/                # 타입 정의 
│   ├── pages/                # 페이지 컴포넌트
│   ├── pipe/                # 데이터 변환을 위한 코드 
│   ├── sevice/                # 외부 API 호출, 비즈니스 로직과 관련된 코드
│   ├── store/                # 상태관리를 위한 파일 
│   ├── App.tsx
│   └── main.tsx
├── package.json
└── tsconfig.json</code></pre><p>그 외에 미들웨어, hook 폴더 등 이후에 폴더가 추가되면 프로젝트 구조도를 업데이트 할 예정이다 .</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Email 뉴스레터 - 플랫폼별 이슈]]></title>
            <link>https://velog.io/@owl-recorder/Email-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@owl-recorder/Email-%EC%BD%94%EB%94%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Mon, 10 Mar 2025 14:14:20 GMT</pubDate>
            <description><![CDATA[<p><strong>다양한 이메일 플랫폼을 고려한 뉴스레터 제작 대응 노트</strong>  </p>
<blockquote>
<p>📅 Ver. 2024.09</p>
</blockquote>
<h2 id="1-a-태그">1. a 태그</h2>
<ul>
<li>이슈 플랫폼 : 네이버</li>
</ul>
<p><strong>[문제]</strong></p>
<ul>
<li>a 태그 style 속성에 height, line-height, width 속성이 적용되지 않는다. </li>
</ul>
<p><strong>[해결방법]</strong></p>
<ul>
<li>a 태그 내에 span 으로 한 번 감싸서 span 에 style 을 적용해야한다. </li>
</ul>
<br/>
<br/>
<br/>

<h2 id="2-background">2. Background</h2>
<ul>
<li>플랫폼 : Gmail, Outlook</li>
</ul>
<p><strong>[문제]</strong>    </p>
<ul>
<li>Gmail 에서 background-size 속성이 적용되지 않는다. </li>
<li>Outlook 에서 background 를 축약형으로 기입했을 때, 아웃룩 버전에 따라 적용되는 속성이 다르다. </li>
</ul>
<p><strong>[해결방법]</strong>    </p>
<ul>
<li>Gmail 과 Outlook 모두를 고려할 경우, 아래와 같이 축약형과 모든 속성 모두 기입한다.</li>
</ul>
<pre><code class="language-css">
background: url(&#39;이미지&#39;) repeat position;
background-image: url(&#39;이미지&#39;);
background-repeat: repeat; 
background-position: position;
</code></pre>
<br/>
<br/>
<br/>

<h2 id="3-img-태그">3. img 태그</h2>
<ul>
<li>이슈 플랫폼 : IOS Gmail 앱/Yahoo 앱, 안드로이드 앱, PC Yahoo 앱</li>
</ul>
<p><strong>[문제]</strong>    </p>
<ul>
<li>height 속성만 사용하면 사이즈 조절이 되지 않는다.</li>
</ul>
<p><strong>[해결방법]</strong>    </p>
<ul>
<li>이미지 크기를 조절할 때 width 를 사용해야 한다. </li>
</ul>
<br/>
<br/>
<br/>

<h2 id="4-모바일에서-자동-텍스트-조절">4. 모바일에서 자동 텍스트 조절</h2>
<p>모바일 클라이언트에서는 &quot;가독성&quot;이 떨어지는 경우 폰트 사이즈를 임의로 재정의하고 있다. 
텍스트는 글자가 커져도 줄넘김이 되기 때문에 문제가 되지 않는다고 판단하는 것 같다. </p>
<p>모바일에 최적화되지 않은 뉴스레터는 글자가 너무 커져서 레이아웃이 틀어지는 등의 문제가 될 수 있다. PC 와 동일하게 보이게 하려면 결론적으로 폰트 사이즈를 키웠을 때 줄넘김이 되지 않는 등 문제가 발생할 수 있다고 판단하면 글자 크기가 재정의되지 않는다. </p>
<br/>

<h3 id="방법-1">방법 1.</h3>
<ul>
<li>width가 이메일 사이즈와 동일하고 height가 1px인 투명 이미지를 넣으면 크기가 재정의되지 않는다.</li>
</ul>
<br/>

<h3 id="방법2">방법2.</h3>
<ul>
<li>white-space: nowrap; 을 적용하여 텍스트가 줄넘김 되지 않도록 변경한다.</li>
</ul>
<br/>

<h3 id="방법3">방법3.</h3>
<ul>
<li>이메일 사이즈와 동일한 길이로 공백이 없는 텍스트 (ex, &#39;------&#39;)를 문서 가장 아래에 적용해 둔다. </li>
</ul>
<br/>
<br/>

<h1 id="결론">결론</h1>
<ul>
<li>모든 플랫폼에 최적화시키기에는 시간이 오래걸리고 유지보수 할 때 문제가 생길 수 있음 </li>
<li>모바일 기기의 시스템 폰트 사이즈를 조정한다면 레이아웃에 문제가 생길 수 있음 </li>
<li>가급적 모바일에 최적화된 디자인으로 변경하는 것이 좋아보임 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Ionic] -webkit-box-orient 적용 안 되는 이슈]]></title>
            <link>https://velog.io/@owl-recorder/Ionic-webkit-box-orient-%EC%A0%81%EC%9A%A9-%EC%95%88-%EB%90%98%EB%8A%94-%EC%9D%B4%EC%8A%88</link>
            <guid>https://velog.io/@owl-recorder/Ionic-webkit-box-orient-%EC%A0%81%EC%9A%A9-%EC%95%88-%EB%90%98%EB%8A%94-%EC%9D%B4%EC%8A%88</guid>
            <pubDate>Thu, 09 May 2024 07:36:56 GMT</pubDate>
            <description><![CDATA[<p>여러 줄 말줄임하는 css를 아래와 같다.</p>
<pre><code>    display: -webkit-box;
    -webkit-line-clamp: 4;
    -webkit-box-orient: vertical;</code></pre><p>Ionic 프레임워크를 사용하는 프로젝트에서 
위와 같이 css를 기입하였음에도 아래 이미지와 같이 -webkit-box-orient&quot;가 미적용되는 이슈를 확인했다.</p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/12eb381c-0aa3-437e-8a60-a4189265bb0f/image.png" alt=""></p>
<h2 id="해결방안">해결방안</h2>
<ul>
<li>참고 : <a href="https://github.com/ionic-team/ionic-framework/issues/10723">https://github.com/ionic-team/ionic-framework/issues/10723</a></li>
</ul>
<ol>
<li><p>태그에 스타일 속성으로 css를 넣기 </p>
<pre><code>&lt;div style=&quot;-webkit-box-orient: vertical;&quot;&gt;</code></pre></li>
<li><p>autoprefixer 주석 달기</p>
</li>
</ol>
<pre><code>  /* autoprefixer: off */
  -webkit-box-orient: vertical;
  /* autoprefixer: on */</code></pre><p>두 가지 모두 이슈 해결되는 것으로 확인하였고, 
css 분리 목적으로 2번으로 적용하였다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 브라우저가 사용하는 Favicon 크기 ]]></title>
            <link>https://velog.io/@owl-recorder/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EA%B0%80-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-Favicon-%ED%81%AC%EA%B8%B0</link>
            <guid>https://velog.io/@owl-recorder/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EA%B0%80-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-Favicon-%ED%81%AC%EA%B8%B0</guid>
            <pubDate>Wed, 10 Jan 2024 23:33:36 GMT</pubDate>
            <description><![CDATA[<p>인터넷상의 정보가 많은데, 공식 문서 상 확인이 어려웠다.
어떤 정보가 확실한 지 알 수 없어서 테스트를 해봤다.</p>
<h2 id="규칙">규칙</h2>
<p>대부분의 블로그에서 이야기하는 내용은 아래와 같이 이야기하고 있다.</p>
<h3 id="권장-사이즈">권장 사이즈</h3>
<ul>
<li>크롬 : 48px의 배수</li>
<li>safari : 32px</li>
</ul>
<h3 id="사용-규칙">사용 규칙</h3>
<ol>
<li>권장 사이즈보다 큰 경우에는 권장 사이즈로 줄어서 들어간다.</li>
<li>여러가지 사이즈의 favicon 이 있을 경우 권장 사이즈를 사용한다</li>
<li>ico 파일을 가장 먼저 가져간다. </li>
</ol>
<h2 id="테스트">테스트</h2>
<p>16, 32, 48, 64 크기의 png 파일과 icon 파일을 사용했다.</p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/3f95b716-4417-47c5-8321-4bd718d13053/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/f3d173eb-033f-4df6-a376-5101d384a3ef/image.png" alt=""></p>
<h3 id="mac-os-크롬-">Mac OS 크롬 :</h3>
<h4 id="탭">탭</h4>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/0c348579-3dd8-474c-8073-ae81659df78c/image.png" alt=""></p>
<h4 id="북마크">북마크</h4>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/630c2377-62a1-4224-9f0f-f3db793baa79/image.png" alt=""></p>
<h3 id="window-os-크롬-">Window OS 크롬 :</h3>
<h4 id="탭-1">탭</h4>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/f32aa137-78ce-4390-962a-027263a53bb3/image.png" alt=""></p>
<h4 id="북마크-1">북마크</h4>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/c87d604f-27de-4291-9910-90e3b30683f6/image.png" alt=""></p>
<h3 id="safari">safari</h3>
<h4 id="탭-2">탭</h4>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/f9b68924-1e33-486a-893f-a82ddaf9e596/image.png" alt=""></p>
<h4 id="즐겨찾기">즐겨찾기</h4>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/a1abfd49-09fc-40fb-9d92-5c4b3edc5679/image.png" alt=""></p>
<h3 id="ie-엣지-">ie 엣지 :</h3>
<h4 id="탭-3">탭</h4>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/cccb79fb-8cdd-4e9e-938d-e9c447ad6a18/image.png" alt=""></p>
<h4 id="즐겨찾기-1">즐겨찾기</h4>
<p><img src="https://velog.velcdn.com/images/owl-recorder/post/73a4c5de-2c8b-46f5-9c64-86b5ba488f56/image.png" alt=""></p>
<h3 id="웨일">웨일</h3>
<p>ico 파일이 가장 먼저 보였고, .ico 가 없는 경우 32px png 파일이 노출되었다. </p>
<h2 id="결과">결과</h2>
<ol>
<li>권장 사이즈보다 큰 경우에는 권장 사이즈로 줄어서 들어간다.
 -&gt; Yes, 64px 이미지로도 잘 적용되었다. </li>
<li>여러가지 사이즈의 favicon 이 있을 경우 권장 사이즈를 사용한다
 -&gt; No, Chrome 에서는 64px을 사용한다고하나 실제로는 32px사용했다. </li>
<li>ico 파일을 가장 먼저 가져간다. 
 -&gt; No, png 파일을 가장 먼저 가져갔다. </li>
</ol>
<hr>
<p>가장 많이 사용하는 favicon 사이즈는 32px 이였다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[<input type="search">]]></title>
            <link>https://velog.io/@owl-recorder/input-typesearch</link>
            <guid>https://velog.io/@owl-recorder/input-typesearch</guid>
            <pubDate>Wed, 10 Jan 2024 02:43:47 GMT</pubDate>
            <description><![CDATA[<p>** iOS 17.2** 에서 이벤트 사용이 되지 않는다.</p>
<blockquote>
<p> <a href="https://stackoverflow.com/questions/77563528/search-event-stopped-firing-in-ios-17-2-beta-versions">https://stackoverflow.com/questions/77563528/search-event-stopped-firing-in-ios-17-2-beta-versions</a></p>
</blockquote>
<p>비표준인 것을 처음 알았다. 
mdn 한국 사이트에서는 비표준 표시가 없었는데, 외국 사이트에서는 비표준이라고 노출된다. 
외국 사이트로 검색해야겠다. </p>
]]></description>
        </item>
    </channel>
</rss>