<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>예방이의 개발일기</title>
    <link>https://dpdnjs402.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 30 Jul 2026 07:46:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>전예방</managingEditor>
    <image>
      <title>예방이의 개발일기</title>
      <url>https://tistory1.daumcdn.net/tistory/5388858/attach/676c7900ccfb451db0ad3ea1fa7968dc</url>
      <link>https://dpdnjs402.tistory.com</link>
    </image>
    <item>
      <title>프론트엔드에서 자유롭게 사용할 수 있는 오픈 API</title>
      <link>https://dpdnjs402.tistory.com/134</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;오픈 &lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;개인 &lt;/span&gt;&lt;span&gt;프로젝트나 &lt;/span&gt;&lt;span&gt;토이 &lt;/span&gt;&lt;span&gt;프로젝트, &lt;/span&gt;&lt;span&gt;테스트용으로 매우 유용하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;영화 / &lt;/span&gt;&lt;span&gt;콘텐츠 &lt;/span&gt;&lt;span&gt;관련 &lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.2791%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 57.3256%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 26.2791%;&quot;&gt;인증여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.2791%;&quot;&gt;&lt;a href=&quot;https://yts.mx/api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;YTS&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.3256%;&quot;&gt;토렌트 기반 영화 정보 API&lt;/td&gt;
&lt;td style=&quot;width: 26.2791%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.2791%;&quot;&gt;&lt;a href=&quot;https://www.omdbapi.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OMDb API&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.3256%;&quot;&gt;영화, 시리즈, 에피소드 정보 (IMDb 기반)&lt;/td&gt;
&lt;td style=&quot;width: 26.2791%;&quot;&gt;  무료 키 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.2791%;&quot;&gt;&lt;a href=&quot;https://developer.themoviedb.org/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TMDB&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.3256%;&quot;&gt;포스터, 평점, 줄거리 포함 영화 정보 풍부&lt;/td&gt;
&lt;td style=&quot;width: 26.2791%;&quot;&gt;  API Key 필요 (무료 가입)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;책 / &lt;/span&gt;&lt;span&gt;뉴스 / &lt;/span&gt;&lt;span&gt;지식 &lt;/span&gt;&lt;span&gt;정보&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5117%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 64.3023%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt;인증여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5117%;&quot;&gt;&lt;a href=&quot;https://openlibrary.org/developers/api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Open Library&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.3023%;&quot;&gt;책 검색, 커버, 저자 등 정보&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5117%;&quot;&gt;&lt;a href=&quot;https://newsapi.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;NewsAPI&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.3023%;&quot;&gt;최신 뉴스 헤드라인, 검색 등&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5117%;&quot;&gt;&lt;a href=&quot;https://www.mediawiki.org/wiki/API:Main_page&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Wikipedia API&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.3023%;&quot;&gt;위키백과 검색 및 내용 파싱&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;이미지 / &lt;/span&gt;&lt;span&gt;사진&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 64.8837%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;인증여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%;&quot;&gt;&lt;a href=&quot;https://unsplash.com/developers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Unsplash API&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.8837%;&quot;&gt;고퀄 사진 검색 및 다운로드 링크&lt;/td&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.3256%;&quot;&gt;&lt;a href=&quot;https://picsum.photos/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Lorem Picsum&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 64.8837%;&quot;&gt;랜덤 이미지, placeholder 용도&lt;/td&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;위치 / &lt;/span&gt;&lt;span&gt;날씨 / &lt;/span&gt;&lt;span&gt;지도&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 19px;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%; height: 19px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 28.1395%; height: 19px;&quot;&gt;인증여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 19px;&quot;&gt;&lt;a href=&quot;https://openweathermap.org/api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OpenWeatherMap&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%; height: 19px;&quot;&gt;날씨 정보, 위치 기반 날씨 등&lt;/td&gt;
&lt;td style=&quot;width: 28.1395%; height: 19px;&quot;&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 19px;&quot;&gt;&lt;a href=&quot;https://ipinfo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ipinfo.io&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%; height: 19px;&quot;&gt;사용자의 IP 기반 위치 정보&lt;/td&gt;
&lt;td style=&quot;width: 28.1395%; height: 19px;&quot;&gt;  (무료 플랜 있음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 19px;&quot;&gt;&lt;a href=&quot;https://www.geonames.org/export/web-services.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GeoNames&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50.3488%; height: 19px;&quot;&gt;위치 기반 정보, 나라/도시 검색&lt;/td&gt;
&lt;td style=&quot;width: 28.1395%; height: 19px;&quot;&gt;  (무료 회원가입)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;재미있는 / &lt;/span&gt;&lt;span&gt;실험용 &lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 60.2326%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt;인증여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%;&quot;&gt;&lt;a href=&quot;https://v2.jokeapi.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;JokeAPI&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.2326%;&quot;&gt;프로그래밍 유머, 일반 유머 등&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%;&quot;&gt;&lt;a href=&quot;https://api.adviceslip.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Advice Slip&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.2326%;&quot;&gt;인생 조언 API&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%;&quot;&gt;&lt;a href=&quot;https://yesno.wtf/#api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Yes/No API&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.2326%;&quot;&gt;랜덤 yes/no 대답 + gif&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%;&quot;&gt;&lt;a href=&quot;https://thecatapi.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;The Cat API&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.2326%;&quot;&gt;귀여운 고양이 사진 랜덤 제공&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%;&quot;&gt;&lt;a href=&quot;https://dog.ceo/dog-api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Dog API&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 60.2326%;&quot;&gt;개 사진 API (랜덤, 품종별 등)&lt;/td&gt;
&lt;td style=&quot;width: 19.186%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;개발자용 / &lt;/span&gt;&lt;span&gt;도구 &lt;/span&gt;&lt;span&gt;API&lt;/span&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 61.2791%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 20.9302%;&quot;&gt;인증여부&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;&lt;a href=&quot;https://docs.github.com/en/rest&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub API&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.2791%;&quot;&gt;GitHub 레포, 유저 정보, 활동 등&lt;/td&gt;
&lt;td style=&quot;width: 20.9302%;&quot;&gt;  (optional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;&lt;a href=&quot;https://goqr.me/api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;QR Code API&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.2791%;&quot;&gt;텍스트 -&amp;gt; QR 코드 이미지&lt;/td&gt;
&lt;td style=&quot;width: 20.9302%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;jsonplaceholder&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.2791%;&quot;&gt;테스트용 더미 데이터 (posts, todos 등)&lt;/td&gt;
&lt;td style=&quot;width: 20.9302%;&quot;&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  그외&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/public-apis/public-apis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://&lt;/span&gt;&lt;span&gt;github.&lt;/span&gt;&lt;span&gt;com/&lt;/span&gt;&lt;span&gt;public-&lt;/span&gt;&lt;span&gt;apis/&lt;/span&gt;&lt;span&gt;public-&lt;/span&gt;&lt;span&gt;apis&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Frontend/전체</category>
      <category>토이프로젝트 api</category>
      <category>프론트엔드 api</category>
      <category>프론트엔드 토이프로젝트</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/134</guid>
      <comments>https://dpdnjs402.tistory.com/134#entry134comment</comments>
      <pubDate>Tue, 13 May 2025 20:20:31 +0900</pubDate>
    </item>
    <item>
      <title>[웹접근성] 명료성에 대해서 (명도차, 무늬 활용)</title>
      <link>https://dpdnjs402.tistory.com/133</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;색맹, 색약, 저시력 등의 시각장애가 있는 사용자를 위한 웹 접근성 향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 색에 의한 정보 표현 방지&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wizlW/btsNTanHBCZ/579hjYmhZyrpvvq8o6twqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wizlW/btsNTanHBCZ/579hjYmhZyrpvvq8o6twqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wizlW/btsNTanHBCZ/579hjYmhZyrpvvq8o6twqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwizlW%2FbtsNTanHBCZ%2F579hjYmhZyrpvvq8o6twqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1696&quot; height=&quot;842&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색맹인 사람들은 어떤게 Dataset1 인지 어떤게 Dataset2 인지 모를 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q892K/btsNTl3YGCm/4jO6M2Z1dvi4BKNNHvut2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q892K/btsNTl3YGCm/4jO6M2Z1dvi4BKNNHvut2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q892K/btsNTl3YGCm/4jO6M2Z1dvi4BKNNHvut2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq892K%2FbtsNTl3YGCm%2F4jO6M2Z1dvi4BKNNHvut2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;467&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무늬를 이용해서 정보를 제공할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  Chart.js 에 패턴 적용&lt;/h3&gt;
&lt;figure id=&quot;og_1747056272162&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Colors | Chart.js&quot; data-og-description=&quot;Colors Charts support three color options: for geometric elements, you can change background and border colors; for textual elements, you can change the font color. Also, you can change the whole canvas background. Default colors If a color is not specifie&quot; data-og-host=&quot;www.chartjs.org&quot; data-og-source-url=&quot;https://www.chartjs.org/docs/latest/general/colors.html#patterns-and-gradients&quot; data-og-url=&quot;https://www.chartjs.org/docs/latest/general/colors.html#patterns-and-gradients&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.chartjs.org/docs/latest/general/colors.html#patterns-and-gradients&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.chartjs.org/docs/latest/general/colors.html#patterns-and-gradients&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Colors | Chart.js&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Colors Charts support three color options: for geometric elements, you can change background and border colors; for textual elements, you can change the font color. Also, you can change the whole canvas background. Default colors If a color is not specifie&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.chartjs.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmK2zM/btsNS33wKuQ/li2JprpE04xzkY72XLaitk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmK2zM/btsNS33wKuQ/li2JprpE04xzkY72XLaitk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmK2zM/btsNS33wKuQ/li2JprpE04xzkY72XLaitk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmK2zM%2FbtsNS33wKuQ%2Fli2JprpE04xzkY72XLaitk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;258&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1747056277774&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ashiguruma/patternomaly: Easily generate patterns for use in data graphics&quot; data-og-description=&quot;Easily generate patterns for use in data graphics. Contribute to ashiguruma/patternomaly development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ashiguruma/patternomaly&quot; data-og-url=&quot;https://github.com/ashiguruma/patternomaly&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bF1Kgt/hyYTiGB4vk/Gmv8KHXJIwLgOSBY5rTGx0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/burQQr/hyYPmKExCl/WwVgpjU2iFhyk4X6yLLs4k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ashiguruma/patternomaly&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ashiguruma/patternomaly&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bF1Kgt/hyYTiGB4vk/Gmv8KHXJIwLgOSBY5rTGx0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/burQQr/hyYPmKExCl/WwVgpjU2iFhyk4X6yLLs4k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - ashiguruma/patternomaly: Easily generate patterns for use in data graphics&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Easily generate patterns for use in data graphics. Contribute to ashiguruma/patternomaly development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 명도대비 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4.5 : 1&lt;/b&gt; &lt;/span&gt;이상&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  명도차이 계산 TOOL&lt;/h3&gt;
&lt;figure id=&quot;og_1747055981159&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Colour Contrast Analyser (CCA) - TPGi&quot; data-og-description=&quot;TPGi's ADA Color Contrast Checker helps determine the accessibility of the contrast ratio of two colors for WCAG AA and AAA.&quot; data-og-host=&quot;www.tpgi.com&quot; data-og-source-url=&quot;https://www.tpgi.com/color-contrast-checker/&quot; data-og-url=&quot;https://www.tpgi.com/color-contrast-checker/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kBtLR/hyYRrSh5JC/dnItjSd5j6orHigydv7tk0/img.png?width=1226&amp;amp;height=708&amp;amp;face=0_0_1226_708&quot;&gt;&lt;a href=&quot;https://www.tpgi.com/color-contrast-checker/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.tpgi.com/color-contrast-checker/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kBtLR/hyYRrSh5JC/dnItjSd5j6orHigydv7tk0/img.png?width=1226&amp;amp;height=708&amp;amp;face=0_0_1226_708');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Colour Contrast Analyser (CCA) - TPGi&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;TPGi's ADA Color Contrast Checker helps determine the accessibility of the contrast ratio of two colors for WCAG AA and AAA.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.tpgi.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;1286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ8bEJ/btsNUEOKTzX/OWkeeGsmG18xpjDnNPOQ2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ8bEJ/btsNUEOKTzX/OWkeeGsmG18xpjDnNPOQ2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ8bEJ/btsNUEOKTzX/OWkeeGsmG18xpjDnNPOQ2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ8bEJ%2FbtsNUEOKTzX%2FOWkeeGsmG18xpjDnNPOQ2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;751&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;1286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트와 배경 간의 명도 대비는 4.5:1 이상이여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지로 표현된 텍스트 콘텐츠도 포함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❌ 4.5:1 이상 기준 적용 예외&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비활성 콘텐츠 (disabled 버튼 같은 경우)&lt;/li&gt;
&lt;li&gt;장식 목적의 콘텐츠 (사용자에게 의미 있는 정보를 제공하지 않는 경우)&lt;/li&gt;
&lt;/ul&gt;
&lt;div id=&quot;gtx-trans&quot; style=&quot;position: absolute; left: 250px; top: 1171.16px;&quot;&gt;
&lt;div class=&quot;gtx-trans-icon&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Frontend/웹접근성</category>
      <category>4.5:1</category>
      <category>chart pattern</category>
      <category>Chart.js</category>
      <category>명도차</category>
      <category>명료성</category>
      <category>무늬</category>
      <category>웹접근성</category>
      <category>웹접근성 명료성</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/133</guid>
      <comments>https://dpdnjs402.tistory.com/133#entry133comment</comments>
      <pubDate>Mon, 12 May 2025 22:26:07 +0900</pubDate>
    </item>
    <item>
      <title>[웹접근성] 목록 나열 태그 (ul, ol, dl)</title>
      <link>https://dpdnjs402.tistory.com/132</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;목록나열 태그에 대해서 알아보자&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ul (Unordered List)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;u&gt;&lt;b&gt;순서가 지정되지 않은&lt;/b&gt;&lt;/u&gt;&lt;/span&gt; 목록 나열할 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1747049812664&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ul aria-label=&quot;프론트엔드 기술 목록&quot;&amp;gt;
  &amp;lt;li&amp;gt;
  	React
    &amp;lt;ul&amp;gt;
    	&amp;lt;li&amp;gt;CRA&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;VITE&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Next.js&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;TypeScript&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 예시&lt;/h3&gt;
&lt;div id=&quot;code_1747049824858&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;ul aria-label=&amp;quot;프론트엔드 기술 목록&amp;quot;&amp;gt;
  &amp;lt;li&amp;gt;
  	React
    &amp;lt;ul&amp;gt;
    	&amp;lt;li&amp;gt;CRA&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;VITE&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Next.js&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;TypeScript&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; aria-label=&quot;프론트엔드 기술 목록&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CRA&lt;/li&gt;
&lt;li&gt;VITE&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅ 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ul 바로 하위 자식 요소는 li 태그만 사용가능&lt;/li&gt;
&lt;li&gt;기본 글머리 기호는 disc (list-style-type: disc)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ol (Ordered List)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;순서가 지정된&lt;/b&gt;&lt;/span&gt;&lt;/u&gt; 목록 나열할 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1747050056103&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ol aria-label=&quot;프론트엔드 기술 목록&quot;&amp;gt;
  &amp;lt;li&amp;gt;
  	React
    &amp;lt;ul&amp;gt;
    	&amp;lt;li&amp;gt;CRA&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;VITE&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Next.js&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;TypeScript&amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅ 예시&lt;/h3&gt;
&lt;div id=&quot;code_1747050068278&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;ol aria-label=&amp;quot;프론트엔드 기술 목록&amp;quot;&amp;gt;
  &amp;lt;li&amp;gt;
  	React
    &amp;lt;ol type=&amp;quot;i&amp;quot;&amp;gt;
    	&amp;lt;li&amp;gt;CRA&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;VITE&amp;lt;/li&amp;gt;
    &amp;lt;/ol&amp;gt;
  &amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Next.js&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;TypeScript&amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;&quot;&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; aria-label=&quot;프론트엔드 기술 목록&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;React
&lt;ol style=&quot;list-style-type: decimal;&quot; type=&quot;i&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;CRA&lt;/li&gt;
&lt;li&gt;VITE&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅ 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ol 바로 하위 자식 요소는 li 태그만 사용가능&lt;/li&gt;
&lt;li&gt;기본 글머리 기호는 decimal 숫자 (list-style-type: decimal)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1747050294303&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 숫자 (기본값) */
&amp;lt;ol type=&quot;1&quot;&amp;gt;

/* 소문자 */
&amp;lt;ol type=&quot;a&quot;&amp;gt;

/* 대문자 */
&amp;lt;ol type=&quot;A&quot;&amp;gt;

/* 로마숫자(소문자) */
&amp;lt;ol type=&quot;i&quot;&amp;gt;

/* 로마숫자(대문자) */
&amp;lt;ol type=&quot;I&quot;&amp;gt;

/* 3부터 시작 */
&amp;lt;ol start=&quot;3&quot;&amp;gt;

/* 역순 */
&amp;lt;ol reversed&amp;gt;

/* start부터 역순 */
&amp;lt;ol reversed start=&quot;5&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;dl (Description List)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용어를 정의하거나 key-value 형태의 항목 나열할 때 사용&lt;/p&gt;
&lt;pre id=&quot;code_1747050492035&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dl&amp;gt;
    &amp;lt;dt&amp;gt;감자&amp;lt;dt&amp;gt;
    &amp;lt;dd&amp;gt;10,000원&amp;lt;dd&amp;gt;
    &amp;lt;dt&amp;gt;당근&amp;lt;dt&amp;gt;
    &amp;lt;dd&amp;gt;4,000원&amp;lt;dd&amp;gt;
&amp;lt;/dl&amp;gt;

&amp;lt;dl&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;dt&amp;gt;감자&amp;lt;dt&amp;gt;
        &amp;lt;dd&amp;gt;10,000원&amp;lt;dd&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;dt&amp;gt;당근&amp;lt;dt&amp;gt;
        &amp;lt;dd&amp;gt;4,000원&amp;lt;dd&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/dl&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✅ 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dl 자식요소로는 dt, dd 태그만 가능&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;(key : dt / value : dd)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;dt 태그 없이 dd만 사용 ❌, dt 태그를 설명하기 위한 여러 dd 사용가능&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;연관된 dt, dd 그룹을 묶는 용도의 &amp;lt;div&amp;gt;태그는 허용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Frontend/웹접근성</category>
      <category>DL</category>
      <category>HTML tag</category>
      <category>OL</category>
      <category>ul</category>
      <category>목록태그</category>
      <category>웹접근성</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/132</guid>
      <comments>https://dpdnjs402.tistory.com/132#entry132comment</comments>
      <pubDate>Mon, 12 May 2025 20:37:11 +0900</pubDate>
    </item>
    <item>
      <title>[NVM] NVM에 대해서, 기본 명령어</title>
      <link>https://dpdnjs402.tistory.com/131</link>
      <description>&lt;h2 data-end=&quot;55&quot; data-start=&quot;43&quot; data-ke-size=&quot;size26&quot;&gt;  nvm이란?&lt;/h2&gt;
&lt;p data-end=&quot;133&quot; data-start=&quot;57&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;nvm&lt;/b&gt;은 &lt;b&gt;Node Version Manager, &lt;/b&gt;&lt;b&gt;Node.js의 버전을 관리하는 도구&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;133&quot; data-start=&quot;57&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;152&quot; data-start=&quot;140&quot; data-ke-size=&quot;size26&quot;&gt;  왜 필요할까?&lt;/h2&gt;
&lt;p data-end=&quot;260&quot; data-start=&quot;154&quot; data-ke-size=&quot;size16&quot;&gt;Node.js는 버전마다 지원하는 기능이나 문법이 다를 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;260&quot; data-start=&quot;154&quot; data-ke-size=&quot;size16&quot;&gt;근데 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Node.js를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;한 버전만 설치&lt;/b&gt;할 수 있어서 생기는 문제점을 NVM이 해결해준다.&lt;/p&gt;
&lt;p data-end=&quot;260&quot; data-start=&quot;154&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;356&quot; data-start=&quot;342&quot; data-ke-size=&quot;size26&quot;&gt;  nvm을 쓰면?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;464&quot; data-start=&quot;358&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;400&quot; data-start=&quot;358&quot;&gt;여러 Node.js 버전을 설치해 놓고, 필요할 때마다 전환할 수 있다.&lt;/li&gt;
&lt;li data-end=&quot;436&quot; data-start=&quot;401&quot;&gt;프로젝트마다 다른 Node.js 버전으로 맞춰 쓸 수 있다.&lt;/li&gt;
&lt;li data-end=&quot;464&quot; data-start=&quot;437&quot;&gt;기본(default) 버전도 지정할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;817&quot; data-start=&quot;797&quot; data-ke-size=&quot;size26&quot;&gt;❗주의사항 (특히 맥북에서는!)&lt;/h2&gt;
&lt;p data-end=&quot;869&quot; data-start=&quot;819&quot; data-ke-size=&quot;size16&quot;&gt;nvm은 그냥 설치해도 안 작동할 수 있어서 아래처럼 .zshrc에 꼭 추가해줘야된다.&lt;/p&gt;
&lt;pre id=&quot;code_1744801290637&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export NVM_DIR=&quot;$HOME/.nvm&quot;
[ -s &quot;$NVM_DIR/nvm.sh&quot; ] &amp;amp;&amp;amp; \. &quot;$NVM_DIR/nvm.sh&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  설치 확인&lt;/h2&gt;
&lt;pre id=&quot;code_1744801334778&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node -v     # 현재 적용된 Node.js 버전 확인
nvm ls      # 설치된 모든 버전 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  명령어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Node.js 버전을 기본값(default)으로 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1744801378489&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nvm alias default &amp;lt;버전&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정하면, &lt;b&gt;터미널을 새로 열었을 때 자동으로 해당 버전으로 설정&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;현재 설치된 Node.js 버전 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1744801432042&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nvm ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;1020&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6EOtJ/btsNlcTzb3s/v9MbSGlXnG93HHsnN5Rick/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6EOtJ/btsNlcTzb3s/v9MbSGlXnG93HHsnN5Rick/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6EOtJ/btsNlcTzb3s/v9MbSGlXnG93HHsnN5Rick/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6EOtJ%2FbtsNlcTzb3s%2Fv9MbSGlXnG93HHsnN5Rick%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;589&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;1020&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 가능한 버전 목록 보기&lt;/h3&gt;
&lt;pre id=&quot;code_1744801455458&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nvm ls-remote&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특정 버전 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1744801469917&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nvm install 18.17.1&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 버전 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1744801486608&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nvm alias&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;추가로, .nvmrc 파일을 프로젝트 루트에 만들어서 프로젝트마다 버전을 명시&lt;/h3&gt;
&lt;pre id=&quot;code_1744801531669&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;18.17.1&quot; &amp;gt; .nvmrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 프로젝트 들어갔을 때는:&lt;/p&gt;
&lt;pre id=&quot;code_1744801545787&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nvm use&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Frontend/전체</category>
      <category>node version manager</category>
      <category>node.js</category>
      <category>NPM</category>
      <category>NVM</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/131</guid>
      <comments>https://dpdnjs402.tistory.com/131#entry131comment</comments>
      <pubDate>Wed, 16 Apr 2025 20:06:17 +0900</pubDate>
    </item>
    <item>
      <title>[암호화] C# PasswordDeriveBytes 를 JS 코드로 변환하기</title>
      <link>https://dpdnjs402.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌다 보니 프론트엔드에서도 백엔드와 동일한 방식으로 암호화를 적용해야 하는 상황이 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드가 C#이라서 C# 코드를 JS 코드로 변환하다가 PasswordDeriveBytes 클래스 때문에 진짜 애먹어서 글 남긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 제일 중요한 참고 사이트!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(chatgpt보다 오히려 참고사이트에서 힌트를 많이 얻었다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜인지 몰라도 암호화 언어 바꿔서 작성해달라고 하면 chatgpt가 항상 틀리는거같다...&lt;/p&gt;
&lt;figure id=&quot;og_1744713511332&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Using node.js to decrypt data encrypted using c#&quot; data-og-description=&quot;I'm facing a issue now which need you guys help. I use c# to do some encryption. Then need to use node.js to decry-pt it. But I just found that I can't do it correctly base on my c# encryption alg...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/16270740/using-node-js-to-decrypt-data-encrypted-using-c-sharp&quot; data-og-url=&quot;https://stackoverflow.com/questions/16270740/using-node-js-to-decrypt-data-encrypted-using-c-sharp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qfWE4/hyYH8Ksoqg/cCVZvcb0hsDWEy2sZtQvK0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/16270740/using-node-js-to-decrypt-data-encrypted-using-c-sharp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/16270740/using-node-js-to-decrypt-data-encrypted-using-c-sharp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qfWE4/hyYH8Ksoqg/cCVZvcb0hsDWEy2sZtQvK0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Using node.js to decrypt data encrypted using c#&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I'm facing a issue now which need you guys help. I use c# to do some encryption. Then need to use node.js to decry-pt it. But I just found that I can't do it correctly base on my c# encryption alg...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1744713517582&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;PasswordDeriveBytes of C# to Java (2)&quot; data-og-description=&quot;PasswordDeriveBytes from C# to Java (1) 에서 계속... 2016. 04.18 업데이트) 아래 소스를 정리한 GitHub 저장소를 만들었습니다.C#에 있는 PasswordDeriveBytes 클래스를 Java 로 구현해야 했던 나는 해당 클래스에 버&quot; data-og-host=&quot;gilchris.tistory.com&quot; data-og-source-url=&quot;https://gilchris.tistory.com/3&quot; data-og-url=&quot;https://gilchris.tistory.com/3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dntsEe/hyYCmjSdoI/j7QFUv2jc7QUVNnKXuwgy1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Shokj/hyYClE2wPb/cSVJQ1nfuCyLtZvMSEDBkK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://gilchris.tistory.com/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gilchris.tistory.com/3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dntsEe/hyYCmjSdoI/j7QFUv2jc7QUVNnKXuwgy1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Shokj/hyYClE2wPb/cSVJQ1nfuCyLtZvMSEDBkK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;PasswordDeriveBytes of C# to Java (2)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;PasswordDeriveBytes from C# to Java (1) 에서 계속... 2016. 04.18 업데이트) 아래 소스를 정리한 GitHub 저장소를 만들었습니다.C#에 있는 PasswordDeriveBytes 클래스를 Java 로 구현해야 했던 나는 해당 클래스에 버&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gilchris.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stackoverflow에서 PasswordDeriveBytes 클래스를 JS로 바꾸는 코드를 얻었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;티스토리 블로그에서는 GetBytes 의 원리에 대해서 알았다. GetBytes ... 진짜 골 때린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744713891003&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// password = &quot;password&quot;

byte[] salt = Encoding.ASCII.GetBytes(Convert.ToString(password.Length));
Console.WriteLine(&quot;Salt (ASCII of length): &quot; + BitConverter.ToString(salt));

PasswordDeriveBytes secretKey = new PasswordDeriveBytes(password, salt);

byte[] keyBytes = secretKey.GetBytes(32);
byte[] ivBytes = secretKey.GetBytes(16);

Console.WriteLine(&quot;Key (32 bytes): &quot; + BitConverter.ToString(keyBytes));
Console.WriteLine(&quot;IV (16 bytes): &quot; + BitConverter.ToString(ivBytes));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 C# 코드를 아래와 같이 JS로 바꿨다.&lt;/p&gt;
&lt;pre id=&quot;code_1744713747471&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import CryptoJS from &quot;crypto-js&quot;;
import crypto from &quot;crypto&quot;;

export function deriveBytesFromPassword(
  password,
  salt,
  iterations,
  hashAlgorithm,
  keyLength,
) {
  if (keyLength &amp;lt; 1) throw new Error(&quot;keyLength must be greater than 1&quot;);
  if (iterations &amp;lt; 2) throw new Error(&quot;iterations must be greater than 2&quot;);

  console.log(&quot;  password:&quot;, password);
  console.log(&quot;  salt (hex):&quot;, salt.toString(&quot;hex&quot;));
  console.log(&quot;  iterations:&quot;, iterations);
  console.log(&quot;  hashAlgorithm:&quot;, hashAlgorithm);

  const passwordWithSalt = Buffer.concat([
    Buffer.from(password, &quot;utf-8&quot;),
    salt,
  ]);
  console.log(&quot;  password + salt (hex):&quot;, passwordWithSalt.toString(&quot;hex&quot;));

  const hashMissingLastIteration = hashKeyNTimes(
    passwordWithSalt,
    iterations - 1,
    hashAlgorithm,
  );
  console.log(
    &quot;  hashMissingLastIteration:&quot;,
    hashMissingLastIteration.toString(&quot;hex&quot;),
  );

  let result = hashKeyNTimes(hashMissingLastIteration, 1, hashAlgorithm);
  console.log(&quot;  Final 1x Hash:&quot;, result.toString(&quot;hex&quot;));

  result = extendResultIfNeeded(
    result,
    keyLength,
    hashMissingLastIteration,
    hashAlgorithm,
  );
  console.log(
    &quot;✅ Extended Key (before slice):&quot;,
    keyLength,
    result.toString(&quot;hex&quot;),
  );

  return result.slice(0, keyLength);
}

function hashKeyNTimes(key, times, hashAlgorithm) {
  let result = key;
  for (let i = 0; i &amp;lt; times; i++) {
    result = crypto.createHash(hashAlgorithm).update(result).digest();
    console.log(`     hash round ${i + 1}:`, result.toString(&quot;hex&quot;));
  }
  return result;
}

function extendResultIfNeeded(
  result,
  keyLength,
  hashMissingLastIteration,
  hashAlgorithm,
) {
  let counter = 1;
  while (result.length &amp;lt; keyLength) {
    const extension = calculateSpecialMicrosoftHash(
      hashMissingLastIteration,
      counter,
      hashAlgorithm,
    );
    console.log(
      `➕ Extending with counter=${counter}:`,
      extension.toString(&quot;hex&quot;),
    );
    result = Buffer.concat([result, extension]);
    counter++;
  }
  return result;
}

function calculateSpecialMicrosoftHash(
  hashMissingLastIteration,
  counter,
  hashAlgorithm,
) {
  const prefixCalculatedByCounter = Buffer.from(counter.toString(), &quot;utf-8&quot;);
  const inputForAdditionalHashIteration = Buffer.concat([
    prefixCalculatedByCounter,
    hashMissingLastIteration,
  ]);
  console.log(
    `     Additional input for counter=${counter}:`,
    inputForAdditionalHashIteration.toString(&quot;hex&quot;),
  );
  return crypto
    .createHash(hashAlgorithm)
    .update(inputForAdditionalHashIteration)
    .digest();
}

const password = &quot;password&quot;;
const salt = Buffer.from(password.length.toString(), &quot;ascii&quot;); // C#의 Encoding.ASCII.GetBytes(Convert.ToString(password.Length)); 동일
const iterations = 100;
const hashAlgorithm = &quot;sha1&quot;;
const keyLength = 100;

const derived = deriveBytesFromPassword(
  password,
  salt,
  iterations,
  hashAlgorithm,
  keyLength,
);

// 2) 앞쪽 16바이트 =&amp;gt; IV
const keyBytes = derived.slice(0, 32);

// 3) 그 다음 32바이트 =&amp;gt; Key
const ivBytes = derived.slice(8, 16);
const ivBytes2 = derived.slice(40, 48);

const ivBytes3 = Buffer.concat([
  ivBytes, // 8바이트
  ivBytes2, // 8바이트
]);

function encryptAesCbc(plainText, keyBytes, ivBytes) {
  const keyWordArray = CryptoJS.enc.Hex.parse(keyBytes.toString(&quot;hex&quot;));
  const ivWordArray = CryptoJS.enc.Hex.parse(ivBytes.toString(&quot;hex&quot;));
  const plaintextUtf16LE = CryptoJS.enc.Utf16LE.parse(plainText); // C#에서 `Encoding.Unicode`는 UTF-16LE

  const encrypted = CryptoJS.AES.encrypt(plaintextUtf16LE, keyWordArray, {
    iv: ivWordArray,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  });

  return encrypted.ciphertext.toString(CryptoJS.enc.Base64); // C#의 Convert.ToBase64String 대응
}

const encryptedBase64 = encryptAesCbc(&quot;1111&quot;, keyBytes, ivBytes3);
console.log(&quot;  Encrypted Base64:&quot;, encryptedBase64);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 JS 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PasswordDeriveBytes 는 GetBytes를 16 바이트 먼저 호출하냐, 32 바이트 먼저 호출하냐에 따라서 값이 바뀐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도대체 무슨 원리로 그러는거지...? 뭔가 도출된 값을 보면 연관성은 무조건 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저 위에 블로거 분이 정리해 놓으신거 보니까&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;644&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt; 첫 번째 GetBytes의&lt;br /&gt;전달인자 (A)&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.9302%;&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;두 번째 GetBytes의 결과값&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;두 번째 GetBytes의 전달인자 (B)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;&lt;span&gt;1 ~&amp;nbsp; 9&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.9302%;&quot;&gt;&lt;span&gt;&amp;nbsp;Runtime Error&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;&lt;span&gt;&amp;nbsp;10 ~ 19&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.9302%;&quot;&gt;&lt;span&gt;전체 key stream에서 (20 - A)&amp;nbsp; 만큼 건너뛰고 (20 - A) 만큼을 읽어서 결과값의 앞부분으로 이용&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;amp; 20바이트 부터 &lt;b&gt;20바이트 + (B - (20 - A))&lt;/b&gt; 까지의 결과값을 뒷부분으로 이용&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.9535%;&quot;&gt;&lt;span&gt;&amp;nbsp;21 ~ 39&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.9302%;&quot;&gt;&lt;span&gt;전체 key stream에서 (40 - A)&amp;nbsp; 만큼 건너뛰고 (40 - A) 만큼을 읽어서 결과값의 앞부분으로 이용&lt;br /&gt;&amp;nbsp;&amp;amp; 40바이트 부터 &lt;b&gt;40바이트 + (B - (40 - A))&lt;/b&gt; 까지의 결과값을 뒷부분으로 이용&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.9535%;&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;40 ~&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.9302%;&quot; rowspan=&quot;1&quot;&gt;&lt;span&gt;전체 key stream에서 첫 번째 GetBytes를 읽은 뒷부분부터 그대로 읽어서 돌려줌&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744714340597&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;byte[] keyBytes = secretKey.GetBytes(32);
byte[] ivBytes = secretKey.GetBytes(16);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;32를 먼저 호출하면 결과값에 0 ~ 32까지가 keyBytes가 되는거고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음 16을 호출하면 A가 21 ~ 39에 속하니까&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ivBytes는 8부터 8만큼이니까 8 ~ 16을 앞부분으로 사용하고, 40 ~ 48을 뒷부분으로 사용하는거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16을 먼저 호출하면 결과값에 0 ~ 16까지가 keyBytes가 되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ivBytes는 B가 32니까 10~19 구간을 보면 4 ~ 8 까지가 앞부분, 20 ~ 48까지가 뒷부분이 되는거다.&lt;/p&gt;</description>
      <category>Frontend/JavaScript &amp;amp; Jquery</category>
      <category>crypto-js</category>
      <category>encrypted</category>
      <category>getBytes</category>
      <category>passwordderivebytes</category>
      <category>암호화</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/130</guid>
      <comments>https://dpdnjs402.tistory.com/130#entry130comment</comments>
      <pubDate>Tue, 15 Apr 2025 20:01:27 +0900</pubDate>
    </item>
    <item>
      <title>Vite기반 React 프로젝트에서 emotion 설정하기</title>
      <link>https://dpdnjs402.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;vite 기반 react + ts 프로젝트에서 emotion.js 설정하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  emotion 관련 라이브러리 설치&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rGTHR/btsMWG2iF8N/gmHn9lXkB0KuIqmQ0h87SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rGTHR/btsMWG2iF8N/gmHn9lXkB0KuIqmQ0h87SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rGTHR/btsMWG2iF8N/gmHn9lXkB0KuIqmQ0h87SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrGTHR%2FbtsMWG2iF8N%2FgmHn9lXkB0KuIqmQ0h87SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;669&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742988800489&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add @emotion/react @emotion/styled 
yarn add --dev @emotion/babel-plugin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  vite.config.js 수정&lt;/h2&gt;
&lt;pre id=&quot;code_1742988824691&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { defineConfig } from &quot;vite&quot;;
import react from &quot;@vitejs/plugin-react&quot;;
import tsconfigPaths from &quot;vite-tsconfig-paths&quot;;

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    react({
      jsxImportSource: &quot;@emotion/react&quot;,
      babel: {
        plugins: [&quot;@emotion/babel-plugin&quot;],
      },
    }),
    tsconfigPaths(),
  ],
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  tsconfig.app.json 수정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccxvvj/btsMWDLlYsG/EEki410LaREIUf7ZQnwKm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccxvvj/btsMWDLlYsG/EEki410LaREIUf7ZQnwKm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccxvvj/btsMWDLlYsG/EEki410LaREIUf7ZQnwKm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccxvvj%2FbtsMWDLlYsG%2FEEki410LaREIUf7ZQnwKm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;651&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1742988866265&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;jsxImportSource&quot;: &quot;@emotion/react&quot;,&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;완성샷&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;1842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBjiUr/btsMX57EQzp/ybFouUUGk6WkXJHuF42PEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBjiUr/btsMX57EQzp/ybFouUUGk6WkXJHuF42PEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBjiUr/btsMX57EQzp/ybFouUUGk6WkXJHuF42PEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBjiUr%2FbtsMX57EQzp%2FybFouUUGk6WkXJHuF42PEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;599&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;1842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;1340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/owSuj/btsMYJQnmWQ/Bm6joa2HuCdXoGM64lzsQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/owSuj/btsMYJQnmWQ/Bm6joa2HuCdXoGM64lzsQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/owSuj/btsMYJQnmWQ/Bm6joa2HuCdXoGM64lzsQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FowSuj%2FbtsMYJQnmWQ%2FBm6joa2HuCdXoGM64lzsQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;744&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;1340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;diams;️ DetailedHTMLProps 에러 발생하면?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SCR-20250326-rtwj.png&quot; data-origin-width=&quot;2036&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xqQPq/btsMXPYmWcI/EDt2LUldMfKUna5K6qeBv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xqQPq/btsMXPYmWcI/EDt2LUldMfKUna5K6qeBv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xqQPq/btsMXPYmWcI/EDt2LUldMfKUna5K6qeBv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxqQPq%2FbtsMXPYmWcI%2FEDt2LUldMfKUna5K6qeBv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2036&quot; height=&quot;686&quot; data-filename=&quot;SCR-20250326-rtwj.png&quot; data-origin-width=&quot;2036&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;tsconfig.app.json&lt;/b&gt;&lt;/span&gt; 에 아래 코드 추가해주기&lt;/p&gt;
&lt;pre id=&quot;code_1742989077789&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
	&quot;compilerOptions&quot;: {
    	// ...
        &quot;types&quot;: [&quot;@emotion/react/types/css-prop&quot;]
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/React</category>
      <category>emotion 라이브러리</category>
      <category>emotion.js</category>
      <category>react + ts</category>
      <category>Vite</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/129</guid>
      <comments>https://dpdnjs402.tistory.com/129#entry129comment</comments>
      <pubDate>Wed, 26 Mar 2025 20:38:30 +0900</pubDate>
    </item>
    <item>
      <title>Vite React 프로젝트 path alias 설정하기</title>
      <link>https://dpdnjs402.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Vite를 이용해 React와 TypeScript를 기반으로 한 프로젝트 환경에서 path alias 설정하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  vite-tsconfig-paths 설치 &amp;amp; 플러그인 추가&lt;/h2&gt;
&lt;pre id=&quot;code_1742987361727&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add -D vite-tsconfig-paths&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;vite.config.ts 파일에 tsconfigPaths 플러그인 추가&lt;/b&gt;&lt;/span&gt;하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8sqEn/btsMXwkjRqp/dcVkkPLVpWKuR8UM0jgT7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8sqEn/btsMXwkjRqp/dcVkkPLVpWKuR8UM0jgT7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8sqEn/btsMXwkjRqp/dcVkkPLVpWKuR8UM0jgT7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8sqEn%2FbtsMXwkjRqp%2FdcVkkPLVpWKuR8UM0jgT7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;320&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1742987418428&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { defineConfig } from &quot;vite&quot;;
import react from &quot;@vitejs/plugin-react&quot;;
import tsconfigPaths from &quot;vite-tsconfig-paths&quot;;

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react(), tsconfigPaths()],
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &lt;span&gt;&amp;nbsp; tsconfig 파일에 alias 추가&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;1506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJVBp/btsMXqEsSqt/173IdNKHKQ1omYdprwfOk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJVBp/btsMXqEsSqt/173IdNKHKQ1omYdprwfOk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJVBp/btsMXqEsSqt/173IdNKHKQ1omYdprwfOk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJVBp%2FbtsMXqEsSqt%2F173IdNKHKQ1omYdprwfOk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;759&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;1506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1742987538598&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &quot;baseUrl&quot;: &quot;.&quot;,
    &quot;paths&quot;: {
      &quot;@components/*&quot;: [&quot;src/components/*&quot;]
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/전체</category>
      <category>path alias</category>
      <category>react</category>
      <category>TypeScript</category>
      <category>Vite</category>
      <category>리액트 경로설정</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/128</guid>
      <comments>https://dpdnjs402.tistory.com/128#entry128comment</comments>
      <pubDate>Wed, 26 Mar 2025 20:12:54 +0900</pubDate>
    </item>
    <item>
      <title>react-copy-to-clipboard 오류 발생</title>
      <link>https://dpdnjs402.tistory.com/127</link>
      <description>&lt;pre id=&quot;code_1741536871814&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'CopyToClipboard' cannot be used as a JSX component.
Its instance type 'CopyToClipboard' is not a valid JSX element.
Property 'refs' is missing in type 'PureComponent&amp;lt;Props, {}, any&amp;gt;' but required in type 'ElementClass'.ts(2786)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1826&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csGmaS/btsMErK0R2W/RWadd2o1YIgFyP7kTyJlzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csGmaS/btsMErK0R2W/RWadd2o1YIgFyP7kTyJlzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csGmaS/btsMErK0R2W/RWadd2o1YIgFyP7kTyJlzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsGmaS%2FbtsMErK0R2W%2FRWadd2o1YIgFyP7kTyJlzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;327&quot; data-origin-width=&quot;1826&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react-copy-to-clipboard를 사용하려고 하는데 위와 같은 오류가 발생...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741536939802&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add react-copy-to-clipboard
yarn add -D @types/react-copy-to-clipboard&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;type문제인가 싶어서 types도 설치 해줬고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBimGx/btsMFKWvSIJ/eJiZ6I16AFGXOx1cJh8YQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBimGx/btsMFKWvSIJ/eJiZ6I16AFGXOx1cJh8YQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBimGx/btsMFKWvSIJ/eJiZ6I16AFGXOx1cJh8YQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBimGx%2FbtsMFKWvSIJ%2FeJiZ6I16AFGXOx1cJh8YQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1326&quot; height=&quot;222&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDE에서 typescript 도 재시작 해줬는데 안된다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  해결방법&lt;/h2&gt;
&lt;pre id=&quot;code_1741537036189&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const ClipboardComponent = CopyToClipboard as any

&amp;lt;ClipboardComponent
    text={`${account.bankName} ${account.accountNumber}`}
    onCopy={() =&amp;gt; {
      alert('복사되었습니다.')
    }}
  &amp;gt;
    &amp;lt;button type=&quot;button&quot; className={cx('button')}&amp;gt;
      복사
    &amp;lt;/button&amp;gt;
  &amp;lt;/ClipboardComponent&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 체크를 우회하는 방식으로 이용하기로...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TypeScript가 CopyToClipboard를 JSX 컴포넌트로 인식하지 못하는 것 같아서...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;as any로 강제 캐스팅&lt;/b&gt;&lt;/span&gt;해버리니까 잘된다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공적  &amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/React</category>
      <category>as any</category>
      <category>react-copy-to-clipboard</category>
      <category>react-copy-to-clipboard 오류</category>
      <category>타입스크립트</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/127</guid>
      <comments>https://dpdnjs402.tistory.com/127#entry127comment</comments>
      <pubDate>Mon, 10 Mar 2025 01:18:45 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 .venv란? 파이썬 가상환경</title>
      <link>https://dpdnjs402.tistory.com/126</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5kMSW/btsMo7e43Lw/3Hjjske55SRbyGaVKUvsD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5kMSW/btsMo7e43Lw/3Hjjske55SRbyGaVKUvsD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5kMSW/btsMo7e43Lw/3Hjjske55SRbyGaVKUvsD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5kMSW%2FbtsMo7e43Lw%2F3Hjjske55SRbyGaVKUvsD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;410&quot; height=&quot;311&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.venv는 Python의 &lt;b&gt;가상 환경(Virtual Environment)&lt;/b&gt;을 나타내는 디렉터리 이름이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;venv 모듈을 이용해 가상 환경 만들 때 생성되고, 특정 프로젝트만의 패키지와 의존성을 독립적으로 관리할 수 있도록 도와준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  .venv의 역할&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;의존성 격리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트별로 필요한 패키지를 따로 설치할 수 있게 해준다 &amp;gt; 파이썬 환경을 오염시키지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트마다 .venv를 활용해 독립적인 환경을 구축할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패키지 관리 용이&lt;/h3&gt;
&lt;pre id=&quot;code_1740071002368&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip freeze &amp;gt; requirements.txt     # 패키지 기록

pip install -r requirements.txt   # 환경 복원&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;s&gt;Node.js의 yarn.lock 또는 package.json과 비슷한 역할?&lt;/s&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;운영체제 및 Python 버전 간 일관성 유지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 프로젝트를 여러 개발자가 공동 작업할 때, 동일한 패키지 버전을 사용하여 환경 차이에 의한 문제를 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  .venv 만들기 및 활성화&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;1336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ykiEB/btsMqjFLIsp/2ZjjCkN0fdIXqG2eaA53e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ykiEB/btsMqjFLIsp/2ZjjCkN0fdIXqG2eaA53e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ykiEB/btsMqjFLIsp/2ZjjCkN0fdIXqG2eaA53e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FykiEB%2FbtsMqjFLIsp%2F2ZjjCkN0fdIXqG2eaA53e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;479&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;1336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1740071051220&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m venv .venv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 실행하면 현재 디렉터리에 .venv 폴더가 생성된다. (맨 위 이미지 참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pycharm에서 새 프로젝트를 생성 할 때 위에 이미지와 같이 생성하면 .venv 폴더가 만들어지는 것을 확인해 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(환영 인사 스크립트 생성 ✅)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가상 환경 활성화/비활성화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ macOS/Linux (bash/zsh)&lt;/p&gt;
&lt;pre id=&quot;code_1740071115346&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source .venv/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활성화가 되면 프롬프트 앞에 (.venv) 표시가 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;1476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S1QLd/btsMpRJyCkf/lPCCKkIDTZkD5NY9vVNZs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S1QLd/btsMpRJyCkf/lPCCKkIDTZkD5NY9vVNZs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S1QLd/btsMpRJyCkf/lPCCKkIDTZkD5NY9vVNZs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS1QLd%2FbtsMpRJyCkf%2FlPCCKkIDTZkD5NY9vVNZs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;424&quot; height=&quot;559&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;1476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경에서 제공하는 파이썬을 사용하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1740071332465&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상환경을 빠져나올 때는 위에 명령어만 입력하면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  .venv 관련 추가 정보&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1305&quot; data-start=&quot;1260&quot;&gt;.venv는 보통 .gitignore에 추가하여 Git에 올리지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-end=&quot;1675&quot; data-start=&quot;1666&quot; data-ke-size=&quot;size26&quot;&gt;  정리&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-end=&quot;1905&quot; data-start=&quot;1676&quot; data-ke-size=&quot;size16&quot;&gt;✅ .venv는 Python의 &lt;b&gt;가상 환경 디렉터리&lt;/b&gt;&lt;br /&gt;✅ 프로젝트마다 패키지 및 Python 버전을 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;독립적으로 관리&lt;/span&gt; 가능&lt;br /&gt;✅ python -m venv .venv로 생성&lt;br /&gt;✅ source .venv/bin/activate 또는 .venv\Scripts\activate로 활성화&lt;br /&gt;✅ deactivate로 비활성화&lt;br /&gt;✅ .gitignore에 추가하여 Git에 올리지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Backend/Python</category>
      <category>FastAPI</category>
      <category>Python</category>
      <category>venv</category>
      <category>파이썬</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/126</guid>
      <comments>https://dpdnjs402.tistory.com/126#entry126comment</comments>
      <pubDate>Fri, 21 Feb 2025 02:12:27 +0900</pubDate>
    </item>
    <item>
      <title>HTML 테이블 생성기</title>
      <link>https://dpdnjs402.tistory.com/125</link>
      <description>&lt;figure id=&quot;og_1739632566590&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;HTML 테이블 생성기&quot; data-og-description=&quot;HTML 테이블 생성기 헤더 행 추가 헤더 열 추가 행 추가 열 추가 셀 병합 셀 분할 HTML 코드 생성 코드 복사&quot; data-og-host=&quot;yebang97.dothome.co.kr&quot; data-og-source-url=&quot;http://yebang97.dothome.co.kr/table/&quot; data-og-url=&quot;http://yebang97.dothome.co.kr/table/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://yebang97.dothome.co.kr/table/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://yebang97.dothome.co.kr/table/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;HTML 테이블 생성기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTML 테이블 생성기 헤더 행 추가 헤더 열 추가 행 추가 열 추가 셀 병합 셀 분할 HTML 코드 생성 코드 복사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yebang97.dothome.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SCR-20250216-batq.png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;1230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n1uch/btsMkYASBOz/vtxgAVujefXQrkpNAPzAj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n1uch/btsMkYASBOz/vtxgAVujefXQrkpNAPzAj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n1uch/btsMkYASBOz/vtxgAVujefXQrkpNAPzAj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn1uch%2FbtsMkYASBOz%2FvtxgAVujefXQrkpNAPzAj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;609&quot; data-filename=&quot;SCR-20250216-batq.png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;1230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199; font-family: 'Noto Serif KR';&quot;&gt;추가 해야할 부분&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 접근성 고려하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Reset 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 헤더 행 / 헤더 열 있을 때 1행 1열에 대각선 그어주는 기능&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; background-color: #9feec3;&quot;&gt;&lt;br /&gt;참고&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://htmlcss-docs.tistory.com/entry/a11y-tutorials-table&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://htmlcss-docs.tistory.com/entry/a11y-tutorials-table&lt;/a&gt;&lt;/p&gt;</description>
      <category>Frontend/JavaScript &amp;amp; Jquery</category>
      <category>html 테이블</category>
      <category>js로 테이블 만들기</category>
      <category>table태그</category>
      <author>전예방</author>
      <guid isPermaLink="true">https://dpdnjs402.tistory.com/125</guid>
      <comments>https://dpdnjs402.tistory.com/125#entry125comment</comments>
      <pubDate>Sat, 15 Feb 2025 23:56:40 +0900</pubDate>
    </item>
  </channel>
</rss>