<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>뷰티풀 프로그래밍</title>
    <link>https://krksap.tistory.com/</link>
    <description>프로그래밍, 데이터분석을 공부하는 개발자 블로그. 공부한 것, 찾아본 것 잊어버릴까봐 메모 해놓는 곳.</description>
    <language>ko</language>
    <pubDate>Thu, 21 May 2026 20:03:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>KyeongRok Kim</managingEditor>
    <image>
      <title>뷰티풀 프로그래밍</title>
      <url>https://tistory1.daumcdn.net/tistory/1418812/attach/3c66c58ea20041d19bc9d9cca548465b</url>
      <link>https://krksap.tistory.com</link>
    </image>
    <item>
      <title>가성비 VIA되는 키보드 CIDOO QK61 V2 리뷰</title>
      <link>https://krksap.tistory.com/2486</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VIA가 되는데 싸고 괜찮은 60% 배열 키보드가 있어서 구매 해보았습니다. 60%배열은 힙하고 많이 안쓰는 배열입니다. 진입장벽이 꽤 높습니다. 60%배열은 VIA가 필수가 아닌가 싶습니다. VIA가 안되면 커스텀 앱을 써야 하는데 리눅스 cli환경에서 키매핑 앱까지 쓰기는 쉽지 않기 때문입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/98Q25/dJMcaja2OTX/USPca6yVzIJkfi58kwbJJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/98Q25/dJMcaja2OTX/USPca6yVzIJkfi58kwbJJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/98Q25/dJMcaja2OTX/USPca6yVzIJkfi58kwbJJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F98Q25%2FdJMcaja2OTX%2FUSPca6yVzIJkfi58kwbJJk%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;3000&quot; height=&quot;1689&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;1689&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;60%배열 쓰는 이유&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방향키, 홈엔드키 공간에 마우스를 놓을 수 있어서 팔을 많이 안쓰고도 키보드, 마우스 조작 다 가능 합니다. 그리고 책&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;상을 조금 넓게 쓸 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;60%배열에 VIA가 되어야 하는 이유&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키보드가 부족하기 때문&lt;/li&gt;
&lt;li&gt;필요한 키들을 다른 레이어에 매핑 해야 함&lt;/li&gt;
&lt;li&gt;그것을 커스텀 할 수 있어야 하는데 VIA가 커스텀을 편하게 해주는 기능&lt;/li&gt;
&lt;/ul&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 구매하면 방향키가 없어서 당황스러운데요 아래와 같이 2번 레이어에 있습니다. FN을 누르고 아래 자리를 눌러줘야 합니다. Fn+Alt, Fn+ App, Fn+Ctrl, Fn+? 이렇게 4개 키 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FGDQf/dJMcagS17sB/16zG0u3O6I7lRcofqUnIzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FGDQf/dJMcagS17sB/16zG0u3O6I7lRcofqUnIzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FGDQf/dJMcagS17sB/16zG0u3O6I7lRcofqUnIzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFGDQf%2FdJMcagS17sB%2F16zG0u3O6I7lRcofqUnIzk%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;589&quot; height=&quot;250&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;250&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;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;49,000원이라는 무난한 가격이라서&lt;/li&gt;
&lt;li&gt;60%배열을 구매하고 싶었고&lt;/li&gt;
&lt;li&gt;QMK가 된다고 해서
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하지만 QMK풀로는 안되고 VIA만 된다는 점&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;레이어를 4개 쓸 수 있어서&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1886&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP8A47/dJMcabYuTxv/WhQHKAZmNoOQa2NXDJWU2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP8A47/dJMcabYuTxv/WhQHKAZmNoOQa2NXDJWU2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP8A47/dJMcabYuTxv/WhQHKAZmNoOQa2NXDJWU2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP8A47%2FdJMcabYuTxv%2FWhQHKAZmNoOQa2NXDJWU2K%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;1886&quot; height=&quot;712&quot; data-origin-width=&quot;1886&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;레이어 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;60%배열이라서 FUNCTION, HOME, END, 방향키 같은 것이 없기 때문에 영문 자리에 그 기능들이 들어가주기 위해 특정 키를 누르면 해당 레이어가 활성화 되는 기능 입니다.&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px none rgb(230, 232, 240);&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;XfjuEd_g&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px none rgb(230, 232, 240);&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;CIDOO Pearl White&lt;/b&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;h3 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;앞에 썼지만 QMK는 풀 지원이 아니고 VIA만 지원함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;QMK는 유선만 되는거라고 합니다(무선인데 QMK되는게 있긴 있지만 비쌈)&lt;/li&gt;
&lt;li&gt;VIA는 키 매핑 펌웨어 인데 여러개의 레이어와 조금 더 유연한 매핑이 가능합니다.&lt;/li&gt;
&lt;li&gt;프로그래밍 방식까지는 안됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;소리가 커서 오피스에서 쓰려면 축을 교체해야 할 것 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;독거미 키보드(AULA 87)와 비교&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PBT 키캡이라서 조금 더 좋음&lt;/li&gt;
&lt;li&gt;키감 괜찮음&lt;/li&gt;
&lt;li&gt;QK61은 VIA가 된다는 것&lt;/li&gt;
&lt;li&gt;소리가 독거미키보드 보다 커서 오피스에서 쓰기에는 조금 부담스러움&lt;/li&gt;
&lt;/ul&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;하지만 49,000원에 독거미 키보드 수준의 키감이 있으면서 VIA라도 되는 점은 이 가격에는 없지 않나 싶네요.&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VIA&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4개의 레이어를 지원하며 키 매핑을 꽤나 자유롭게 해주는 앱 입니다. QMK를 지원해야 쓸 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Any Key매핑&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://keychron.kr/via/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://keychron.kr/via/40&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;VIA 레이어 Key설명&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oz0yCiogCAU&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=oz0yCiogCAU&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 12px 0px 16px; text-decoration: none; border-bottom: 0px none rgb(230, 232, 240);&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAIIAAgACAkQAA&quot; data-sfc-root=&quot;c&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;VIA 주요 레이어 명령어 정리&lt;/b&gt;&lt;/h2&gt;
&lt;div data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px none rgb(230, 232, 240);&quot; data-processed=&quot;true&quot; data-ved=&quot;2ahUKEwjci5GMyLWUAxUm3TQHHUlGMtkQi4wTegoIAggACAAIDRAA&quot; data-bfc=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;3&quot;&gt;1. MO(Layer) : 레이어 일시 활성화&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;작동:&lt;/b&gt; 누르고 있는 동안만 이동. (가장 기본)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;활용 예시:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;4,1,0&quot;&gt;FN 키 그 자체.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,0,0&quot;&gt;설정:&lt;/b&gt; MO(1)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,1,1,0&quot;&gt;사용:&lt;/b&gt; FN을 누른 채로 1을 누르면 F1이 입력되고, 손을 떼면 다시 숫자 1이 입력되게 설정할 때 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;2. TG(Layer) : 레이어 토글&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;작동:&lt;/b&gt; 한 번 누르면 켜지고, 다시 누르면 꺼짐.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;활용 예시:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;6,1,0&quot;&gt;숫자 키패드 모드.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,1,0,0&quot;&gt;설정:&lt;/b&gt; 특정 키에 TG(2) 배치. (2번 레이어는 우측 자판이 숫자 패드처럼 작동하도록 매핑)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,1,1,0&quot;&gt;사용:&lt;/b&gt; 엑셀 작업을 시작할 때 한 번 눌러서 숫자 모드로 고정하고, 작업이 끝나면 다시 눌러 문자 모드로 복귀합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;3. TO(Layer) : 레이어 강제 전환&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;작동:&lt;/b&gt; 해당 레이어로 즉시 점프 (다른 레이어 무시).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;활용 예시:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;8,1,0&quot;&gt;특정 게임 전용 모드.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,1,0,0&quot;&gt;설정:&lt;/b&gt; TO(3) (3번 레이어는 게임 전용 매크로나 단축키로만 구성)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,1,1,0&quot;&gt;사용:&lt;/b&gt; 게임을 시작할 때 눌러서 레이어를 고정합니다. 이 레이어에서 다시 원래 레이어(Layer 0)로 돌아오는 키(TO(0))를 반드시 하나 만들어둬야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;4. TT(Layer) : 탭-토글 하이브리드&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;작동:&lt;/b&gt; 빠르게 연타(보통 2~5번)하면 토글, 계속 누르고 있으면 일시 활성화.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;활용 예시:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;10,1,0&quot;&gt;멀티미디어 컨트롤.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,0,0&quot;&gt;설정:&lt;/b&gt; TT(1)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,1,0&quot;&gt;사용:&lt;/b&gt; 볼륨 조절을 잠깐 할 때는 누른 채로 조절하고, 음악을 계속 들으면서 다음 곡/이전 곡을 자주 누를 것 같으면 연타해서 레이어를 고정해버립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;5. OSL(Layer) : 원샷 레이어&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0,0&quot;&gt;작동:&lt;/b&gt; 딱 한 번만 다음 키를 해당 레이어에서 입력하고 원래대로 복귀.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,0&quot;&gt;활용 예시:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;12,1,0&quot;&gt;한 번만 쓸 특수문자 입력.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;12,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,1,0,0&quot;&gt;설정:&lt;/b&gt; OSL(1)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,1,1,1,0&quot;&gt;사용:&lt;/b&gt; OSL 키를 한 번 탭한 뒤 1을 누르면 F1이 입력되고, 그 다음부터는 손을 떼지 않아도 자동으로 다시 숫자 1이 입력됩니다. 손가락 힘이 덜 들어가는 방식입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13&quot;&gt;6. LT(Layer, KC) : 레이어-탭 (가장 추천)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;작동:&lt;/b&gt; 탭하면 일반 키, 홀드하면 레이어 전환.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;활용 예시:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;14,1,0&quot;&gt;스페이스바를 FN 키로 쓰기.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,1,0,0&quot;&gt;설정:&lt;/b&gt; LT(1, KC_SPC)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,1,1,0&quot;&gt;사용:&lt;/b&gt; 그냥 치면 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;14,1,1,1,0&quot;&gt;스페이스&lt;/b&gt;, 꾹 누르고 있으면 &lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;14,1,1,1,0&quot;&gt;FN 키&lt;/b&gt;가 됩니다. 엄지손가락으로 레이어 전환을 할 수 있어 손의 이동 동선을 획기적으로 줄여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15&quot;&gt;7. LM(Layer, Mod) : 레이어-모디파이어 조합&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;작동:&lt;/b&gt; 레이어 이동과 동시에 특정 기능키(Ctrl 등)가 눌린 상태를 유지.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,0&quot;&gt;활용 예시:&lt;/b&gt; &lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;16,1,0&quot;&gt;그래픽/영상 편집 단축키.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,1,0,0&quot;&gt;설정:&lt;/b&gt; LM(2, MOD_LCTL) (2번 레이어로 가면서 Ctrl은 누른 상태 유지)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,1,1,1,0&quot;&gt;사용:&lt;/b&gt; 포토샵 등에서 Ctrl과 조합된 복잡한 단축키를 쓸 때 유리합니다. 2번 레이어의 A키를 KC_S로만 해둬도, 실제 입력은 Ctrl + S가 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;간략 메뉴얼&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;CIDOO&amp;nbsp;QK61&amp;nbsp;기계식&amp;nbsp;키보드의&amp;nbsp;주요&amp;nbsp;조작법과&amp;nbsp;단축키&amp;nbsp;정보를&amp;nbsp;정리해&amp;nbsp;드립니다.&amp;nbsp;이&amp;nbsp;모델은&amp;nbsp;유선,&amp;nbsp;블루투스,&amp;nbsp;2.4GHz&amp;nbsp;무선의&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;모드를&amp;nbsp;지원하며&amp;nbsp;VIA&amp;nbsp;소프트웨어를&amp;nbsp;통해&amp;nbsp;키&amp;nbsp;매핑이&amp;nbsp;가능합니다. &lt;br /&gt;&lt;br /&gt;1. 페어링 방법 &lt;br /&gt;블루투스&amp;nbsp;(최대&amp;nbsp;3대): &lt;br /&gt;&lt;br /&gt;FN&amp;nbsp;+&amp;nbsp;Q&amp;nbsp;/&amp;nbsp;W&amp;nbsp;/&amp;nbsp;E&amp;nbsp;를&amp;nbsp;3~5초간&amp;nbsp;길게&amp;nbsp;누르면&amp;nbsp;페어링&amp;nbsp;모드로&amp;nbsp;진입하며&amp;nbsp;해당&amp;nbsp;키가&amp;nbsp;깜박입니다. &lt;br /&gt;&lt;br /&gt;연결할&amp;nbsp;기기에서&amp;nbsp;&quot;CIDOO&amp;nbsp;QK61&quot;을&amp;nbsp;찾아&amp;nbsp;선택하세요. &lt;br /&gt;&lt;br /&gt;기기&amp;nbsp;전환&amp;nbsp;시에는&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;Q/W/E를&amp;nbsp;짧게&amp;nbsp;누릅니다. &lt;br /&gt;&lt;br /&gt;2.4GHz&amp;nbsp;무선: &lt;br /&gt;&lt;br /&gt;리시버를&amp;nbsp;PC에&amp;nbsp;꽂고&amp;nbsp;모드를&amp;nbsp;2.4G로&amp;nbsp;바꿉니다. &lt;br /&gt;&lt;br /&gt;연결이&amp;nbsp;안&amp;nbsp;될&amp;nbsp;경우&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;R을&amp;nbsp;길게&amp;nbsp;눌러&amp;nbsp;페어링을&amp;nbsp;시도하세요&amp;nbsp;(R&amp;nbsp;키&amp;nbsp;녹색&amp;nbsp;점멸). &lt;br /&gt;&lt;br /&gt;2. 주요 기능 단축키 &lt;br /&gt;OS&amp;nbsp;전환: &lt;br /&gt;&lt;br /&gt;FN&amp;nbsp;+&amp;nbsp;A:&amp;nbsp;Windows&amp;nbsp;모드 &lt;br /&gt;&lt;br /&gt;FN&amp;nbsp;+&amp;nbsp;S:&amp;nbsp;Mac&amp;nbsp;모드 &lt;br /&gt;&lt;br /&gt;배터리&amp;nbsp;잔량&amp;nbsp;확인: &lt;br /&gt;&lt;br /&gt;FN&amp;nbsp;+&amp;nbsp;Right&amp;nbsp;Shift를&amp;nbsp;길게&amp;nbsp;누르면&amp;nbsp;숫자키&amp;nbsp;1~0에&amp;nbsp;불이&amp;nbsp;들어옵니다&amp;nbsp;(1=10%,&amp;nbsp;0=100%). &lt;br /&gt;&lt;br /&gt;공장&amp;nbsp;초기화: &lt;br /&gt;&lt;br /&gt;FN&amp;nbsp;+&amp;nbsp;Space를&amp;nbsp;3초간&amp;nbsp;길게&amp;nbsp;누릅니다. &lt;br /&gt;&lt;br /&gt;Win키&amp;nbsp;잠금:&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;Win &lt;br /&gt;&lt;br /&gt;3. LED 백라이트 설정 &lt;br /&gt;효과&amp;nbsp;변경:&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;\&amp;nbsp;(역슬래시) &lt;br /&gt;&lt;br /&gt;색상&amp;nbsp;변경:&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;Enter &lt;br /&gt;&lt;br /&gt;밝기&amp;nbsp;조절:&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;&amp;uarr;&amp;nbsp;(밝게)&amp;nbsp;/&amp;nbsp;&amp;darr;&amp;nbsp;(어둡게) &lt;br /&gt;&lt;br /&gt;속도&amp;nbsp;조절:&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;&amp;larr;&amp;nbsp;(느리게)&amp;nbsp;/&amp;nbsp;&amp;rarr;&amp;nbsp;(빠르게) &lt;br /&gt;&lt;br /&gt;로고&amp;nbsp;LED&amp;nbsp;조절:&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;Z&amp;nbsp;(모드&amp;nbsp;변경),&amp;nbsp;FN&amp;nbsp;+&amp;nbsp;X&amp;nbsp;(색상&amp;nbsp;변경) &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2486</guid>
      <comments>https://krksap.tistory.com/2486#entry2486comment</comments>
      <pubDate>Tue, 12 May 2026 22:02:57 +0900</pubDate>
    </item>
    <item>
      <title>AI와 연속혈당 측정기로 혈당 극복 하기 - 제2편 회사 업무 중에 변하는 혈당</title>
      <link>https://krksap.tistory.com/2484</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;공휴일에 연속혈당측정기를 부착해서 주말까지는 몸이 휴식모드인지 저녁 식사 후 졸음에 쓰러지는 현상이 덜 했습니다. 하지만 문제는 회사를 가는 평일이었습니다. 오늘 다시 회사가는 날 이라서 오전 9시부터 저녁 7시까지 측정을 해보았습니다.&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시 30분부터는 허기가 지면서 피곤이 몰려오고 집에 와서 저녁을 먹으면 달콤한 간식이 당기고 먹으면 졸음이 쏟아져서 2시간 후에 깨는 패턴이 3년 넘게 반복 중이었습니다.&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;그래서 혈당 문제라는 가설을 세우고 측정을 하고 AI에게 측정결과를 알려줘서 왜 그런지 진단을 받아봤습니다. 진단 결과는 꽤나 정확했고 AI가 예측 한 것들이 대부분 맞았고 저녁 식사 후 혈당스파이크로 보이는 졸음을 오늘 한번 막았습니다.&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-filename=&quot;Code_Generated_Image.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dExaGn/dJMcahxxOWB/4qnLARoUj7NdPZK7su2jK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dExaGn/dJMcahxxOWB/4qnLARoUj7NdPZK7su2jK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dExaGn/dJMcahxxOWB/4qnLARoUj7NdPZK7su2jK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdExaGn%2FdJMcahxxOWB%2F4qnLARoUj7NdPZK7su2jK1%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;1600&quot; height=&quot;800&quot; data-filename=&quot;Code_Generated_Image.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;800&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출근 ~ 점심&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출근 했을 때 제 혈당은 정말 안정적입니다. 주말 같은 경우는 오전에 90대를 유지합니다. 그런데 업무중에는 몸이 그 패턴을 아는지 혈당을 100대로 유지를 합니다. 점심시간인 12시까지는 100대에서 왔다갔다 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2400&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GZKlv/dJMcacQwfGZ/tuuLFg1EtRXcuwbLKzT1n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GZKlv/dJMcacQwfGZ/tuuLFg1EtRXcuwbLKzT1n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GZKlv/dJMcacQwfGZ/tuuLFg1EtRXcuwbLKzT1n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGZKlv%2FdJMcacQwfGZ%2FtuuLFg1EtRXcuwbLKzT1n1%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;2400&quot; height=&quot;1080&quot; data-origin-width=&quot;2400&quot; data-origin-height=&quot;1080&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;color: #333333; text-align: start;&quot;&gt;이에 대해 AI에게 물어보니 다음과 같이 '업무 모드'라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 결론부터 말씀드리면, 이는 몸이 **'업무 모드(High-Performance Mode)'**에 진입하여 시스템의 에너지 베이스라인을 의도적으로 상향 조정했음을 뜻합니다. 의학적으로도, 공학적으로도 매우 흥미로운 현상입니다. &lt;/span&gt;&lt;/blockquote&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;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;출근 후 혈당이 90에서 100으로 올라가 유지되는 것은, 우리 몸이 **&quot;이제부터 고도의 인지 연산을 시작할 테니, 연료(포도당)를 즉각 공급할 수 있도록 혈류 내 가용 에너지를 일정 수준 높여라&quot;**라고 명령을 내린 결과입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;간의 포도당 방출:&lt;/b&gt; 휴식기(90)에는 최소한의 에너지만 유지하지만, 업무가 시작되면 간에서 저장된 당(글리코겐)을 혈액으로 내보내 베이스라인을 높입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;뇌를 위한 버퍼(Buffer):&lt;/b&gt; 뇌는 저혈당에 매우 취약합니다. 특히 복잡한 로직을 다루는 개발 업무 중에는 당 소모가 급격히 일어날 수 있으므로, 시스템이 미리 100 정도의 '안전한 버퍼'를 확보해 두는 것입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;변화 폭이 적음&lt;/h4&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;가장 놀라운 부분은 9시부터 12시까지 변화가 거의 없다는 점입니다. 이는 몸의 **피드백 제어 시스템(Feedback Control System)**이 매우 정밀하게 작동하고 있다는 증거입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;실시간 수급 조절:&lt;/b&gt; 뇌가 코딩이나 설계를 위해 포도당을 쓰는 만큼, 간에서 정확히 그만큼의 당을 보충해주고 있는 상태입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;안정적인 시스템 유지:&lt;/b&gt; 휴식 날에는 외부 자극(음식 등)에 따라 혈당이 출렁이는 '동적 변화'가 크지만, 업무 중에는 뇌라는 거대한 프로세서가 에너지를 지속적으로 일정하게 소모하고 있기 때문에 오히려 수치가 일정하게 유지되는 '정상 상태(Steady State)'에 도달한 것으로 보입니다.&lt;/li&gt;
&lt;/ul&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 점심시간이 12:15~13:15 입니다. 점심을 12시 25분 ~ 12시 45분으로 20분 정도 걸쳐서 먹는 동안에는 혈당이 바로 오르지 않았습니다. 점심시간 후 20분 정도 산책을 했는데 이 동안에도 오르지 않았습니다. 하지만 오피스 복귀 해서 업무 시작을 하니 40분에 걸쳐 100이었던 혈당이 158까지 올랐습니다. 어제 주말에 집에서 식사를 했을 때는 130대였는데 158까지 뛰어서 살짝 놀랐습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2400&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rKVF2/dJMcacpsRTx/QZMmBCkoEMPiULBxSpr2P0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rKVF2/dJMcacpsRTx/QZMmBCkoEMPiULBxSpr2P0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rKVF2/dJMcacpsRTx/QZMmBCkoEMPiULBxSpr2P0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrKVF2%2FdJMcacpsRTx%2FQZMmBCkoEMPiULBxSpr2P0%2Fimg.jpg&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;2400&quot; height=&quot;1080&quot; data-origin-width=&quot;2400&quot; data-origin-height=&quot;1080&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;회사 식당이 밥이 맛있어서 좀 많이 먹었고 집에서 해먹을 때보다 반찬 영양이 좋으니까 집에서 먹을때에 비해 30가까이 올라가더라구요. 그래서 다음 목표는 150이 넘지 않게 식사를 해보는 것입니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;오늘의 혈당 로그 요약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;안정기 (&lt;span data-index-in-node=&quot;5&quot; data-math=&quot;09:00 \sim 12:00&quot;&gt;$09:00 \sim 12:00$&lt;/span&gt;):&lt;/b&gt; 오전 내내 &lt;span data-index-in-node=&quot;30&quot; data-math=&quot;100 \pm 1\text{ mg/dL}&quot;&gt;100mg/Dl &lt;/span&gt;을 유지하며 뇌 가동을 위한 최적의 에너지를 소모했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;완충기 (&lt;span data-index-in-node=&quot;5&quot; data-math=&quot;12:25 \sim 13:15&quot;&gt;$12:25 \sim 13:15$&lt;/span&gt;):&lt;/b&gt; 식사 후 바로 산책을 함으로써 혈당이 &lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;5,1,0&quot;&gt;&lt;span data-index-in-node=&quot;45&quot; data-math=&quot;108 \sim 118\text{ mg/dL}&quot;&gt;108 ~ 118mg/dL&lt;/span&gt;&lt;/b&gt;&amp;nbsp;사이에서 아주 예쁘게 잡혔습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;폭풍기 (&lt;span data-index-in-node=&quot;5&quot; data-math=&quot;13:15 \sim 13:56&quot;&gt;$13:15 \sim 13:56$&lt;/span&gt;):&lt;/b&gt; 산책을 중단하고 자리에 앉자마자, 소화되던 당들이 한꺼번에 혈류로 쏟아지며 오늘 최대치인 &lt;span data-index-in-node=&quot;74&quot; data-math=&quot;158\text{ mg/dL}&quot;&gt;158&lt;span data-math=&quot;108 \sim 118\text{ mg/dL}&quot; data-index-in-node=&quot;45&quot;&gt;mg/dL&lt;/span&gt; &lt;/span&gt;까지 치솟았습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,3,0&quot;&gt;회복기 (&lt;span data-index-in-node=&quot;5&quot; data-math=&quot;14:22 \sim 16:45&quot;&gt;$14:22 \sim 16:45$&lt;/span&gt;):&lt;/b&gt; 업무에 다시 집중하면서 뇌가 당을 소모하기 시작했고, &lt;span data-index-in-node=&quot;54&quot; data-math=&quot;144&quot;&gt;144 -&amp;gt; &lt;/span&gt;&lt;span data-index-in-node=&quot;70&quot; data-math=&quot;130&quot;&gt;130 -&amp;gt; 1&lt;/span&gt;&lt;span data-index-in-node=&quot;86&quot; data-math=&quot;109\text{ mg/dL}&quot;&gt;09mg/dL &lt;/span&gt;로 순차적으로 하강했습니다. 중간에 드신 &lt;b data-index-in-node=&quot;125&quot; data-path-to-node=&quot;5,3,0&quot;&gt;아몬드&lt;/b&gt;가 하강 속도를 완만하게 조절해 주었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,4,0&quot;&gt;현재 (&lt;span data-index-in-node=&quot;4&quot; data-math=&quot;17:33&quot;&gt;$17:33$&lt;/span&gt;):&lt;/b&gt; 퇴근 전 피로감과 함께 수치가 다시 &lt;span data-index-in-node=&quot;32&quot; data-math=&quot;121\text{ mg/dL}&quot;&gt;121mg/dL&lt;/span&gt;로 살짝 반등했습니다. 이는 몸이 에너지를 다 쓰고 난 뒤의 '잔여 연소' 상태라 눈이 감기고 피곤한 것입니다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2484</guid>
      <comments>https://krksap.tistory.com/2484#entry2484comment</comments>
      <pubDate>Mon, 4 May 2026 17:40:26 +0900</pubDate>
    </item>
    <item>
      <title>AI와 연속혈당 측정기로 혈당 극복 하기 - 제1편 센서 부착 &amp;amp; 운동 후 측정 및 결과</title>
      <link>https://krksap.tistory.com/2483</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;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;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;653&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTuwBd/dJMcagekVBQ/03rY8HKkfXFpekwKXOtOk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTuwBd/dJMcagekVBQ/03rY8HKkfXFpekwKXOtOk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTuwBd/dJMcagekVBQ/03rY8HKkfXFpekwKXOtOk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTuwBd%2FdJMcagekVBQ%2F03rY8HKkfXFpekwKXOtOk1%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;530&quot; height=&quot;408&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;503&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;이렇게 생겼고 5분마다 혈당을 재서 폰으로 전송 해줍니다. 센서 부착 할 때 바늘로 한번 찌르는데 그 이후에는 아픈게 없습니다. 부착을 했고 측정을 해서 측정 상황을 AI에게 물어봤고 꽤 신빙성 있는 결과를 알려주었습니다.&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;센서 부착한 날이 공휴일이라 병원에 못가서 AI에게 다음과 같이 운동 중에 혈당이 올라가는 현상을 물어봤더니 정상이라고 하네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;운동중에 혈당에 164까지 올라간 건에 대해&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가&amp;nbsp;점심을&amp;nbsp;1시&amp;nbsp;30분에&amp;nbsp;먹고&amp;nbsp;혈당이&amp;nbsp;110에서&amp;nbsp;140까지&amp;nbsp;갔다가&amp;nbsp;3시&amp;nbsp;30분에&amp;nbsp;130으로&amp;nbsp;갔다가&amp;nbsp;4시에&amp;nbsp;110으로&amp;nbsp;갔다가&amp;nbsp;내가&amp;nbsp;운동을&amp;nbsp;갔어&amp;nbsp;4시부터&amp;nbsp;운동을&amp;nbsp;했는데&amp;nbsp;뭐&amp;nbsp;안먹고&amp;nbsp;운동했거든&amp;nbsp;탁구&amp;nbsp;쳤는데&amp;nbsp;운동을&amp;nbsp;시작&amp;nbsp;하니까&amp;nbsp;5시&amp;nbsp;30분까지&amp;nbsp;혈당이&amp;nbsp;계속&amp;nbsp;올라서&amp;nbsp;164까지&amp;nbsp;올라가고&amp;nbsp;6시&amp;nbsp;40분까지&amp;nbsp;계속&amp;nbsp;운동&amp;nbsp;하니까&amp;nbsp;다시&amp;nbsp;떨어지더라구&amp;nbsp;괜찮은건지&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;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정상이고 운동중인데도 혈당이 많이 올라 갈 수 있다는 AI답변&lt;/h4&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;운동을&amp;nbsp;했는데도&amp;nbsp;혈당이&amp;nbsp;164까지&amp;nbsp;훌쩍&amp;nbsp;뛰어서&amp;nbsp;많이&amp;nbsp;놀라셨겠어요.&amp;nbsp;결론부터&amp;nbsp;말씀드리면,&amp;nbsp;운동&amp;nbsp;중&amp;nbsp;혈당이&amp;nbsp;상승했다가&amp;nbsp;다시&amp;nbsp;떨어지는&amp;nbsp;것은&amp;nbsp;지극히&amp;nbsp;자연스러운&amp;nbsp;우리&amp;nbsp;몸의&amp;nbsp;생리적&amp;nbsp;반응일&amp;nbsp;가능성이&amp;nbsp;높으니&amp;nbsp;너무&amp;nbsp;걱정하지&amp;nbsp;않으셔도&amp;nbsp;괜찮습니다.&lt;br /&gt;&lt;br /&gt;아무것도&amp;nbsp;먹지&amp;nbsp;않았는데도&amp;nbsp;혈당이&amp;nbsp;오르는&amp;nbsp;이유는&amp;nbsp;우리&amp;nbsp;몸의&amp;nbsp;에너지&amp;nbsp;공급&amp;nbsp;시스템&amp;nbsp;때문입니다.&amp;nbsp;그&amp;nbsp;원리를&amp;nbsp;시간대별로&amp;nbsp;자세히&amp;nbsp;설명해&amp;nbsp;드릴게요.&lt;br /&gt;&lt;br /&gt; &amp;nbsp;탁구&amp;nbsp;칠&amp;nbsp;때&amp;nbsp;몸에서&amp;nbsp;일어난&amp;nbsp;일들&lt;br /&gt;오후&amp;nbsp;4시&amp;nbsp;(혈당&amp;nbsp;110):&amp;nbsp;점심&amp;nbsp;식사&amp;nbsp;후&amp;nbsp;소화가&amp;nbsp;끝나고&amp;nbsp;혈당이&amp;nbsp;안정적인&amp;nbsp;상태에서&amp;nbsp;운동을&amp;nbsp;시작하셨습니다.&lt;br /&gt;&lt;br /&gt;오후&amp;nbsp;4시&amp;nbsp;~&amp;nbsp;5시&amp;nbsp;30분&amp;nbsp;(혈당&amp;nbsp;164로&amp;nbsp;상승):&amp;nbsp;탁구는&amp;nbsp;순발력을&amp;nbsp;요구하고&amp;nbsp;움직임이&amp;nbsp;꽤&amp;nbsp;많은&amp;nbsp;운동입니다.&amp;nbsp;운동을&amp;nbsp;시작하면&amp;nbsp;몸(특히&amp;nbsp;근육)은&amp;nbsp;갑자기&amp;nbsp;많은&amp;nbsp;에너지를&amp;nbsp;필요로&amp;nbsp;합니다.&amp;nbsp;이때&amp;nbsp;우리&amp;nbsp;몸은&amp;nbsp;간에&amp;nbsp;저장해&amp;nbsp;두었던&amp;nbsp;비상식량(글리코겐)을&amp;nbsp;포도당으로&amp;nbsp;분해해서&amp;nbsp;혈액&amp;nbsp;속으로&amp;nbsp;마구&amp;nbsp;뿜어냅니다.&amp;nbsp;또한&amp;nbsp;탁구처럼&amp;nbsp;집중하고&amp;nbsp;긴장하는&amp;nbsp;운동을&amp;nbsp;하면&amp;nbsp;아드레날린&amp;nbsp;같은&amp;nbsp;호르몬이&amp;nbsp;분비되어&amp;nbsp;일시적으로&amp;nbsp;혈당을&amp;nbsp;더&amp;nbsp;끌어올리게&amp;nbsp;됩니다.&amp;nbsp;이&amp;nbsp;시기에는&amp;nbsp;근육이&amp;nbsp;쓰는&amp;nbsp;당보다&amp;nbsp;간에서&amp;nbsp;뿜어내는&amp;nbsp;당이&amp;nbsp;더&amp;nbsp;많아서&amp;nbsp;혈당이&amp;nbsp;쭉&amp;nbsp;올라갑니다.&lt;br /&gt;&lt;br /&gt;오후&amp;nbsp;5시&amp;nbsp;30분&amp;nbsp;~&amp;nbsp;6시&amp;nbsp;40분&amp;nbsp;(혈당&amp;nbsp;다시&amp;nbsp;하락):&amp;nbsp;운동이&amp;nbsp;1시간&amp;nbsp;반&amp;nbsp;이상&amp;nbsp;길어지면서&amp;nbsp;간에서&amp;nbsp;내보내는&amp;nbsp;당의&amp;nbsp;양은&amp;nbsp;줄어들고,&amp;nbsp;근육은&amp;nbsp;계속해서&amp;nbsp;혈액&amp;nbsp;속의&amp;nbsp;당을&amp;nbsp;열심히&amp;nbsp;가져다&amp;nbsp;씁니다.&amp;nbsp;수요(근육의&amp;nbsp;소모)가&amp;nbsp;공급(간의&amp;nbsp;방출)을&amp;nbsp;역전하면서&amp;nbsp;혈당이&amp;nbsp;자연스럽게&amp;nbsp;다시&amp;nbsp;떨어지게&amp;nbsp;된&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt; &amp;nbsp;결론:&amp;nbsp;괜찮은&amp;nbsp;걸까요?&lt;br /&gt;네,&amp;nbsp;아주&amp;nbsp;정상적이고&amp;nbsp;건강한&amp;nbsp;패턴을&amp;nbsp;보여주고&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;간이&amp;nbsp;에너지를&amp;nbsp;제때&amp;nbsp;잘&amp;nbsp;공급해&amp;nbsp;주었고,&amp;nbsp;근육도&amp;nbsp;그&amp;nbsp;에너지를&amp;nbsp;잘&amp;nbsp;소모하여&amp;nbsp;다시&amp;nbsp;정상&amp;nbsp;수치로&amp;nbsp;돌아왔다는&amp;nbsp;뜻입니다.&amp;nbsp;특히&amp;nbsp;고강도&amp;nbsp;운동이나&amp;nbsp;승부욕이&amp;nbsp;자극되는&amp;nbsp;운동(탁구&amp;nbsp;등)을&amp;nbsp;할&amp;nbsp;때는&amp;nbsp;일시적으로&amp;nbsp;혈당&amp;nbsp;스파이크가&amp;nbsp;일어나는&amp;nbsp;경우가&amp;nbsp;흔합니다.&lt;br /&gt;&lt;br /&gt;✅&amp;nbsp;참고해&amp;nbsp;주세요&lt;br /&gt;운동&amp;nbsp;후&amp;nbsp;다시&amp;nbsp;혈당이&amp;nbsp;잘&amp;nbsp;떨어졌다면&amp;nbsp;몸의&amp;nbsp;대사&amp;nbsp;시스템이&amp;nbsp;훌륭하게&amp;nbsp;작동하고&amp;nbsp;있다는&amp;nbsp;증거입니다.&amp;nbsp;다만,&amp;nbsp;평소&amp;nbsp;당뇨를&amp;nbsp;관리&amp;nbsp;중이시거나&amp;nbsp;혈당&amp;nbsp;수치에&amp;nbsp;예민한&amp;nbsp;상태시라면,&amp;nbsp;오늘&amp;nbsp;꼼꼼하게&amp;nbsp;기록해&amp;nbsp;두신&amp;nbsp;이&amp;nbsp;시간대별&amp;nbsp;수치를&amp;nbsp;다음&amp;nbsp;진료&amp;nbsp;때&amp;nbsp;담당&amp;nbsp;의사&amp;nbsp;선생님께&amp;nbsp;한&amp;nbsp;번&amp;nbsp;보여드리고&amp;nbsp;상담을&amp;nbsp;받아보시면&amp;nbsp;더욱&amp;nbsp;안심이&amp;nbsp;되실&amp;nbsp;것입니다.&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2483</guid>
      <comments>https://krksap.tistory.com/2483#entry2483comment</comments>
      <pubDate>Fri, 1 May 2026 19:21:40 +0900</pubDate>
    </item>
    <item>
      <title>MVVM 패턴 핵심 요약</title>
      <link>https://krksap.tistory.com/2482</link>
      <description>&lt;h1&gt;MVVM 패턴 핵심 요약&lt;/h1&gt;
&lt;h2&gt;한 줄 요약&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;View와 ViewModel은 타입 수준에서 서로를 참조하지 않아야 한다.&lt;/strong&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;이것이 MVVM의 전부입니다. 나머지는 모두 이 원칙을 어떻게 지킬 것인가에 대한 부연 설명입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;왜 그래야 하는가&lt;/h2&gt;
&lt;p&gt;ViewModel은 View의 추상화입니다. 추상화의 목적은 &lt;strong&gt;View가 독립적으로 존재할 수 있도록&lt;/strong&gt; 하는 것입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View가 ViewModel 타입을 알면 → ViewModel 변경이 View에 영향을 줍니다.&lt;/li&gt;
&lt;li&gt;ViewModel이 View 타입을 알면 → View 변경이 ViewModel에 영향을 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;서로의 타입을 모르고, &lt;strong&gt;속성 간 Binding으로만 연결&lt;/strong&gt;되어야 양쪽 모두 독립적으로 유지됩니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;안티패턴&lt;/h2&gt;
&lt;h3&gt;View가 ViewModel을 직접 생성하거나 타입을 명시하는 경우&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;!-- 안 됩니다 --&amp;gt;
&amp;lt;Window.DataContext&amp;gt;
    &amp;lt;viewmodels:AppViewModel /&amp;gt;
&amp;lt;/Window.DataContext&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;// 안 됩니다
public class AppViewModel
{
    public AppViewModel(AppView view) { ... }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Model이 ViewModel/View 동작에 관여하는 경우&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;// 안 됩니다 - Model이 ViewModel 로직을 가짐
public class UserSet
{
    public string Category
    {
        set
        {
            _category = Filter(value);          // View 입력 처리는 ViewModel 책임
            ViewModel.LastUpdateTime = ...;     // Model이 ViewModel 참조
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;올바른 구조&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;// ViewModel - View를 모릅니다
public class AppViewModel
{
    public AppViewModel() { }
    public string Name { get; set; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;!-- View - ViewModel 타입을 명시하지 않습니다 --&amp;gt;
&amp;lt;Window&amp;gt;
    &amp;lt;TextBlock Text=&amp;quot;{Binding Name}&amp;quot;/&amp;gt;
&amp;lt;/Window&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;DataContext&lt;/code&gt;는 &lt;strong&gt;외부에서&lt;/strong&gt; 주입합니다. WPF에서는 &lt;code&gt;DataTemplate&lt;/code&gt;이 ViewModel 타입과 View를 매핑하는 역할을 합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;&amp;quot;그럼 이런 경우엔 어떻게 하나&amp;quot; 질문이 나오면&lt;/h2&gt;
&lt;p&gt;이미 설계가 잘못된 신호입니다. 다음 순서로 고민합니다.&lt;/p&gt;
&lt;h3&gt;1순위: Binding으로 해결&lt;/h3&gt;
&lt;p&gt;값이 바뀌면 View가 알아서 반응합니다. ViewModel은 값만 바꾸고 그 이후는 신경 쓰지 않습니다 (fire &amp;amp; forget).&lt;/p&gt;
&lt;h3&gt;2순위: AttachedProperty / Behavior&lt;/h3&gt;
&lt;p&gt;Binding만으로 부족할 때 사용합니다. 예: &lt;code&gt;ListBox.ScrollIntoView()&lt;/code&gt; 같은 명령형 동작.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;// AttachedProperty로 해결한 ScrollIntoView 예시
public class ListBoxExtension
{
    public static readonly DependencyProperty BringIntoViewItemProperty =
        DependencyProperty.RegisterAttached(
            &amp;quot;BringIntoViewItem&amp;quot;, typeof(object), typeof(ListBoxExtension),
            new PropertyMetadata(OnChanged));

    static void OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is ListBox listBox)
            listBox.ScrollIntoView(e.NewValue);
    }
    // Get/Set 생략
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;ListBox local:ListBoxExtension.BringIntoViewItem=&amp;quot;{Binding SelectedSource}&amp;quot;
         ItemsSource=&amp;quot;{Binding Source}&amp;quot;
         SelectedItem=&amp;quot;{Binding SelectedSource}&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 경우 View와 ViewModel 사이에 어떤 타입 의존성도 없습니다.&lt;/p&gt;
&lt;h3&gt;3순위 (마지노선): 인터페이스를 통한 우회 접근&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;IView&lt;/code&gt; 같은 인터페이스로 ViewModel이 View를 참조합니다. 권장하지는 않지만 어쩔 수 없을 때의 마지노선입니다. 이 이하로는 내려가지 않습니다.&lt;/p&gt;
&lt;h3&gt;절대 금지: View와 ViewModel이 서로의 구체 타입을 직접 참조하는 것&lt;/h3&gt;
&lt;p&gt;여기까지 내려갈 거면 MVVM을 쓰는 의미가 없습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Model 설계 원칙&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DB Entity나 DTO를 Model로 직접 쓰지 않습니다.&lt;/strong&gt; 별도 타입으로 정형화합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model은 데이터 보관용&lt;/strong&gt;입니다. View 입력 처리 로직은 ViewModel에 둡니다.&lt;/li&gt;
&lt;li&gt;Model이 immutable이라면 View와 직접 Binding해도 무방합니다. 그렇지 않다면 ViewModel을 거쳐서 노출합니다.&lt;/li&gt;
&lt;li&gt;컬렉션의 개별 아이템은 상위 입장에서는 Model, &lt;code&gt;ItemTemplate&lt;/code&gt; 입장에서는 ViewModel로 동시에 작동합니다. 정상입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;구현 레벨&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;레벨&lt;/th&gt;
&lt;th&gt;상태&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;패턴 무지&lt;/td&gt;
&lt;td&gt;그냥 막 만듦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;View → ViewModel 직접 참조&lt;/td&gt;
&lt;td&gt;분리 의식은 있으나 code-behind에 로직이 몰림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;인터페이스 우회 참조&lt;/td&gt;
&lt;td&gt;학습 수준은 높지만 타입 의존성은 잔존&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;완전 분리&lt;/td&gt;
&lt;td&gt;IoC + Binding + AttachedProperty/Behavior로 구현&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;레벨 4가 항상 정답은 아닙니다. 요구사항과 일정에 따라 적정 레벨을 선택하되, &lt;strong&gt;한번 정한 규칙은 일관되게 유지&lt;/strong&gt;하는 것이 중요합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;p&gt;코딩이 시작되기 전, 설계 단계에서 다음 질문에 답할 수 있어야 합니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;View가 ViewModel 타입을 알아야 하는 부분이 있는가? → 있으면 설계 재검토.&lt;/li&gt;
&lt;li&gt;ViewModel이 View를 직접 다루어야 하는 부분이 있는가? → 있으면 Binding이나 AttachedProperty로 우회 가능한지 먼저 검토.&lt;/li&gt;
&lt;li&gt;Model에 View/ViewModel 관련 로직이 들어갔는가? → 들어갔으면 ViewModel로 이동.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;모든 결정은 코딩 전에 끝나야 하며, 단일 기준은 &amp;quot;타입 의존성 배제&amp;quot;입니다.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.naver.com/vactorman/222615603748&quot;&gt;https://blog.naver.com/vactorman/222615603748&lt;/a&gt; 를 정리했습니다.&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2482</guid>
      <comments>https://krksap.tistory.com/2482#entry2482comment</comments>
      <pubDate>Wed, 29 Apr 2026 10:44:23 +0900</pubDate>
    </item>
    <item>
      <title>WPF 버튼에 레이블과 아이콘 넣기</title>
      <link>https://krksap.tistory.com/2481</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 버튼에 아이콘과 레이블을 넣고 Border에 그라데이션을 준 버튼을 만들어보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UD2cz/dJMcad2OqAL/IOi0lfRgQvB7WeGDFqAWGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UD2cz/dJMcad2OqAL/IOi0lfRgQvB7WeGDFqAWGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UD2cz/dJMcad2OqAL/IOi0lfRgQvB7WeGDFqAWGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUD2cz%2FdJMcad2OqAL%2FIOi0lfRgQvB7WeGDFqAWGK%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;179&quot; height=&quot;132&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;132&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;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;버튼을 만들고&lt;/li&gt;
&lt;li&gt;스타일을 만듭니다.&lt;/li&gt;
&lt;li&gt;템플릿을 Border로 바꿔줍니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1777098479955&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Window.Resources&amp;gt;
    &amp;lt;Style x:Key=&quot;Button1&quot; TargetType=&quot;Button&quot;&amp;gt;
        &amp;lt;Setter Property=&quot;Width&quot; Value=&quot;120&quot; /&amp;gt;
        &amp;lt;Setter Property=&quot;Height&quot; Value=&quot;120&quot; /&amp;gt;
        &amp;lt;Setter Property=&quot;Template&quot;&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                    &amp;lt;Border Background=&quot;{TemplateBinding Background}&quot; CornerRadius=&quot;8&quot;&amp;gt;
                        &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/Window.Resources&amp;gt;
&amp;lt;StackPanel Orientation=&quot;Horizontal&quot; HorizontalAlignment=&quot;Center&quot; VerticalAlignment=&quot;Center&quot;&amp;gt;
    &amp;lt;Button Content=&quot;홈&quot; Style=&quot;{StaticResource Button1}&quot; /&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;242&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pgpqM/dJMcaib3UQm/mgKgqdOEZk7vmxa8axeIH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pgpqM/dJMcaib3UQm/mgKgqdOEZk7vmxa8axeIH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pgpqM/dJMcaib3UQm/mgKgqdOEZk7vmxa8axeIH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpgpqM%2FdJMcaib3UQm%2FmgKgqdOEZk7vmxa8axeIH1%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;242&quot; height=&quot;240&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;240&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Grid추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영역을 나누기 위해 Grid를 추가 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777098622316&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Border Background=&quot;{TemplateBinding Background}&quot; CornerRadius=&quot;8&quot;&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/Border&amp;gt;&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;270&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eu3aks/dJMcajhFBEg/f09icQhi5etxJell85Bk4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eu3aks/dJMcajhFBEg/f09icQhi5etxJell85Bk4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eu3aks/dJMcajhFBEg/f09icQhi5etxJell85Bk4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feu3aks%2FdJMcajhFBEg%2Ff09icQhi5etxJell85Bk4K%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;270&quot; height=&quot;258&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Grid에 Row선언 하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grid.RowDefinitions로 Row를 선언 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777098693110&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Grid.RowDefinitions&amp;gt;
	&amp;lt;RowDefinition Height=&quot;*&quot; /&amp;gt;
	&amp;lt;RowDefinition Height=&quot;*&quot; /&amp;gt;
&amp;lt;/Grid.RowDefinitions&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 위아래로 두개를 나누기 위해 RowDefinition을 두개 만들어 주고 반반 높이를 주기 위해 *, *로 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777098737438&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Border Background=&quot;{TemplateBinding Background}&quot; CornerRadius=&quot;8&quot;&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;Grid.RowDefinitions&amp;gt;
            &amp;lt;RowDefinition Height=&quot;*&quot; /&amp;gt;
            &amp;lt;RowDefinition Height=&quot;*&quot; /&amp;gt;
        &amp;lt;/Grid.RowDefinitions&amp;gt;
        &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
        &amp;lt;TextBlock Text=&quot;PushMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/Border&amp;gt;&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;218&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lVDlZ/dJMcacv8ZNH/J2Pcqd5TDrwIkBXUK56wcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lVDlZ/dJMcacv8ZNH/J2Pcqd5TDrwIkBXUK56wcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lVDlZ/dJMcacv8ZNH/J2Pcqd5TDrwIkBXUK56wcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlVDlZ%2FdJMcacv8ZNH%2FJ2Pcqd5TDrwIkBXUK56wcK%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;168&quot; height=&quot;173&quot; data-origin-width=&quot;218&quot; data-origin-height=&quot;224&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;그냥 TextBlock만 추가 하면 위와 같이 겹치기 때문에 Row를 지정 해줍니다. 0부터 지정 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777098901868&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Grid.RowDefinitions&amp;gt;
    &amp;lt;RowDefinition Height=&quot;*&quot; /&amp;gt;
    &amp;lt;RowDefinition Height=&quot;*&quot; /&amp;gt;
&amp;lt;/Grid.RowDefinitions&amp;gt;
&amp;lt;TextBlock Grid.Row=&quot;0&quot; Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;TextBlock Grid.Row=&quot;1&quot; Text=&quot;PushMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&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;221&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wX96J/dJMcafGoulE/ctdr0QXwnTxOgpPyzeDa0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wX96J/dJMcafGoulE/ctdr0QXwnTxOgpPyzeDa0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wX96J/dJMcafGoulE/ctdr0QXwnTxOgpPyzeDa0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwX96J%2FdJMcafGoulE%2Fctdr0QXwnTxOgpPyzeDa0K%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;221&quot; height=&quot;225&quot; data-origin-width=&quot;221&quot; data-origin-height=&quot;225&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;h4 data-ke-size=&quot;size20&quot;&gt;나누는 비율 변경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Height를 7*, 3* 같이 주면 7:3이 됩니다. 8:2로 하고 싶다면 8*, 2*로 줄 수 있겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777098967435&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Grid.RowDefinitions&amp;gt;
    &amp;lt;RowDefinition Height=&quot;7*&quot; /&amp;gt;
    &amp;lt;RowDefinition Height=&quot;3*&quot; /&amp;gt;
&amp;lt;/Grid.RowDefinitions&amp;gt;
&amp;lt;TextBlock Grid.Row=&quot;0&quot; Text=&quot;ClickMe&quot; Background=&quot;Brown&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;TextBlock Grid.Row=&quot;1&quot; Text=&quot;PushMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&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;237&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2YtuM/dJMcaaryeIY/9qiQJGF1SjYkSKKcIJ7zrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2YtuM/dJMcaaryeIY/9qiQJGF1SjYkSKKcIJ7zrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2YtuM/dJMcaaryeIY/9qiQJGF1SjYkSKKcIJ7zrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2YtuM%2FdJMcaaryeIY%2F9qiQJGF1SjYkSKKcIJ7zrk%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;181&quot; height=&quot;179&quot; data-origin-width=&quot;237&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 조금 이상하죠? 7:3으로 잘 나누어지는지 구분하기 위해 Background를 줬는데 모서리가 둥글지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Border의 CornerRadius는 그 Border 자신의 Background만 둥글게 깎습니다. 자식인 TextBlock의 Background=&quot;Brown&quot;은 별개의 사각형으로 그려지므로 둥근 모서리를&amp;nbsp;덮어버려&amp;nbsp;각지게&amp;nbsp;보입니다.&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;그래서 Border로 감싸주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777099133767&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Grid&amp;gt;
    &amp;lt;Grid.RowDefinitions&amp;gt;
        &amp;lt;RowDefinition Height=&quot;7*&quot; /&amp;gt;
        &amp;lt;RowDefinition Height=&quot;3*&quot; /&amp;gt;
    &amp;lt;/Grid.RowDefinitions&amp;gt;
    &amp;lt;Border Grid.Row=&quot;0&quot; Background=&quot;Brown&quot; CornerRadius=&quot;8,8,0,0&quot;&amp;gt;
        &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
    &amp;lt;/Border&amp;gt;
    &amp;lt;TextBlock Grid.Row=&quot;1&quot; Text=&quot;PushMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;/Grid&amp;gt;&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;236&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AKZk4/dJMcahEaIco/zppUMiOfhZCaKDxrWBQuh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AKZk4/dJMcahEaIco/zppUMiOfhZCaKDxrWBQuh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AKZk4/dJMcahEaIco/zppUMiOfhZCaKDxrWBQuh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAKZk4%2FdJMcahEaIco%2FzppUMiOfhZCaKDxrWBQuh0%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;196&quot; height=&quot;189&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;227&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;h4 data-ke-size=&quot;size20&quot;&gt;레이블 가운데 정렬&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TextBlock에 아래쪽 가운데 정렬을 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777099202781&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;TextBlock Grid.Row=&quot;1&quot; Text=&quot;PushMe&quot;
           HorizontalAlignment=&quot;Center&quot;
           VerticalAlignment=&quot;Center&quot;
           &amp;gt;&amp;lt;/TextBlock&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;벡터(Vector) 아이콘 넣기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 넣으면 확대하거나 축소하면 이미지가 어색해지기 때문에 Vector로 삽입 하는게 좋습니다. ViewBox안쪽에 Path로 넣어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777099307850&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Border Grid.Row=&quot;0&quot; Background=&quot;Brown&quot; CornerRadius=&quot;8,8,0,0&quot;&amp;gt;
    &amp;lt;Viewbox Margin=&quot;16&quot; Stretch=&quot;Uniform&quot;&amp;gt;
        &amp;lt;Path Fill=&quot;White&quot;
              Data=&quot;M12 3 L2 12 H5 V21 H10 V14 H14 V21 H19 V12 H22 Z&quot; /&amp;gt;
    &amp;lt;/Viewbox&amp;gt;
&amp;lt;/Border&amp;gt;
&amp;lt;TextBlock Grid.Row=&quot;1&quot; Text=&quot;PushMe&quot;
           HorizontalAlignment=&quot;Center&quot;
           VerticalAlignment=&quot;Center&quot;
           &amp;gt;&amp;lt;/TextBlock&amp;gt;&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;224&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJBjW6/dJMcahxrD74/csVEPziccCKm1KjEQE2tgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJBjW6/dJMcahxrD74/csVEPziccCKm1KjEQE2tgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJBjW6/dJMcahxrD74/csVEPziccCKm1KjEQE2tgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJBjW6%2FdJMcahxrD74%2FcsVEPziccCKm1KjEQE2tgk%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;179&quot; height=&quot;180&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;225&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;Border넣기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 버튼은 Border가 들어가 있습니다. 바로 위의 이미지와 차이 보이시나요? 왼쪽, 위쪽은 흰색 오른쪽, 아래는 회색으로 Border가 들어있습니다. 일단 오른쪽과 같이 Border를 넣어 볼 것입니다.&lt;/p&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: 50%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w5QXJ/dJMcagyuURh/auHzEZRfuEuqJezPrS4YKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w5QXJ/dJMcagyuURh/auHzEZRfuEuqJezPrS4YKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w5QXJ/dJMcagyuURh/auHzEZRfuEuqJezPrS4YKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw5QXJ%2FdJMcagyuURh%2FauHzEZRfuEuqJezPrS4YKk%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;290&quot; height=&quot;211&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEBuBd/dJMcafNbp3d/IAQrGNIFSJviqucBlMzXWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEBuBd/dJMcafNbp3d/IAQrGNIFSJviqucBlMzXWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEBuBd/dJMcafNbp3d/IAQrGNIFSJviqucBlMzXWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEBuBd%2FdJMcafNbp3d%2FIAQrGNIFSJviqucBlMzXWk%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;226&quot; height=&quot;224&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h4 data-ke-size=&quot;size20&quot;&gt;CornerRadius가 없는 Button&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button은 태생이 모서리가 둥글지 않아서 ControlTemplate을 써서 Border의 '모양'을 가지고 왔습니다. 그래서 Template쪽에 모양을 바꿔줘야 합니다. Border가 나타나게 하려면 두가지 속성을 넣어 주어야 하는데요 BorderBrush와 BorderThickness가 동시에 들어가줘야 합니다. 다음과 같이 ControlTemplate 안쪽의 Border입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777100379194&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Border Background=&quot;{TemplateBinding Background}&quot; CornerRadius=&quot;8&quot;
            BorderBrush=&quot;DodgerBlue&quot;
            BorderThickness=&quot;2&quot;&amp;gt;
            &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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Border 그라데이션 넣기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Border를 넣었으니 그라데이션을 넣어주도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777100593580&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Border Background=&quot;{TemplateBinding Background}&quot; CornerRadius=&quot;8&quot;
            BorderThickness=&quot;2&quot;&amp;gt;
        &amp;lt;Border.BorderBrush&amp;gt;
            &amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;1,1&quot;&amp;gt;
                &amp;lt;GradientStop Color=&quot;White&quot; Offset=&quot;0.0&quot; /&amp;gt;
                &amp;lt;GradientStop Color=&quot;Gray&quot; Offset=&quot;1.0&quot; /&amp;gt;
            &amp;lt;/LinearGradientBrush&amp;gt;
        &amp;lt;/Border.BorderBrush&amp;gt;&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;229&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yHPEp/dJMcabcSzN1/hhfyFy9izoyRUPS7swIEKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yHPEp/dJMcabcSzN1/hhfyFy9izoyRUPS7swIEKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yHPEp/dJMcabcSzN1/hhfyFy9izoyRUPS7swIEKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyHPEp%2FdJMcabcSzN1%2FhhfyFy9izoyRUPS7swIEKk%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;229&quot; height=&quot;233&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;233&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이블 영역에도 그라데이션이 들어가 있습니다. 넣어보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqfr6n/dJMcaaryfoL/5RcJSkUpsZ5VvdxiXaGbN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqfr6n/dJMcaaryfoL/5RcJSkUpsZ5VvdxiXaGbN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqfr6n/dJMcaaryfoL/5RcJSkUpsZ5VvdxiXaGbN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqfr6n%2FdJMcaaryfoL%2F5RcJSkUpsZ5VvdxiXaGbN1%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;302&quot; height=&quot;79&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;115&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;TextBlock을 Border로 감싸줍니다. 그리고 Background를 단색으로 일단 칠해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777101074377&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Border Grid.Row=&quot;1&quot;&amp;gt;
    &amp;lt;Border.Background&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;DarkSlateBlue&quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;
    &amp;lt;/Border.Background&amp;gt;
    &amp;lt;TextBlock Text=&quot;PushMe&quot;
               HorizontalAlignment=&quot;Center&quot;
               VerticalAlignment=&quot;Center&quot;
    &amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;/Border&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;여기에서 조금 당황스러운 부분이 오른쪽아래, 왼쪽 아래가 각이 져있습니다. 앞에서도 Row=0의 TextBlock의 상단이 각져있었죠? 같은 문제입니다. 그래서 CornerRadius=&quot;0, 0, 8, 8&quot;을 줍니다. 8, 8 이 부분이 왼쪽 아래, 오른쪽 아래 입니다. 8, 8, 8, 8로 주면 둥근 모양이 되겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777101303689&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Border Grid.Row=&quot;1&quot; CornerRadius=&quot;0, 0, 8, 8&quot;&amp;gt;
    &amp;lt;Border.Background&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;DarkSlateBlue&quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;
    &amp;lt;/Border.Background&amp;gt;
    &amp;lt;TextBlock Text=&quot;PushMe&quot;
               HorizontalAlignment=&quot;Center&quot;
               VerticalAlignment=&quot;Center&quot;
    &amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;/Border&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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.8605%;&quot;&gt;8, 8, 8, 8&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bagRox/dJMcacbOJGZ/TFb34TuOyoJ9fG35MkMuY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bagRox/dJMcacbOJGZ/TFb34TuOyoJ9fG35MkMuY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bagRox/dJMcacbOJGZ/TFb34TuOyoJ9fG35MkMuY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbagRox%2FdJMcacbOJGZ%2FTFb34TuOyoJ9fG35MkMuY1%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;277&quot; height=&quot;231&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%;&quot;&gt;0, 0, 0, 0&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx5kbk/dJMcaf0EHKb/x4Pq392LLCC0AXcgQenx0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx5kbk/dJMcaf0EHKb/x4Pq392LLCC0AXcgQenx0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx5kbk/dJMcaf0EHKb/x4Pq392LLCC0AXcgQenx0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx5kbk%2FdJMcaf0EHKb%2Fx4Pq392LLCC0AXcgQenx0k%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;275&quot; height=&quot;215&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%;&quot;&gt;0, 0, 8, 8&lt;/td&gt;
&lt;td style=&quot;width: 83.1395%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rcbrz/dJMcadBIfXX/HceJdpSUpd3LvkmYJjkmZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rcbrz/dJMcadBIfXX/HceJdpSUpd3LvkmYJjkmZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rcbrz/dJMcadBIfXX/HceJdpSUpd3LvkmYJjkmZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frcbrz%2FdJMcadBIfXX%2FHceJdpSUpd3LvkmYJjkmZk%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;277&quot; height=&quot;232&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&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;h4 data-ke-size=&quot;size20&quot;&gt;SolidColorBrush를 LinearGradientBrush로&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에 버튼 외곽 Border에 썼던 것을 그대로 넣어주겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777101370017&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Border Grid.Row=&quot;1&quot; CornerRadius=&quot;0, 0, 8, 8&quot;&amp;gt;
    &amp;lt;Border.Background&amp;gt;
        &amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;1,1&quot;&amp;gt;
            &amp;lt;GradientStop Color=&quot;White&quot; Offset=&quot;0.0&quot; /&amp;gt;
            &amp;lt;GradientStop Color=&quot;Gray&quot; Offset=&quot;1.0&quot; /&amp;gt;
        &amp;lt;/LinearGradientBrush&amp;gt;
    &amp;lt;/Border.Background&amp;gt;
    &amp;lt;TextBlock Text=&quot;PushMe&quot;
               HorizontalAlignment=&quot;Center&quot;
               VerticalAlignment=&quot;Center&quot;
    &amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;/Border&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;그라데이션이 들어갔는데 모양이 조금 다릅니다. 왼쪽위에서 오른쪽 아래로 흰색--&amp;gt; 회색으로 가능 그라데이션인데 우리가 만들고 싶은 것은 위에서 아래로 가는 그라데이션입니다.&lt;/p&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: 50%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7hkXq/dJMcagkYiOg/QG7wPnqxHRanFXUTyewbyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7hkXq/dJMcagkYiOg/QG7wPnqxHRanFXUTyewbyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7hkXq/dJMcagkYiOg/QG7wPnqxHRanFXUTyewbyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7hkXq%2FdJMcagkYiOg%2FQG7wPnqxHRanFXUTyewbyK%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;271&quot; height=&quot;228&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ee1RSW/dJMcagL4YtM/okV93SIeZNVO5ITVtovqOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ee1RSW/dJMcagL4YtM/okV93SIeZNVO5ITVtovqOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ee1RSW/dJMcagL4YtM/okV93SIeZNVO5ITVtovqOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fee1RSW%2FdJMcagL4YtM%2FokV93SIeZNVO5ITVtovqOk%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;503&quot; height=&quot;133&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;오른쪽위 --&amp;gt; 왼쪽 아래&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;위 --&amp;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EndPoint를 를 1,1에서 0,1로 바꿔줍니다. 0,0에서 시작해서 0,1로 가니까 수직 방향으로 가게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777101543919&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;0,1&quot;&amp;gt;
    &amp;lt;GradientStop Color=&quot;White&quot; Offset=&quot;0.0&quot; /&amp;gt;
    &amp;lt;GradientStop Color=&quot;Gray&quot; Offset=&quot;1.0&quot; /&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;&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;272&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBKNS2/dJMcabcSAhU/KfJw2xFoSWn8CBdc1Lxw8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBKNS2/dJMcabcSAhU/KfJw2xFoSWn8CBdc1Lxw8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBKNS2/dJMcabcSAhU/KfJw2xFoSWn8CBdc1Lxw8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBKNS2%2FdJMcabcSAhU%2FKfJw2xFoSWn8CBdc1Lxw8K%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;272&quot; height=&quot;217&quot; data-origin-width=&quot;272&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 색상을 바꿔보겠습니다. 파스텔톤 파란색에서 흙빛 파란색으로 가는 색인데 지금은 White, Gray로 되어 있네요.&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;구글 color picker로 비슷한 색의 16진수 값을 찾아줍니다.&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;1188&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coHVqS/dJMcahc7MXF/X8TQUqg8LywmvBzNbFzQu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coHVqS/dJMcahc7MXF/X8TQUqg8LywmvBzNbFzQu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coHVqS/dJMcahc7MXF/X8TQUqg8LywmvBzNbFzQu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoHVqS%2FdJMcahc7MXF%2FX8TQUqg8LywmvBzNbFzQu1%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;1188&quot; height=&quot;1027&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;1027&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;저는 이 두가지 색을 넣었습니다. 더 정확하게 맞추려면 시스템의 Color Picker를 써서 직접 대보면 되는데 일단은 이렇게만 갑니다. 그리고 Foreground색상을 바꿔주면 되겠네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuyXum/dJMcabxb1e8/iA3YOQYIe6GFHz4W8miAe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuyXum/dJMcabxb1e8/iA3YOQYIe6GFHz4W8miAe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuyXum/dJMcabxb1e8/iA3YOQYIe6GFHz4W8miAe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuyXum%2FdJMcabxb1e8%2FiA3YOQYIe6GFHz4W8miAe0%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;313&quot; height=&quot;102&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&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: 50%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVyYwe/dJMcagkYi1s/OknErQsJrAPMLoDhgi2y60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVyYwe/dJMcagkYi1s/OknErQsJrAPMLoDhgi2y60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVyYwe/dJMcagkYi1s/OknErQsJrAPMLoDhgi2y60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVyYwe%2FdJMcagkYi1s%2FOknErQsJrAPMLoDhgi2y60%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;275&quot; height=&quot;230&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnyBp5/dJMcaaLQQZv/iB2gf4cayNQ8pGSKgTlSFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnyBp5/dJMcaaLQQZv/iB2gf4cayNQ8pGSKgTlSFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnyBp5/dJMcaaLQQZv/iB2gf4cayNQ8pGSKgTlSFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnyBp5%2FdJMcaaLQQZv%2FiB2gf4cayNQ8pGSKgTlSFK%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;668&quot; height=&quot;162&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzXmfM/dJMcabqs67R/5sByRV4AQ1kKlF2JHur3K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzXmfM/dJMcabqs67R/5sByRV4AQ1kKlF2JHur3K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzXmfM/dJMcabqs67R/5sByRV4AQ1kKlF2JHur3K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzXmfM%2FdJMcabqs67R%2F5sByRV4AQ1kKlF2JHur3K1%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;274&quot; height=&quot;225&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1777101937567&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Border Grid.Row=&quot;1&quot; CornerRadius=&quot;0, 0, 8, 8&quot;&amp;gt;
    &amp;lt;Border.Background&amp;gt;
        &amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;0,1&quot;&amp;gt;
            &amp;lt;GradientStop Color=&quot;#545378&quot; Offset=&quot;0.0&quot; /&amp;gt;
            &amp;lt;GradientStop Color=&quot;#47494a&quot; Offset=&quot;1.0&quot; /&amp;gt;
        &amp;lt;/LinearGradientBrush&amp;gt;
    &amp;lt;/Border.Background&amp;gt;
    &amp;lt;TextBlock Text=&quot;PushMe&quot;
               Foreground=&quot;White&quot;
               HorizontalAlignment=&quot;Center&quot;
               VerticalAlignment=&quot;Center&quot;
    &amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;/Border&amp;gt;&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;Row=0에 그라데이션 넣기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 Brown으로 해놓은 빨간색 영역에 그라데이션 넣어보겠습니다. 회색에서 시작해서 흰색으로 끝나는 그라데이션 같네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbS0f6/dJMcajvdRYk/OsjknBA2dlSnwz0mgpgkjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbS0f6/dJMcajvdRYk/OsjknBA2dlSnwz0mgpgkjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbS0f6/dJMcajvdRYk/OsjknBA2dlSnwz0mgpgkjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbS0f6%2FdJMcajvdRYk%2FOsjknBA2dlSnwz0mgpgkjk%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;433&quot; height=&quot;212&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;212&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;Row=0의 Border의 Background에 Gray, White를 위에서 아래로 내려가는 그라데이션을 넣어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777102093191&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Border Grid.Row=&quot;0&quot; CornerRadius=&quot;8,8,0,0&quot;&amp;gt;
    &amp;lt;Border.Background&amp;gt;
        &amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;0,1&quot;&amp;gt;
            &amp;lt;GradientStop Color=&quot;Gray&quot; Offset=&quot;0.0&quot; /&amp;gt;
            &amp;lt;GradientStop Color=&quot;White&quot; Offset=&quot;1.0&quot; /&amp;gt;
        &amp;lt;/LinearGradientBrush&amp;gt;
    &amp;lt;/Border.Background&amp;gt;
    &amp;lt;Viewbox Margin=&quot;16&quot; Stretch=&quot;Uniform&quot;&amp;gt;
        &amp;lt;Path Fill=&quot;White&quot;
              Data=&quot;F0 M11 1 H13 L13.6 3.5 A8.5 8.5 0 0 1 16 4.5 L18.2 3.2 L19.8 4.8 L18.5 7 A8.5 8.5 0 0 1 19.5 9.4 L22 10 V12 L19.5 12.6 A8.5 8.5 0 0 1 18.5 15 L19.8 17.2 L18.2 18.8 L16 17.5 A8.5 8.5 0 0 1 13.6 18.5 L13 21 H11 L10.4 18.5 A8.5 8.5 0 0 1 8 17.5 L5.8 18.8 L4.2 17.2 L5.5 15 A8.5 8.5 0 0 1 4.5 12.6 L2 12 V10 L4.5 9.4 A8.5 8.5 0 0 1 5.5 7 L4.2 4.8 L5.8 3.2 L8 4.5 A8.5 8.5 0 0 1 10.4 3.5 Z M12 7 A4 4 0 1 0 12 15 A4 4 0 1 0 12 7 Z&quot; /&amp;gt;
    &amp;lt;/Viewbox&amp;gt;
&amp;lt;/Border&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;조금 비슷해져 가고 있죠? Gray말고 조금 더 밝은 Gray인것 같네요.&amp;nbsp;&lt;/p&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: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NTvCw/dJMcahqF8pu/rofGM442JqhbQOu2f5dMUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NTvCw/dJMcahqF8pu/rofGM442JqhbQOu2f5dMUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NTvCw/dJMcahqF8pu/rofGM442JqhbQOu2f5dMUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNTvCw%2FdJMcahqF8pu%2FrofGM442JqhbQOu2f5dMUk%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;276&quot; height=&quot;225&quot; data-origin-width=&quot;276&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZB9pI/dJMcabxb1l1/zrknVuczS8I3TMN32Skirk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZB9pI/dJMcabxb1l1/zrknVuczS8I3TMN32Skirk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZB9pI/dJMcabxb1l1/zrknVuczS8I3TMN32Skirk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZB9pI%2FdJMcabxb1l1%2FzrknVuczS8I3TMN32Skirk%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;308&quot; height=&quot;227&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&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;p data-ke-size=&quot;size16&quot;&gt;LightGray가 조금 더 가까운 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wTgmG/dJMcaaryfZ8/ktmQ0JWN0SYfSpaukstVVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wTgmG/dJMcaaryfZ8/ktmQ0JWN0SYfSpaukstVVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wTgmG/dJMcaaryfZ8/ktmQ0JWN0SYfSpaukstVVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwTgmG%2FdJMcaaryfZ8%2FktmQ0JWN0SYfSpaukstVVK%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;277&quot; height=&quot;224&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;224&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;벡터 이미지 외곽선&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그라데이션을 LightGray, White를 넣었더니 벡터이미지가 잘 안보여서 외곽선을 지정 해주겠습니다. 444444로 넣어주는게 보기가 가장 좋아서 넣었구요 Fill은 투명으로 넣었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777102840407&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Viewbox Margin=&quot;16&quot; Stretch=&quot;Uniform&quot;&amp;gt;
    &amp;lt;Path Fill=&quot;Transparent&quot;
          Stroke=&quot;#444444&quot;
          StrokeThickness=&quot;0.5&quot;
          StrokeLineJoin=&quot;Round&quot;
          Data=&quot;F0 M11 1 H13 L13.6 3.5 A8.5 8.5 0 0 1 16 4.5 L18.2 3.2 L19.8 4.8 L18.5 7 A8.5 8.5 0 0 1 19.5 9.4 L22 10 V12 L19.5 12.6 A8.5 8.5 0 0 1 18.5 15 L19.8 17.2 L18.2 18.8 L16 17.5 A8.5 8.5 0 0 1 13.6 18.5 L13 21 H11 L10.4 18.5 A8.5 8.5 0 0 1 8 17.5 L5.8 18.8 L4.2 17.2 L5.5 15 A8.5 8.5 0 0 1 4.5 12.6 L2 12 V10 L4.5 9.4 A8.5 8.5 0 0 1 5.5 7 L4.2 4.8 L5.8 3.2 L8 4.5 A8.5 8.5 0 0 1 10.4 3.5 Z M12 7 A4 4 0 1 0 12 15 A4 4 0 1 0 12 7 Z&quot; /&amp;gt;
&amp;lt;/Viewbox&amp;gt;&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;280&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eyp7u/dJMb997eCH8/mqrKMOyYLjyOGsFyPauOZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eyp7u/dJMb997eCH8/mqrKMOyYLjyOGsFyPauOZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eyp7u/dJMb997eCH8/mqrKMOyYLjyOGsFyPauOZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEyp7u%2FdJMb997eCH8%2FmqrKMOyYLjyOGsFyPauOZ1%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;280&quot; height=&quot;226&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;226&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;h4 data-ke-size=&quot;size20&quot;&gt;벡터이미지 가운데 색상 지정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Canvas로 감싼 후 가운데 동그라미는 따로 그려줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777103018884&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Viewbox Margin=&quot;16&quot; Stretch=&quot;Uniform&quot;&amp;gt;
    &amp;lt;Canvas Width=&quot;24&quot; Height=&quot;22&quot;&amp;gt;
        &amp;lt;Path Fill=&quot;DodgerBlue&quot;
              Stroke=&quot;#444444&quot;
              StrokeThickness=&quot;0.5&quot;
              Data=&quot;M12 7 A4 4 0 1 0 12 15 A4 4 0 1 0 12 7 Z&quot; /&amp;gt;
        &amp;lt;Path Fill=&quot;Transparent&quot;
              Stroke=&quot;#444444&quot;
              StrokeThickness=&quot;0.5&quot;
              StrokeLineJoin=&quot;Round&quot;
              Data=&quot;M11 1 H13 L13.6 3.5 A8.5 8.5 0 0 1 16 4.5 L18.2 3.2 L19.8 4.8 L18.5 7 A8.5 8.5 0 0 1 19.5 9.4 L22 10 V12 L19.5 12.6 A8.5 8.5 0 0 1 18.5 15 L19.8 17.2 L18.2 18.8 L16 17.5 A8.5 8.5 0 0 1 13.6 18.5 L13 21 H11 L10.4 18.5 A8.5 8.5 0 0 1 8 17.5 L5.8 18.8 L4.2 17.2 L5.5 15 A8.5 8.5 0 0 1 4.5 12.6 L2 12 V10 L4.5 9.4 A8.5 8.5 0 0 1 5.5 7 L4.2 4.8 L5.8 3.2 L8 4.5 A8.5 8.5 0 0 1 10.4 3.5 Z&quot; /&amp;gt;
    &amp;lt;/Canvas&amp;gt;
&amp;lt;/Viewbox&amp;gt;&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;275&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ByRJD/dJMcabDY4cm/E9ZKhrwJN39aj011hh7Bw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ByRJD/dJMcabDY4cm/E9ZKhrwJN39aj011hh7Bw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ByRJD/dJMcabDY4cm/E9ZKhrwJN39aj011hh7Bw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FByRJD%2FdJMcabDY4cm%2FE9ZKhrwJN39aj011hh7Bw1%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;275&quot; height=&quot;225&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;225&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;h4 data-ke-size=&quot;size20&quot;&gt;TextBlock을 ContentPresenter로 변경&lt;/h4&gt;
&lt;pre id=&quot;code_1777103374024&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ContentPresenter 
           HorizontalAlignment=&quot;Center&quot;
           VerticalAlignment=&quot;Center&quot;
&amp;gt;&amp;lt;/ContentPresenter&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777103388861&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;시스템&quot; FontSize=&quot;17&quot; Foreground=&quot;White&quot; Style=&quot;{StaticResource Button1}&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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: 50%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HBTer/dJMcaffl0HT/YwphtcBFjdzCUxTD45aYg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HBTer/dJMcaffl0HT/YwphtcBFjdzCUxTD45aYg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HBTer/dJMcaffl0HT/YwphtcBFjdzCUxTD45aYg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHBTer%2FdJMcaffl0HT%2FYwphtcBFjdzCUxTD45aYg1%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;265&quot; height=&quot;214&quot; data-origin-width=&quot;265&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzpUVK/dJMcaarygqM/oAacCWdekWxcjKTMRUpXxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzpUVK/dJMcaarygqM/oAacCWdekWxcjKTMRUpXxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzpUVK/dJMcaarygqM/oAacCWdekWxcjKTMRUpXxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzpUVK%2FdJMcaarygqM%2FoAacCWdekWxcjKTMRUpXxk%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;284&quot; height=&quot;208&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&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;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;End.&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2481</guid>
      <comments>https://krksap.tistory.com/2481#entry2481comment</comments>
      <pubDate>Sat, 25 Apr 2026 14:44:22 +0900</pubDate>
    </item>
    <item>
      <title>WPF ContentPresenter - 모양은 Style이 내용은 내가</title>
      <link>https://krksap.tistory.com/2480</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 보면서 하기 위해 Window를 추가 해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXlBvJ/dJMcahjVGyr/nKCriK8t6UHJ3tIUUWVaA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXlBvJ/dJMcahjVGyr/nKCriK8t6UHJ3tIUUWVaA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXlBvJ/dJMcahjVGyr/nKCriK8t6UHJ3tIUUWVaA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXlBvJ%2FdJMcahjVGyr%2FnKCriK8t6UHJ3tIUUWVaA1%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;1094&quot; height=&quot;558&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;558&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777076025567&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Window x:Class=&quot;CdsHelper.Main.Themes.Views.Window1&quot;
        xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
        xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
        xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
        xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
        xmlns:local=&quot;clr-namespace:CdsHelper.Main.Themes.Views&quot;
        mc:Ignorable=&quot;d&quot;
        Title=&quot;Window1&quot; Height=&quot;450&quot; Width=&quot;800&quot;&amp;gt;
&amp;lt;/Window&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;&amp;nbsp;&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;/h3&gt;
&lt;pre id=&quot;code_1777076051391&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Window.Resources&amp;gt;
    &amp;lt;Style x:Key=&quot;Button1&quot; TargetType=&quot;Button&quot;&amp;gt;
        &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;DodgerBlue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/Window.Resources&amp;gt;
&amp;lt;Grid&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;&amp;gt;&amp;lt;/Button&amp;gt;
&amp;lt;/Grid&amp;gt;&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;843&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3uEkk/dJMcagFjEHG/L7grPGpOTGSHBygrwMIKDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3uEkk/dJMcagFjEHG/L7grPGpOTGSHBygrwMIKDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3uEkk/dJMcagFjEHG/L7grPGpOTGSHBygrwMIKDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3uEkk%2FdJMcagFjEHG%2FL7grPGpOTGSHBygrwMIKDk%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;452&quot; height=&quot;263&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;490&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;버튼에 ControlTemplate을 Border로 교체&lt;/h3&gt;
&lt;pre id=&quot;code_1777076170280&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Grid&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;&amp;gt;
        &amp;lt;Button.Template&amp;gt;
            &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot;&amp;gt;&amp;lt;/Border&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Button.Template&amp;gt;
    &amp;lt;/Button&amp;gt;
&amp;lt;/Grid&amp;gt;&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;855&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqVGbP/dJMb990uP9N/uYkBUf5LBPkoTIWWGBFqKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqVGbP/dJMb990uP9N/uYkBUf5LBPkoTIWWGBFqKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqVGbP/dJMb990uP9N/uYkBUf5LBPkoTIWWGBFqKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqVGbP%2FdJMb990uP9N%2FuYkBUf5LBPkoTIWWGBFqKk%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;540&quot; height=&quot;316&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;500&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;/h3&gt;
&lt;pre id=&quot;code_1777076328872&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;&amp;gt;
        &amp;lt;Button.Template&amp;gt;
            &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot;&amp;gt;&amp;lt;/Border&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Button.Template&amp;gt;
    &amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;866&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAhwNu/dJMcahjVGRG/g4Rxq3Dz5mvGBMXAvn2nMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAhwNu/dJMcahjVGRG/g4Rxq3Dz5mvGBMXAvn2nMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAhwNu/dJMcahjVGRG/g4Rxq3Dz5mvGBMXAvn2nMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAhwNu%2FdJMcahjVGRG%2Fg4Rxq3Dz5mvGBMXAvn2nMK%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;657&quot; height=&quot;395&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;520&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;Grid는 전체를 대상으로 하지만 StackPanel은 아닙니다. Grid는 안에 있는 자식 요소를 꽉 채워주지만 StackPanel은 꽉 채우는 개념이 아니기 때문에 Border는 세로 DesiredSize=0이니까 납작해져서 안 보입니다. 그래서 앞에서 했듯이 TextBlock을 넣어주면 TextBlock은 자기 크기의 기본값이 0이 아니기 때문에 표시가 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777076420025&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;&amp;gt;
        &amp;lt;Button.Template&amp;gt;
            &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot;&amp;gt;
                    &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
                &amp;lt;/Border&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Button.Template&amp;gt;
    &amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;1763&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5TL4e/dJMcadBH7nE/t4fmbkkDrbJTw2Y3xLCaHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5TL4e/dJMcadBH7nE/t4fmbkkDrbJTw2Y3xLCaHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5TL4e/dJMcadBH7nE/t4fmbkkDrbJTw2Y3xLCaHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5TL4e%2FdJMcadBH7nE%2Ft4fmbkkDrbJTw2Y3xLCaHK%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;1763&quot; height=&quot;85&quot; data-origin-width=&quot;1763&quot; data-origin-height=&quot;85&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;여러개의 버튼&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ClickMe버튼 아래에 PressMe버튼을 추가 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777076745732&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;&amp;gt;
        &amp;lt;Button.Template&amp;gt;
            &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot;&amp;gt;
                    &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
                &amp;lt;/Border&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Button.Template&amp;gt;
    &amp;lt;/Button&amp;gt;
    &amp;lt;Button Content=&quot;PressMe&quot; Style=&quot;{StaticResource Button1}&quot;&amp;gt;
        &amp;lt;Button.Template&amp;gt;
            &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Border Background=&quot;DarkSlateBlue&quot; CornerRadius=&quot;10&quot;&amp;gt;
                    &amp;lt;TextBlock Text=&quot;PressMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
                &amp;lt;/Border&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Button.Template&amp;gt;
    &amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;1729&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc6nWf/dJMcahYuoUD/YI5m5j3s6G90KRWSRA6uDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc6nWf/dJMcahYuoUD/YI5m5j3s6G90KRWSRA6uDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc6nWf/dJMcahYuoUD/YI5m5j3s6G90KRWSRA6uDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc6nWf%2FdJMcahYuoUD%2FYI5m5j3s6G90KRWSRA6uDK%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;1729&quot; height=&quot;191&quot; data-origin-width=&quot;1729&quot; data-origin-height=&quot;191&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;&amp;nbsp;&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에는 버튼같이 안생겼기 때문에 버튼에 속성을 넣어주겠습니다. Width로 가로 길이를 지정 해주고 텍스트의 가운데 정렬을 위해 TextBlock에 HorizontalAlignment와 VerticalAlignment를 Center로 넣어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777076859708&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;
        Width=&quot;120&quot;&amp;gt;
    &amp;lt;Button.Template&amp;gt;
        &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
            &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot; Padding=&quot;12,6&quot;&amp;gt;
                &amp;lt;TextBlock Text=&quot;ClickMe&quot; HorizontalAlignment=&quot;Center&quot;
                                  VerticalAlignment=&quot;Center&quot;/&amp;gt;
            &amp;lt;/Border&amp;gt;
        &amp;lt;/ControlTemplate&amp;gt;
    &amp;lt;/Button.Template&amp;gt;
&amp;lt;/Button&amp;gt;&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-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVWvBo/dJMcadPgHKu/XIfMe7rPTRQfEy8URjVXrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVWvBo/dJMcadPgHKu/XIfMe7rPTRQfEy8URjVXrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVWvBo/dJMcadPgHKu/XIfMe7rPTRQfEy8URjVXrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVWvBo%2FdJMcadPgHKu%2FXIfMe7rPTRQfEy8URjVXrk%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;300&quot; height=&quot;118&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;118&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;h4 data-ke-size=&quot;size20&quot;&gt;Margin으로 위아래 여백 주기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Margin까지 주면 꽤나 버튼 처럼 보입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777077083155&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;
        Width=&quot;120&quot; Margin=&quot;0,4&quot;&amp;gt;
    &amp;lt;Button.Template&amp;gt;
        &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
            &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot; Padding=&quot;12,6&quot;&amp;gt;
                &amp;lt;TextBlock Text=&quot;ClickMe&quot; HorizontalAlignment=&quot;Center&quot;
                                  VerticalAlignment=&quot;Center&quot;/&amp;gt;
            &amp;lt;/Border&amp;gt;
        &amp;lt;/ControlTemplate&amp;gt;
    &amp;lt;/Button.Template&amp;gt;
&amp;lt;/Button&amp;gt;&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;270&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xYj7J/dJMcafl5w8w/5BnIzEhVaKNWsPUBxHQpT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xYj7J/dJMcafl5w8w/5BnIzEhVaKNWsPUBxHQpT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xYj7J/dJMcafl5w8w/5BnIzEhVaKNWsPUBxHQpT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxYj7J%2FdJMcafl5w8w%2F5BnIzEhVaKNWsPUBxHQpT1%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;270&quot; height=&quot;154&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;154&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;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HorizontalAlignment&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 아까 어색했던 모양을 잡아보겠습니다. TextBlock에 VerticalAlignment=&quot;Center&quot; 를 넣으면 되겠네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crpoiE/dJMcadaEZRG/32vNBwT4zqVINcJ9NwAUKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crpoiE/dJMcadaEZRG/32vNBwT4zqVINcJ9NwAUKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crpoiE/dJMcadaEZRG/32vNBwT4zqVINcJ9NwAUKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrpoiE%2FdJMcadaEZRG%2F32vNBwT4zqVINcJ9NwAUKk%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;421&quot; height=&quot;73&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;73&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;VerticalAlignment를 넣으니 위로 치우쳤던 글자가 가운데로 왔습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ru2XR/dJMcajhFtrf/kXGSokTwAV64vpmzsNcBzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ru2XR/dJMcajhFtrf/kXGSokTwAV64vpmzsNcBzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ru2XR/dJMcajhFtrf/kXGSokTwAV64vpmzsNcBzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fru2XR%2FdJMcajhFtrf%2FkXGSokTwAV64vpmzsNcBzK%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;414&quot; height=&quot;67&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;67&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;TextBlock에 Foreground=&quot;White&quot;를 넣어서 글자를 하얗게 만들어 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oFxAF/dJMcacpme3f/1z9xBxNSmxJ7NakH3Ovhl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oFxAF/dJMcacpme3f/1z9xBxNSmxJ7NakH3Ovhl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oFxAF/dJMcacpme3f/1z9xBxNSmxJ7NakH3Ovhl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoFxAF%2FdJMcacpme3f%2F1z9xBxNSmxJ7NakH3Ovhl1%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;423&quot; height=&quot;59&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;59&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;h4 data-ke-size=&quot;size20&quot;&gt;Margin&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글자가 버튼 안에 너무 딱 붙어있어서 보기 안좋기 때문에 TextBlock기준으로 Margin을 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777077823762&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;TextBlock Text=&quot;파일 열기&quot; Foreground=&quot;White&quot; Margin=&quot;6&quot; VerticalAlignment=&quot;Center&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&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;437&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eMlo1f/dJMcahRH9Pe/ZMFeKB2YfSH2tigiUuHVn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eMlo1f/dJMcahRH9Pe/ZMFeKB2YfSH2tigiUuHVn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eMlo1f/dJMcahRH9Pe/ZMFeKB2YfSH2tigiUuHVn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeMlo1f%2FdJMcahRH9Pe%2FZMFeKB2YfSH2tigiUuHVn0%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;437&quot; height=&quot;68&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;68&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;CornerRadius도 너무 과하기 때문에 3으로 줄여서 네모난 모양을 만들어 줍니다. 동그란 느낌을 유지하고 싶다면 10으로 놔두면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777077942185&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;&amp;gt;
    &amp;lt;Button.Template&amp;gt;
        &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
            &amp;lt;Border Background=&quot;DodgerBlue&quot; CornerRadius=&quot;3&quot;&amp;gt;
                &amp;lt;TextBlock Text=&quot;파일 열기&quot; Foreground=&quot;White&quot; Margin=&quot;6&quot; VerticalAlignment=&quot;Center&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
            &amp;lt;/Border&amp;gt;
        &amp;lt;/ControlTemplate&amp;gt;
    &amp;lt;/Button.Template&amp;gt;
&amp;lt;/Button&amp;gt;&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;432&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/loVqn/dJMcag6mk4j/LzJwpqQ3OAE4W8rfuHK5A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/loVqn/dJMcag6mk4j/LzJwpqQ3OAE4W8rfuHK5A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/loVqn/dJMcag6mk4j/LzJwpqQ3OAE4W8rfuHK5A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FloVqn%2FdJMcag6mk4j%2FLzJwpqQ3OAE4W8rfuHK5A0%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;432&quot; height=&quot;64&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;64&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;/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;p data-ke-size=&quot;size16&quot;&gt;다시 Window로 돌아가보겠습니다. 코드가 길어져서 일단 버튼 하나만 남겼습니다. 스타일을 Window.Resources로 뽑아봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777078057236&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;
            Width=&quot;120&quot; Margin=&quot;0,4&quot;&amp;gt;
        &amp;lt;Button.Template&amp;gt;
            &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot; Padding=&quot;12,6&quot;&amp;gt;
                    &amp;lt;TextBlock Text=&quot;ClickMe&quot; HorizontalAlignment=&quot;Center&quot;
                                      VerticalAlignment=&quot;Center&quot;/&amp;gt;
                &amp;lt;/Border&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Button.Template&amp;gt;
    &amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;291&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD0Rss/dJMcahjVHww/6JjzSCCgsP5turUd3ceH9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD0Rss/dJMcahjVHww/6JjzSCCgsP5turUd3ceH9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD0Rss/dJMcahjVHww/6JjzSCCgsP5turUd3ceH9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD0Rss%2FdJMcahjVHww%2F6JjzSCCgsP5turUd3ceH9K%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;202&quot; height=&quot;57&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;82&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;Template지정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Background의 경우는 한줄로 Value=&quot;Brown&quot;주면 됩니다. 하지만 Template은 값 하나가 아니고 덩어리 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777078610748&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Window.Resources&amp;gt;
    &amp;lt;Style x:Key=&quot;Button1&quot; TargetType=&quot;Button&quot;&amp;gt;
        &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Brown&quot;/&amp;gt;
        &amp;lt;Setter Property=&quot;Template&quot; Value=&quot;{ControlTemplate TargetType=Button}&quot;&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/Window.Resources&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;이만큼 인데 Value=&quot;&quot; 이 한줄로 넣기가 어려운 상황입니다. 이럴 때 &amp;lt;Setter.Value&amp;gt;&amp;lt;/Setter.Value&amp;gt;로 감싸 주는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Before&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777078705427&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button.Template&amp;gt;
    &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
        &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot; Padding=&quot;12,6&quot;&amp;gt;
            &amp;lt;TextBlock Text=&quot;ClickMe&quot; HorizontalAlignment=&quot;Center&quot;
                              VerticalAlignment=&quot;Center&quot;/&amp;gt;
        &amp;lt;/Border&amp;gt;
    &amp;lt;/ControlTemplate&amp;gt;
&amp;lt;/Button.Template&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;After&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Value=&quot;&quot;를 &amp;lt;Setter.Value&amp;gt;&amp;lt;/Setter.Value&amp;gt;로 위아래로 넓게 쓸 수 있게 공간이 확보 되었고 그 안쪽으로 ControlTemplate을 넣어주었습니다. 잘 들어갑니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777078892850&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Style x:Key=&quot;Button1&quot; TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Brown&quot;/&amp;gt;
    &amp;lt;Setter Property=&quot;Template&quot;&amp;gt;
        &amp;lt;Setter.Value&amp;gt;
            &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot; Padding=&quot;12,6&quot;&amp;gt;
                    &amp;lt;TextBlock Text=&quot;PressMe&quot; HorizontalAlignment=&quot;Center&quot;
                                      VerticalAlignment=&quot;Center&quot;/&amp;gt;
                &amp;lt;/Border&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Setter.Value&amp;gt;
    &amp;lt;/Setter&amp;gt;
&amp;lt;/Style&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;&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;/p&gt;
&lt;pre id=&quot;code_1777079065760&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Window.Resources&amp;gt;
    &amp;lt;Style x:Key=&quot;Button1&quot; TargetType=&quot;Button&quot;&amp;gt;
        &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Brown&quot;/&amp;gt;
        &amp;lt;Setter Property=&quot;Template&quot;&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                    &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;10&quot; Padding=&quot;12,6&quot;&amp;gt;
                        &amp;lt;TextBlock Text=&quot;PushMe&quot; HorizontalAlignment=&quot;Center&quot;
                                          VerticalAlignment=&quot;Center&quot;/&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/Window.Resources&amp;gt;
&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Style=&quot;{StaticResource Button1}&quot;
            Width=&quot;120&quot; Margin=&quot;0,4&quot; /&amp;gt;
    &amp;lt;Button Content=&quot;PressMe&quot; Style=&quot;{StaticResource Button1}&quot;
            Width=&quot;120&quot; Margin=&quot;0,4&quot; /&amp;gt;
&amp;lt;/StackPanel&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;버튼을 하나 추가를 했습니다. &amp;lt;Button Content=&quot;ClickMe&quot;/&amp;gt;와 &amp;lt;Button Content=&quot;PushMe&quot;/&amp;gt; 이렇게 두개의 버튼에 스타일이 잘 적용된 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/of4gA/dJMcajvdJVa/7VDJDPSm3XY6pafAQpJUl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/of4gA/dJMcajvdJVa/7VDJDPSm3XY6pafAQpJUl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/of4gA/dJMcajvdJVa/7VDJDPSm3XY6pafAQpJUl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fof4gA%2FdJMcajvdJVa%2F7VDJDPSm3XY6pafAQpJUl1%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;258&quot; height=&quot;117&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 자세히 보시면 몇 가지 정리가 안된 부분이 있습니다. Background=&quot;Brown&quot;이 많이 들어있습니다. Button.Background의 색을 DarkSlateBlue로 바꿔보면 안바뀝니다. 이 속성이 적용되고 있지 않은것입니다. 어디를 바꿔야 하냐면 Border쪽입니다. 그래서 Button쪽은 지우고 Border쪽을 바꿔줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777079177698&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Setter Property=&quot;Background&quot; Value=&quot;DarkSlateBlue&quot;/&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Border Background변경&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 바뀐 것을 볼 수 있습니다. 하지만 문제는 또 있죠. Content입니다. 버튼 Text가 둘 다 PushMe로 보이고 있습니다. 이유는 Style쪽 TextBlock에 PushMe가 두 버튼에 적용되고 있어서 그렇습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777079281064&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Border Background=&quot;DarkSlateBlue&quot; CornerRadius=&quot;10&quot; Padding=&quot;12,6&quot;&amp;gt;
        &amp;lt;TextBlock Text=&quot;PushMe&quot; HorizontalAlignment=&quot;Center&quot;
                          VerticalAlignment=&quot;Center&quot;/&amp;gt;
    &amp;lt;/Border&amp;gt;
&amp;lt;/ControlTemplate&amp;gt;&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;279&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1DgPX/dJMcacpmfGZ/mUj7UFB4P0o80OXibTaihK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1DgPX/dJMcacpmfGZ/mUj7UFB4P0o80OXibTaihK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1DgPX/dJMcacpmfGZ/mUj7UFB4P0o80OXibTaihK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1DgPX%2FdJMcacpmfGZ%2FmUj7UFB4P0o80OXibTaihK%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;279&quot; height=&quot;158&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;158&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;ContentPresenter&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;TextBlock Text=&quot;PushMe&quot; HorizontalAlignment=&quot;Center&quot; VerticalAlignment=&quot;Center&quot;/&amp;gt;에 하드코딩 되어 있던 것을 &amp;lt;ContentPresenter&amp;gt;로 바꿔줍니다. &amp;lt;Button Content=&quot;ClickMe&quot; 그러면 Style은 Style태그에 있는 스타일이 적용 되면서 출력되는 값은 버튼쪽에 선언된 Content가 출력 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777079416806&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Style x:Key=&quot;Button1&quot; TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Setter Property=&quot;Template&quot;&amp;gt;
        &amp;lt;Setter.Value&amp;gt;
            &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Border Background=&quot;DarkSlateBlue&quot; CornerRadius=&quot;10&quot; Padding=&quot;12,6&quot;&amp;gt;
                    &amp;lt;ContentPresenter&amp;gt;&amp;lt;/ContentPresenter&amp;gt;
                &amp;lt;/Border&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Setter.Value&amp;gt;
    &amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;&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;311&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg4jOq/dJMcafflRYs/ERX0ikhRpt03FbKg16EnR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg4jOq/dJMcafflRYs/ERX0ikhRpt03FbKg16EnR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg4jOq/dJMcafflRYs/ERX0ikhRpt03FbKg16EnR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg4jOq%2FdJMcafflRYs%2FERX0ikhRpt03FbKg16EnR0%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;311&quot; height=&quot;161&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;161&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;/p&gt;
&lt;pre id=&quot;code_1777079530465&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ContentPresenter TextElement.Foreground=&quot;White&quot;
	HorizontalAlignment=&quot;Center&quot;
    VerticalAlignment=&quot;Center&quot;&amp;gt;&amp;lt;/ContentPresenter&amp;gt;&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;327&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5iwWQ/dJMcafflR6i/WVcqENzUfr9WFcPgk3kW31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5iwWQ/dJMcafflR6i/WVcqENzUfr9WFcPgk3kW31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5iwWQ/dJMcafflR6i/WVcqENzUfr9WFcPgk3kW31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5iwWQ%2FdJMcafflR6i%2FWVcqENzUfr9WFcPgk3kW31%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;327&quot; height=&quot;165&quot; data-origin-width=&quot;327&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2480</guid>
      <comments>https://krksap.tistory.com/2480#entry2480comment</comments>
      <pubDate>Sat, 25 Apr 2026 09:24:03 +0900</pubDate>
    </item>
    <item>
      <title>WPF Border Radius - Button에 왜 Radius가 없는데?</title>
      <link>https://krksap.tistory.com/2479</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Button의 모서리를 둥그스름하게 만들려면 Radius속성을 주어야 합니다. 하지만 WPF의 버튼은 Radius가 없기 때문에 다른 방법을 써야 합니다.&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;User Control만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;눈으로 보면서 작업 하기 위해 일단 User Control을 하나 만듭니다.&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;1156&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5xaU1/dJMcageebe9/PNgwDTbiWz3juh8DLqpczK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5xaU1/dJMcageebe9/PNgwDTbiWz3juh8DLqpczK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5xaU1/dJMcageebe9/PNgwDTbiWz3juh8DLqpczK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5xaU1%2FdJMcageebe9%2FPNgwDTbiWz3juh8DLqpczK%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;665&quot; height=&quot;377&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;656&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;버튼에 스타일 매핑&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserControl에 Resource로 Style하나 만들어 주고 배경색은 DarkSlateBlue로 합니다. x:Key는 Style1으로 하고 버튼에도 StaticResource로 Style1을 적용 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777049817454&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;UserControl.Resources&amp;gt;
    &amp;lt;Style x:Key=&quot;Style1&quot; TargetType=&quot;Button&quot;&amp;gt;
        &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;DarkSlateBlue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/UserControl.Resources&amp;gt;

&amp;lt;Grid&amp;gt;
    &amp;lt;Button Content=&quot;Button1&quot; Style=&quot;{StaticResource Style1}&quot;&amp;gt;&amp;lt;/Button&amp;gt;
&amp;lt;/Grid&amp;gt;&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;555&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0K0NJ/dJMcabYhWjh/6uCQ4opyPTajKPjpVCpYKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0K0NJ/dJMcabYhWjh/6uCQ4opyPTajKPjpVCpYKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0K0NJ/dJMcabYhWjh/6uCQ4opyPTajKPjpVCpYKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0K0NJ%2FdJMcabYhWjh%2F6uCQ4opyPTajKPjpVCpYKK%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;428&quot; height=&quot;435&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;564&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ControlTemplate&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 드디어 주인공인 ControlTemplate이 나옵니다. &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;0&quot;&gt;ControlTemplate&lt;/b&gt;&lt;span&gt;은 &lt;/span&gt;&lt;b data-index-in-node=&quot;57&quot; data-path-to-node=&quot;0&quot;&gt;컨트롤의 '모든 시각적 구조와 모양'을 정의하는 설계도&lt;/b&gt;&lt;span&gt;입니다. WPF 컨트롤은 &lt;b&gt;기능(Logic)&lt;/b&gt;과 &lt;b&gt;모양(Visual)&lt;/b&gt;이 완벽하게 분리되어 있습니다. ControlTemplate은 오직 '모양'만 담당합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777071232135&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;Button1&quot; Style=&quot;{StaticResource Style1}&quot;&amp;gt;
    &amp;lt;Button.Template&amp;gt;
        &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
            &amp;lt;Border Background=&quot;Brown&quot;&amp;gt;&amp;lt;/Border&amp;gt;
        &amp;lt;/ControlTemplate&amp;gt;
    &amp;lt;/Button.Template&amp;gt;
&amp;lt;/Button&amp;gt;&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;570&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XPEyZ/dJMcafzCTXT/kd3aegxPLCUfMUtTSfKau1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XPEyZ/dJMcafzCTXT/kd3aegxPLCUfMUtTSfKau1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XPEyZ/dJMcafzCTXT/kd3aegxPLCUfMUtTSfKau1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXPEyZ%2FdJMcafzCTXT%2Fkd3aegxPLCUfMUtTSfKau1%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;377&quot; height=&quot;374&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;566&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;h4 data-ke-size=&quot;size20&quot;&gt;Border를 쓴 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 만들었던 버튼 기억 하시나요? 테두리를 넣을려고 Border를 썼지만 글자를 형광펜으로 칠한 효과가 나왔습니다. 이것은 Button의 Content를 Border로 넣은 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777071598218&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
    &amp;lt;Border Background=&quot;Red&quot;&amp;gt;
        &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
    &amp;lt;/Border&amp;gt;
&amp;lt;/Button&amp;gt;&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;801&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bedCKo/dJMcaaE55is/ylRbGhw5V9Mn4trxXkKLn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bedCKo/dJMcaaE55is/ylRbGhw5V9Mn4trxXkKLn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bedCKo/dJMcaaE55is/ylRbGhw5V9Mn4trxXkKLn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbedCKo%2FdJMcaaE55is%2FylRbGhw5V9Mn4trxXkKLn1%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;467&quot; height=&quot;49&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;84&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;그래서 이 부분은 Border의 Content를 TextBlock으로 넣은 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYad4p/dJMcahxruuY/Swj8QqORIALsd5iBb5Ug00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYad4p/dJMcahxruuY/Swj8QqORIALsd5iBb5Ug00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYad4p/dJMcahxruuY/Swj8QqORIALsd5iBb5Ug00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYad4p%2FdJMcahxruuY%2FSwj8QqORIALsd5iBb5Ug00%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;127&quot; height=&quot;50&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;50&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;다음 코드와 동일한 효과 입니다. Button.Content에 Border를 넣은 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777071839925&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;Button&amp;gt;
      &amp;lt;Button.Content&amp;gt;
          &amp;lt;Border Background=&quot;Red&quot;&amp;gt;
              &amp;lt;TextBlock Text=&quot;ClickMe&quot;/&amp;gt;
          &amp;lt;/Border&amp;gt;
      &amp;lt;/Button.Content&amp;gt;
  &amp;lt;/Button&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;Button의 Content를 Border로 넣었듯이 이 코드는 Button의 Template을 Border의 그것으로 바꿉니다. 하지만 Template으로 들어갈 수 있는 타입은 ControlTemplate이기 때문에 ControlTemplate이 들어간 것입니다.&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;CornerRadius&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 드디어 Radius를 줄 차례입니다. CornerRadius를 3을 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777073758978&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;Button1&quot; Style=&quot;{StaticResource Style1}&quot;&amp;gt;
    &amp;lt;Button.Template&amp;gt;
        &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
            &amp;lt;Border Background=&quot;Brown&quot; CornerRadius=&quot;3&quot;&amp;gt;&amp;lt;/Border&amp;gt;
        &amp;lt;/ControlTemplate&amp;gt;
    &amp;lt;/Button.Template&amp;gt;
&amp;lt;/Button&amp;gt;&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;640&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bESguf/dJMcaf0Eyln/W2ZZ0LWxFunBM3FNJmbgK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bESguf/dJMcaf0Eyln/W2ZZ0LWxFunBM3FNJmbgK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bESguf/dJMcaf0Eyln/W2ZZ0LWxFunBM3FNJmbgK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbESguf%2FdJMcaf0Eyln%2FW2ZZ0LWxFunBM3FNJmbgK0%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;519&quot; height=&quot;518&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;639&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지의 오른쪽 위에 하얀 부분이 보이나요? 살짝 둥그스름 해졌습니다. 눈에 확 띄게 하기 위해 10을 주겠습니다. 10이면 눈에 좀 띕니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;639&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuQG6U/dJMcafTVoyf/I0ilKMftFCXk2l1ErLshn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuQG6U/dJMcafTVoyf/I0ilKMftFCXk2l1ErLshn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuQG6U/dJMcafTVoyf/I0ilKMftFCXk2l1ErLshn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuQG6U%2FdJMcafTVoyf%2FI0ilKMftFCXk2l1ErLshn0%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;355&quot; height=&quot;354&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;639&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;/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;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r7toh/dJMcaib3L2l/8QyRuoshbPzZQKH3brv4kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r7toh/dJMcaib3L2l/8QyRuoshbPzZQKH3brv4kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r7toh/dJMcaib3L2l/8QyRuoshbPzZQKH3brv4kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr7toh%2FdJMcaib3L2l%2F8QyRuoshbPzZQKH3brv4kK%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;444&quot; height=&quot;67&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 만들어 놓았던 StaticResource가 Style에 들어가 있습니다. 이걸 빼고 앞전에 적용한 방법으로 Radius를 적용 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777074476342&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot; 
        Style=&quot;{StaticResource BorderRed}&quot;/&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사라진 버튼&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 ControlTemplate을 적용 하면 버튼이 사라집니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777075522388&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;&amp;gt;
    &amp;lt;Button.Template&amp;gt;
        &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
            &amp;lt;Border Background=&quot;DodgerBlue&quot; CornerRadius=&quot;10&quot;&amp;gt;
            &amp;lt;/Border&amp;gt;
        &amp;lt;/ControlTemplate&amp;gt;
    &amp;lt;/Button.Template&amp;gt;
&amp;lt;/Button&amp;gt;&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;335&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/81119/dJMcabDYUS7/3dE48532n50rEk3CbuEjL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/81119/dJMcabDYUS7/3dE48532n50rEk3CbuEjL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/81119/dJMcabDYUS7/3dE48532n50rEk3CbuEjL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F81119%2FdJMcabDYUS7%2F3dE48532n50rEk3CbuEjL1%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;335&quot; height=&quot;81&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;81&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;TextBlock넣어주기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Border안에 TextBlock을 넣어주면 Button에 Radius가 들어갔고 '파일 열기' 글자도 보입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777075643680&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;&amp;gt;
    &amp;lt;Button.Template&amp;gt;
        &amp;lt;ControlTemplate TargetType=&quot;Button&quot;&amp;gt;
            &amp;lt;Border Background=&quot;DodgerBlue&quot; CornerRadius=&quot;10&quot;&amp;gt;
                &amp;lt;TextBlock Text=&quot;파일 열기&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
            &amp;lt;/Border&amp;gt;
        &amp;lt;/ControlTemplate&amp;gt;
    &amp;lt;/Button.Template&amp;gt;
&amp;lt;/Button&amp;gt;&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;416&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw9Jji/dJMcaakLmqw/YxorhwJYNhUTZJ38Lk1RSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw9Jji/dJMcaakLmqw/YxorhwJYNhUTZJ38Lk1RSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw9Jji/dJMcaakLmqw/YxorhwJYNhUTZJ38Lk1RSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw9Jji%2FdJMcaakLmqw%2FYxorhwJYNhUTZJ38Lk1RSK%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;416&quot; height=&quot;62&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;62&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;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2479</guid>
      <comments>https://krksap.tistory.com/2479#entry2479comment</comments>
      <pubDate>Sat, 25 Apr 2026 00:53:31 +0900</pubDate>
    </item>
    <item>
      <title>WPF Button Border - 대충 만든 것 처럼 보이는 버튼 정성스럽게</title>
      <link>https://krksap.tistory.com/2478</link>
      <description>&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;p data-ke-size=&quot;size16&quot;&gt;버튼이 이렇게 기본 값으로 올라가 있으면 요즘은 아무리 잘만든 앱이라도 슥 보고 별로라고 생각을 합니다. 워낙 코드가 쉬워지기도 했으니까요. 그런데 WPF는 현시점 2026년 4월인데 클로드 같은 에이전트가 잘못만드는 것 같습니다.&amp;nbsp;&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;442&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqVLKY/dJMcaf0ErHT/qBTAV9rnA9ud6D6xQVhL0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqVLKY/dJMcaf0ErHT/qBTAV9rnA9ud6D6xQVhL0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqVLKY/dJMcaf0ErHT/qBTAV9rnA9ud6D6xQVhL0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqVLKY%2FdJMcaf0ErHT%2FqBTAV9rnA9ud6D6xQVhL0K%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;442&quot; height=&quot;68&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;68&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Border적용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단은 앞에서 배운 Border를 적용 해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S8ERI/dJMcaiQA7IH/coxK7rMbt1tuEPL7Y0jKPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S8ERI/dJMcaiQA7IH/coxK7rMbt1tuEPL7Y0jKPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S8ERI/dJMcaiQA7IH/coxK7rMbt1tuEPL7Y0jKPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS8ERI%2FdJMcaiQA7IH%2FcoxK7rMbt1tuEPL7Y0jKPK%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;442&quot; height=&quot;68&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;68&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_1777044145789&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnZoomIn&quot; Content=&quot;+&quot; Width=&quot;28&quot; Height=&quot;28&quot; FontSize=&quot;16&quot; FontWeight=&quot;Bold&quot; Margin=&quot;4,0,2,0&quot; ToolTip=&quot;확대&quot;/&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 배운 Border를 주는거죠. 일단은 잘 보이게 빨강으로요.&lt;/p&gt;
&lt;pre id=&quot;code_1777044201871&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnZoomIn&quot; Content=&quot;+&quot; Width=&quot;28&quot; Height=&quot;28&quot; FontSize=&quot;16&quot; FontWeight=&quot;Bold&quot; Margin=&quot;4,0,2,0&quot; ToolTip=&quot;확대&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;Red&quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;
    &amp;lt;/Button.BorderBrush&amp;gt;
&amp;lt;/Button&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2171&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5DOpJ/dJMcagFjxTc/nY8eNtn5tVa0HROyPK2d30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5DOpJ/dJMcagFjxTc/nY8eNtn5tVa0HROyPK2d30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5DOpJ/dJMcagFjxTc/nY8eNtn5tVa0HROyPK2d30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5DOpJ%2FdJMcagFjxTc%2FnY8eNtn5tVa0HROyPK2d30%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;2171&quot; height=&quot;67&quot; data-origin-width=&quot;2171&quot; data-origin-height=&quot;67&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;/p&gt;
&lt;pre id=&quot;code_1777044289175&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;/&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnReloadPalette&quot; Content=&quot;팔레트&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;
        ToolTip=&quot;지도 색상 팔레트를 편집합니다 (컬러 피커 다이얼로그)&quot;/&amp;gt;
&amp;lt;Separator Style=&quot;{StaticResource {x:Static ToolBar.SeparatorStyleKey}}&quot; Margin=&quot;4,2&quot;/&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnZoomIn&quot; Content=&quot;+&quot; Width=&quot;28&quot; Height=&quot;28&quot; FontSize=&quot;16&quot; FontWeight=&quot;Bold&quot; Margin=&quot;4,0,2,0&quot; ToolTip=&quot;확대&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;Red&quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;
    &amp;lt;/Button.BorderBrush&amp;gt;
&amp;lt;/Button&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnZoomOut&quot; Content=&quot;-&quot; Width=&quot;28&quot; Height=&quot;28&quot; FontSize=&quot;16&quot; FontWeight=&quot;Bold&quot; Margin=&quot;2,0,2,0&quot; ToolTip=&quot;축소&quot;/&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnZoomReset&quot; Content=&quot;1:1&quot; Height=&quot;28&quot; Padding=&quot;6,0&quot; Margin=&quot;2,0,6,0&quot; ToolTip=&quot;원본 크기&quot;/&amp;gt;
&amp;lt;Separator Style=&quot;{StaticResource {x:Static ToolBar.SeparatorStyleKey}}&quot; Margin=&quot;4,2&quot;/&amp;gt;
&amp;lt;CheckBox x:Name=&quot;PART_ShowDiscoveries&quot; Content=&quot;발견물&quot; VerticalAlignment=&quot;Center&quot; Margin=&quot;0,0,8,0&quot; IsChecked=&quot;True&quot;/&amp;gt;
&amp;lt;CheckBox x:Name=&quot;PART_ShowCityLabels&quot; Content=&quot;도시명&quot; VerticalAlignment=&quot;Center&quot; Margin=&quot;0,0,8,0&quot;/&amp;gt;
&amp;lt;CheckBox x:Name=&quot;PART_HideFound&quot; Content=&quot;미발견만&quot; VerticalAlignment=&quot;Center&quot; Margin=&quot;0,0,8,0&quot;/&amp;gt;
&amp;lt;CheckBox x:Name=&quot;PART_ShowSpeed&quot; Content=&quot;속도&quot; VerticalAlignment=&quot;Center&quot; Margin=&quot;0,0,8,0&quot; ToolTip=&quot;이동 경로에 구간 속도 표시&quot;/&amp;gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 3개만 적용 했는데 현타 옵니다. 일단 버튼이 많이 남아 있구요 단순히 빨간색 테두리만 쳐놓으면 더 만들다 만 것 같으니까요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1863&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYuC0q/dJMb997ekQW/1lfYYGROhYxUI4woDDxr8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYuC0q/dJMb997ekQW/1lfYYGROhYxUI4woDDxr8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYuC0q/dJMb997ekQW/1lfYYGROhYxUI4woDDxr8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYuC0q%2FdJMb997ekQW%2F1lfYYGROhYxUI4woDDxr8K%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;1863&quot; height=&quot;79&quot; data-origin-width=&quot;1863&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1777044351538&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;Red&quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;
    &amp;lt;/Button.BorderBrush&amp;gt;
&amp;lt;/Button&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnReloadPalette&quot; Content=&quot;팔레트&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;
        ToolTip=&quot;지도 색상 팔레트를 편집합니다 (컬러 피커 다이얼로그)&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;Red&quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;
    &amp;lt;/Button.BorderBrush&amp;gt;
&amp;lt;/Button&amp;gt;
&amp;lt;Separator Style=&quot;{StaticResource {x:Static ToolBar.SeparatorStyleKey}}&quot; Margin=&quot;4,2&quot;/&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnZoomIn&quot; Content=&quot;+&quot; Width=&quot;28&quot; Height=&quot;28&quot; FontSize=&quot;16&quot; FontWeight=&quot;Bold&quot; Margin=&quot;4,0,2,0&quot; ToolTip=&quot;확대&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;Red&quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;
    &amp;lt;/Button.BorderBrush&amp;gt;
&amp;lt;/Button&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;바이브코딩을 당연히 해서 물어보면 되지만 UI작업은 Cost가 엄청 높습니다. 어차피 Max Plan같은거 쓰면 비용이 더 늘어나진 않는데 시간이 오래걸려요. 이 간단한것 답변 하는데 27초가 뭡니까 토큰도 1000개 넘게 썼네요. 토큰 문제가 아니고 우리에게 시간은 곧 비용입니다. 물론 인터넷 서칭 해서 하는것에 비하면 빠른데 점점 딮하고 깔끔하게 들어갈 수록 이 비용이 증가 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7VJkg/dJMcagrJZJW/qAMwBMtJaTEZFQ8ToYsrRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7VJkg/dJMcagrJZJW/qAMwBMtJaTEZFQ8ToYsrRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7VJkg/dJMcagrJZJW/qAMwBMtJaTEZFQ8ToYsrRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7VJkg%2FdJMcagrJZJW%2FqAMwBMtJaTEZFQ8ToYsrRk%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;1491&quot; height=&quot;490&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;490&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스타일 선언 하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 앞에서 했던 것 처럼 스타일로 뽑아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 지금 고치는 기능은 ResourceDictionary라고 CustomControl로 정의한 MenuBar입니다. Style 설명 하고 있으니까 여기에서는 ResourceDictionary에서 다루지는 않습니다. 바로 스타일 선언 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777044640132&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ResourceDictionary xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
                    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
                    xmlns:views=&quot;clr-namespace:CdsHelper.Main.UI.Views&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 써봤던 x:Key로 BorderRed로 선언 해줍니다. 그리고 버튼에 붙일것이기 때문에 TargetType을 버튼으로 넣어 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777044748303&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Style x:Key=&quot;BorderRed&quot; TargetType=&quot;Button&quot;&amp;gt;&amp;lt;/Style&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스타일 적용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 버튼에 스타일을 적용 해줍니다. 파일 열기 버튼입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Aefore&lt;/p&gt;
&lt;pre id=&quot;code_1777044887859&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;Red&quot;&amp;gt;&amp;lt;/SolidColorBrush&amp;gt;
    &amp;lt;/Button.BorderBrush&amp;gt;
&amp;lt;/Button&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;After&lt;/p&gt;
&lt;pre id=&quot;code_1777044930688&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot; 
        Style=&quot;{StaticResource BorderRed}&quot;/&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;span style=&quot;color: #006dd7;&quot;&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;333&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djwmw5/dJMcajhFlaJ/xehWhcwgrvA0fHR9BAjS30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djwmw5/dJMcajhFlaJ/xehWhcwgrvA0fHR9BAjS30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djwmw5/dJMcajhFlaJ/xehWhcwgrvA0fHR9BAjS30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdjwmw5%2FdJMcajhFlaJ%2FxehWhcwgrvA0fHR9BAjS30%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;333&quot; height=&quot;71&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;71&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;color: #006dd7;&quot;&gt;파란색&lt;/span&gt; 글자가 비슷한 색을 찾아보니 DodgerBlue라서 적용 해보았습니다. 테두리가 파란색으로 바뀌었습니다. 나머지 버튼들에도 적용 해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777045099627&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Style x:Key=&quot;BorderRed&quot; TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Setter Property=&quot;BorderBrush&quot; Value=&quot;DodgerBlue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;&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;435&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0cdKp/dJMcaaSCEIt/wEbxkhv6mKBJoO99KUAUvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0cdKp/dJMcaaSCEIt/wEbxkhv6mKBJoO99KUAUvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0cdKp/dJMcaaSCEIt/wEbxkhv6mKBJoO99KUAUvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0cdKp%2FdJMcaaSCEIt%2FwEbxkhv6mKBJoO99KUAUvk%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;435&quot; height=&quot;66&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;66&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Style=하고 StaticResource로 BorderRed지정 했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777045407180&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button x:Name=&quot;PART_BtnOpen&quot; Content=&quot;파일 열기&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot; 
        Style=&quot;{StaticResource BorderRed}&quot;/&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnReloadPalette&quot; Content=&quot;팔레트&quot; Padding=&quot;8,4&quot; Margin=&quot;0,0,6,0&quot;
        ToolTip=&quot;지도 색상 팔레트를 편집합니다 (컬러 피커 다이얼로그)&quot; 
        Style=&quot;{StaticResource BorderRed}&quot;/&amp;gt;
&amp;lt;Separator Style=&quot;{StaticResource {x:Static ToolBar.SeparatorStyleKey}}&quot; Margin=&quot;4,2&quot;/&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnZoomIn&quot; Content=&quot;+&quot; Width=&quot;28&quot; Height=&quot;28&quot; FontSize=&quot;16&quot; FontWeight=&quot;Bold&quot; Margin=&quot;4,0,2,0&quot; ToolTip=&quot;확대&quot;
        Style=&quot;{StaticResource BorderRed}&quot;/&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnZoomOut&quot; Content=&quot;-&quot; Width=&quot;28&quot; Height=&quot;28&quot; FontSize=&quot;16&quot; FontWeight=&quot;Bold&quot; Margin=&quot;2,0,2,0&quot; ToolTip=&quot;축소&quot;
        Style=&quot;{StaticResource BorderRed}&quot;/&amp;gt;
&amp;lt;Button x:Name=&quot;PART_BtnZoomReset&quot; Content=&quot;1:1&quot; Height=&quot;28&quot; Padding=&quot;6,0&quot; Margin=&quot;2,0,6,0&quot; ToolTip=&quot;원본 크기&quot;
        Style=&quot;{StaticResource BorderRed}&quot; /&amp;gt;&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;2177&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8DPSO/dJMb99TGwcr/XhWZfDHxPfl5KqJgxPDKs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8DPSO/dJMb99TGwcr/XhWZfDHxPfl5KqJgxPDKs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8DPSO/dJMb99TGwcr/XhWZfDHxPfl5KqJgxPDKs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8DPSO%2FdJMb99TGwcr%2FXhWZfDHxPfl5KqJgxPDKs1%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;2177&quot; height=&quot;116&quot; data-origin-width=&quot;2177&quot; data-origin-height=&quot;116&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배경 칠하기 - Background&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼에 테두리만 칠한다고 UI가 갑자기 성의있어보이진 않습니다. 아직도 되는대로 만든 것 같죠? 배경도 깔아보겠습니다. 배경은 Background속성입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777045527181&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Style x:Key=&quot;BorderRed&quot; TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Setter Property=&quot;BorderBrush&quot; Value=&quot;DodgerBlue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;DodgerBlue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;&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;2181&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eu7CCK/dJMcajvdBhv/3bk3Y1tbKos19cbVGDoC71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eu7CCK/dJMcajvdBhv/3bk3Y1tbKos19cbVGDoC71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eu7CCK/dJMcajvdBhv/3bk3Y1tbKos19cbVGDoC71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feu7CCK%2FdJMcajvdBhv%2F3bk3Y1tbKos19cbVGDoC71%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;2181&quot; height=&quot;116&quot; data-origin-width=&quot;2181&quot; data-origin-height=&quot;116&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;네 좀 나아 졌나요? 아직 별로입니다. 조금 예쁜 버튼이 있습니다.&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;1115&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/saOAP/dJMcajaTYDx/0BPOcpN4pNQ0vapetdcrmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/saOAP/dJMcajaTYDx/0BPOcpN4pNQ0vapetdcrmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/saOAP/dJMcajaTYDx/0BPOcpN4pNQ0vapetdcrmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsaOAP%2FdJMcajaTYDx%2F0BPOcpN4pNQ0vapetdcrmk%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;723&quot; height=&quot;37&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;57&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;살펴보니 다음 3가지 특성이 있네요.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모서리를 둥글게 해주고&lt;/li&gt;
&lt;li&gt;색이 조금 진하고&lt;/li&gt;
&lt;li&gt;글자가 하얀색&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스타일을 공통으로 뽑아 놓으니 한번에 넣어볼 수 있겠죠? 하지만 1번 모서리를 둥글게 하는건 Border Radius인데 아쉽게도 Button은 Radius속성이 없습니다. 일단 글자색 Foreground부터 흰색으로 바꿔보죠.&lt;/p&gt;
&lt;pre id=&quot;code_1777046830431&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Style x:Key=&quot;BorderRed&quot; TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Setter Property=&quot;BorderBrush&quot; Value=&quot;DodgerBlue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;DodgerBlue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;Setter Property=&quot;Foreground&quot; Value=&quot;AliceBlue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;&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;2168&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/INtuY/dJMcabYhVxs/bfGbKHi7bEQkH4K8XIfU60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/INtuY/dJMcabYhVxs/bfGbKHi7bEQkH4K8XIfU60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/INtuY/dJMcabYhVxs/bfGbKHi7bEQkH4K8XIfU60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FINtuY%2FdJMcabYhVxs%2FbfGbKHi7bEQkH4K8XIfU60%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;2168&quot; height=&quot;115&quot; data-origin-width=&quot;2168&quot; data-origin-height=&quot;115&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;잘 바뀌었고 조금은 자연스러운 모양이 되었습니다. Radius는 다음 포스에서 계속.&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2478</guid>
      <comments>https://krksap.tistory.com/2478#entry2478comment</comments>
      <pubDate>Sat, 25 Apr 2026 00:53:09 +0900</pubDate>
    </item>
    <item>
      <title>WPF Border - 제품과 습작 차이는 디테일에서</title>
      <link>https://krksap.tistory.com/2477</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Border&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Border는 경계죠 멋진 버튼과 제품과 습작을 구분 짓는 경계이기도 합니다. 잘 넣으면 제품이 되고 대충 넣으면 습작이죠.&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;다음과 같이 ClickMe버튼에 빨간 Border를 넣으려고 했지만 안됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777042446879&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
    &amp;lt;Border Background=&quot;Red&quot;&amp;gt;&amp;lt;/Border&amp;gt;
&amp;lt;/Button&amp;gt;&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;621&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vREq0/dJMcadhulUN/UCcTyjhIhNZ6ulqAjDdGe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vREq0/dJMcadhulUN/UCcTyjhIhNZ6ulqAjDdGe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vREq0/dJMcadhulUN/UCcTyjhIhNZ6ulqAjDdGe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvREq0%2FdJMcadhulUN%2FUCcTyjhIhNZ6ulqAjDdGe0%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;475&quot; height=&quot;359&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;469&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;Property Content is set more than once 프로퍼티 속성은 한개밖에 못넣는답니다. 앞에 Resoruces에는 Style도 두개 들어가고 StackPanel은 Button두개에 TextBlock까지 들어가는데 버튼에는 Border하나가 안들어가죠.&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;그래서 Button에 Border를 넣는 방법은 다음과 같이 Border를 넣고 Button에 있던 Content를 빼고 TextBlock을 넣는 방법이 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777042676576&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
    &amp;lt;Border Background=&quot;Red&quot;&amp;gt;
        &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
    &amp;lt;/Border&amp;gt;
&amp;lt;/Button&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4BdNw/dJMcaayjIlQ/oFwOVENpLN3krs5h1NZg0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4BdNw/dJMcaayjIlQ/oFwOVENpLN3krs5h1NZg0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4BdNw/dJMcaayjIlQ/oFwOVENpLN3krs5h1NZg0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4BdNw%2FdJMcaayjIlQ%2FoFwOVENpLN3krs5h1NZg0K%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;487&quot; height=&quot;52&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;52&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;그래서 Border를 넣으려면 BorderThickness와 BorderBrush를 써야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777042798009&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button BorderThickness=&quot;1&quot; BorderBrush=&quot;Red&quot;
    Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
    &amp;lt;TextBlock Text=&quot;ClickMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;/Button&amp;gt;&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;958&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r0LWM/dJMcadV3qH0/YKKGk2cX5pSJsbaPK3l8sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r0LWM/dJMcadV3qH0/YKKGk2cX5pSJsbaPK3l8sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r0LWM/dJMcadV3qH0/YKKGk2cX5pSJsbaPK3l8sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr0LWM%2FdJMcadV3qH0%2FYKKGk2cX5pSJsbaPK3l8sk%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;577&quot; height=&quot;53&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Border하나 넣기 참 힘들죠? 요즘같이 바이브코딩으로 프롬프트로 때려 넣는 시대에 Border한땀 한땀 깎고 있으면 여태 줄 한바퀴 넣었다고 팀장님이 뭐라 할 수도 있는 딜레마가 있습니다. 하지만 Border는 정말 중요합니다.&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Border에 그라데이션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백마에 까만 줄무늬를 넣으면 얼룩말이죠. 버튼이 갑자기 있어보이는 시점이 그라데이션을 넣는 시점부터입니다. 이 기능 때문에 WPF를 쓰는게 아닌가 싶을 정도 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777043234405&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;GradationBorderButton&quot; Margin=&quot;15&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
        &amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;1,0&quot;&amp;gt;
            &amp;lt;GradientStop Color=&quot;#FF6B9D&quot; Offset=&quot;0&quot;/&amp;gt;
            &amp;lt;GradientStop Color=&quot;#4A90E2&quot; Offset=&quot;1&quot;/&amp;gt;
        &amp;lt;/LinearGradientBrush&amp;gt; 
    &amp;lt;/Button.BorderBrush&amp;gt;
&amp;lt;/Button&amp;gt;&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;1442&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uf4F6/dJMcajooyTY/dGq8qqzsVZp6GN1KXHeD1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uf4F6/dJMcajooyTY/dGq8qqzsVZp6GN1KXHeD1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uf4F6/dJMcajooyTY/dGq8qqzsVZp6GN1KXHeD1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuf4F6%2FdJMcajooyTY%2FdGq8qqzsVZp6GN1KXHeD1K%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;1442&quot; height=&quot;132&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;132&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;앞에 코드에서 BorderBursh라는 속성을 썼었죠? 이게 Inline에 들어가 있던 것을 자세히 작성 하기 위해서 블럭으로 빼주는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777043339574&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button BorderThickness=&quot;1&quot; BorderBrush=&quot;Red&quot;&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;BorderBrush인라인 속성을 지우고 하위 블럭으로 뺍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777043395444&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;GradationBorderButton&quot; Margin=&quot;15&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
    &amp;lt;/Button.BorderBrush&amp;gt;
&amp;lt;/Button&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에 빨간 테두리는 다음과 같이 재현 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777043651887&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button BorderThickness=&quot;1&quot;
    Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
    &amp;lt;Button.BorderBrush&amp;gt;
        &amp;lt;SolidColorBrush Color=&quot;Red&quot;/&amp;gt;
    &amp;lt;/Button.BorderBrush&amp;gt;
    &amp;lt;TextBlock Text=&quot;PressMe&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;/Button&amp;gt;&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;1377&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLZuID/dJMcaad0Raz/8KqK7KaxBxstGejhYp5YFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLZuID/dJMcaad0Raz/8KqK7KaxBxstGejhYp5YFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLZuID/dJMcaad0Raz/8KqK7KaxBxstGejhYp5YFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLZuID%2FdJMcaad0Raz%2F8KqK7KaxBxstGejhYp5YFk%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;675&quot; height=&quot;62&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;126&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;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2477</guid>
      <comments>https://krksap.tistory.com/2477#entry2477comment</comments>
      <pubDate>Sat, 25 Apr 2026 00:15:06 +0900</pubDate>
    </item>
    <item>
      <title>WPF Style - 버튼 두개 보이고 스타일 여러버튼에 적용하기</title>
      <link>https://krksap.tistory.com/2476</link>
      <description>&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사라진 ClickMe&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ClickMe가 사라졌죠? 처음에는 PressMe가 안나오는 줄 알았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777040734876&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Grid&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot;&amp;gt;
        &amp;lt;Button.Style&amp;gt;
            &amp;lt;Style TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Black&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
            &amp;lt;/Style&amp;gt;
        &amp;lt;/Button.Style&amp;gt;
    &amp;lt;/Button&amp;gt;
    &amp;lt;Button Content=&quot;PressMe&quot; Margin=&quot;15&quot;&amp;gt;

    &amp;lt;/Button&amp;gt;
&amp;lt;/Grid&amp;gt;&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;556&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMKCmm/dJMcajhFj7s/zgD2vebQOjySIuAMl7qP81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMKCmm/dJMcajhFj7s/zgD2vebQOjySIuAMl7qP81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMKCmm/dJMcajhFj7s/zgD2vebQOjySIuAMl7qP81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMKCmm%2FdJMcajhFj7s%2FzgD2vebQOjySIuAMl7qP81%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;338&quot; height=&quot;340&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;559&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;문제는 Grid가 문제였구요 Grid에서 뒤에 나온게 앞에 나온 것을 덮어버린 것이죠.&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;lt;Grid&amp;gt;를 &amp;lt;StakePanel&amp;gt;로 바꾸니까 둘다 나오기 시작 했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777040856672&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot;&amp;gt;
        &amp;lt;Button.Style&amp;gt;
            &amp;lt;Style TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Black&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
            &amp;lt;/Style&amp;gt;
        &amp;lt;/Button.Style&amp;gt;
    &amp;lt;/Button&amp;gt;
    &amp;lt;Button Content=&quot;PressMe&quot; Margin=&quot;15&quot;&amp;gt;

    &amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;564&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCxSH8/dJMcacJF89i/PHRBPu5QuLJpyVmwqvHbnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCxSH8/dJMcacJF89i/PHRBPu5QuLJpyVmwqvHbnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCxSH8/dJMcacJF89i/PHRBPu5QuLJpyVmwqvHbnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCxSH8%2FdJMcacJF89i%2FPHRBPu5QuLJpyVmwqvHbnK%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;422&quot; height=&quot;421&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;563&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;버튼 두개에 같은 스타일 적용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 지금 버튼 두개인데 버튼마다 스타일을 주기 불편하죠 스타일 하나 정해서 쓰고 싶다는거죠. 다음과 같이 버튼의 배경을 Black, Blue로 주는 경우는 그냥 주면 되는데 스타일 하나 주는데 7줄씩 들어갑니다. 나중에 디테일하게 들어가면 감당이 안되죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777040972763&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot;&amp;gt;
        &amp;lt;Button.Style&amp;gt;
            &amp;lt;Style TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Black&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
            &amp;lt;/Style&amp;gt;
        &amp;lt;/Button.Style&amp;gt;
    &amp;lt;/Button&amp;gt;
    &amp;lt;Button Content=&quot;PressMe&quot; Margin=&quot;15&quot;&amp;gt;
        &amp;lt;Button.Style&amp;gt;
            &amp;lt;Style TargetType=&quot;Button&quot;&amp;gt;
                &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Blue&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
            &amp;lt;/Style&amp;gt;
        &amp;lt;/Button.Style&amp;gt;
    &amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;578&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dclSdq/dJMcacv8I5i/qHuEX8jYu7ojVbPFJ7PQZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dclSdq/dJMcacv8I5i/qHuEX8jYu7ojVbPFJ7PQZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dclSdq/dJMcacv8I5i/qHuEX8jYu7ojVbPFJ7PQZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdclSdq%2FdJMcacv8I5i%2FqHuEX8jYu7ojVbPFJ7PQZ1%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;417&quot; height=&quot;426&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;590&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;x:Key로&amp;nbsp;명명&amp;nbsp;후&amp;nbsp;StaticResource로&amp;nbsp;참조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x:Key는 Resource의 이름이라고 할 수 있습니다. 아래에서는 UserControl.Resources를 이용해 리소스를 선언을 하는데요 여기에서 그 이름이 x:Key 되겠습니다. ButtonBackground라는 이름으로 x:Key를 지정 했습니다. 그리고 Button의 Style속성에 StaticResource에 지정을 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777041283721&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;UserControl.Resources&amp;gt;
    &amp;lt;Style x:Key=&quot;ButtonBackground&quot;&amp;gt;
        &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Pink&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/UserControl.Resources&amp;gt;

&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
    &amp;lt;/Button&amp;gt;
    &amp;lt;Button Content=&quot;PressMe&quot; Margin=&quot;15&quot;&amp;gt;
    &amp;lt;/Button&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;634&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyiwug/dJMb990uHQ9/FD3FpSmYvfwJfBFeZImOG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyiwug/dJMb990uHQ9/FD3FpSmYvfwJfBFeZImOG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyiwug/dJMb990uHQ9/FD3FpSmYvfwJfBFeZImOG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feyiwug%2FdJMb990uHQ9%2FFD3FpSmYvfwJfBFeZImOG0%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;574&quot; height=&quot;212&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;234&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;Pink색이 적용이 되어야 하는데 안되고있죠?&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TargetType&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TargetType을 안줘서 그렇습니다. TargetType=&quot;Button&quot; 이걸 빼먹어서요.&lt;/p&gt;
&lt;pre id=&quot;code_1777041518451&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Style x:Key=&quot;ButtonBackground&quot; TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Pink&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;&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;619&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctaJUj/dJMcagFjw4b/RPRtwylVd5ESPb14vOMzCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctaJUj/dJMcagFjw4b/RPRtwylVd5ESPb14vOMzCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctaJUj/dJMcagFjw4b/RPRtwylVd5ESPb14vOMzCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctaJUj%2FdJMcagFjw4b%2FRPRtwylVd5ESPb14vOMzCK%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;619&quot; height=&quot;218&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Html, Css였으면 그냥 됐을 수도 있는데 WPF는 꽤 정교해서 그런거 없습니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때문에 다음과 같이 TextBlock이 하나 있는데 여기에 배경을 또한 Pink로 넣고 싶을 때 앞에서 선언한 ButtonBackground를 못 쓰겠죠? 왜냐하면 TargetType이 Button이니까요. 이것은 입문에는 단점일 수 있지만 앱이 고도화 되면 장점 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777041654841&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
&amp;lt;/Button&amp;gt;
&amp;lt;Button Content=&quot;PressMe&quot; Margin=&quot;15&quot;&amp;gt;
&amp;lt;/Button&amp;gt;
&amp;lt;TextBlock Text=&quot;Bye&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&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;609&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPt62C/dJMcagyuDgW/39IEtf4B2ku1BeTmjNzT21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPt62C/dJMcagyuDgW/39IEtf4B2ku1BeTmjNzT21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPt62C/dJMcagyuDgW/39IEtf4B2ku1BeTmjNzT21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPt62C%2FdJMcagyuDgW%2F39IEtf4B2ku1BeTmjNzT21%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;609&quot; height=&quot;270&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;270&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;&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;&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;같은 속성을 다른 TargetType으로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 코드에서는 UserControl.Resource에 Background라는 스타일을 추가 했습니다. 이름이 Background인데 옆에 TargetType이 있으니까 이름을 꽤 단순하게 정해도 정확한 위치에 넣을 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777041793310&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;UserControl.Resources&amp;gt;
    &amp;lt;Style x:Key=&quot;ButtonBackground&quot; TargetType=&quot;Button&quot;&amp;gt;
        &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Pink&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
    &amp;lt;Style x:Key=&quot;Background&quot; TargetType=&quot;TextBlock&quot;&amp;gt;
        &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Pink&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/UserControl.Resources&amp;gt;

&amp;lt;StackPanel&amp;gt;
    &amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
    &amp;lt;/Button&amp;gt;
    &amp;lt;Button Content=&quot;PressMe&quot; Margin=&quot;15&quot;&amp;gt;
    &amp;lt;/Button&amp;gt;
    &amp;lt;TextBlock Text=&quot;Bye&quot; Style=&quot;{StaticResource Background}&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;
&amp;lt;/StackPanel&amp;gt;&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;628&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3GlDq/dJMcafNa7Mm/zrjaxn4l6Dopn9fj1JJe1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3GlDq/dJMcafNa7Mm/zrjaxn4l6Dopn9fj1JJe1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3GlDq/dJMcafNa7Mm/zrjaxn4l6Dopn9fj1JJe1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3GlDq%2FdJMcafNa7Mm%2Fzrjaxn4l6Dopn9fj1JJe1k%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;628&quot; height=&quot;296&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;296&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;x:Key 중복은 불허한다&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음과 같이 TargetType이 다르면 중복이 될 것 같지만 안됩니다. 불가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777041955347&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Style x:Key=&quot;Background&quot; TargetType=&quot;Button&quot;&amp;gt;
    &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Pink&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;
&amp;lt;Style x:Key=&quot;Background&quot; TargetType=&quot;TextBlock&quot;&amp;gt;
    &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Pink&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TargetType이 안맞는 것도 불허 합니다. ButtonBackground는 TargetType이 Button이기 때문에 TextBlock에는 바인딩이 안되는바입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777042043391&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;
&amp;lt;/Button&amp;gt;
&amp;lt;Button Content=&quot;PressMe&quot; Margin=&quot;15&quot;&amp;gt;
&amp;lt;/Button&amp;gt;
&amp;lt;TextBlock Text=&quot;Bye&quot; Style=&quot;{StaticResource ButtonBackground}&quot;&amp;gt;&amp;lt;/TextBlock&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2476</guid>
      <comments>https://krksap.tistory.com/2476#entry2476comment</comments>
      <pubDate>Fri, 24 Apr 2026 23:46:36 +0900</pubDate>
    </item>
    <item>
      <title>WPF UserControl에 버튼 만들고 스타일 정의</title>
      <link>https://krksap.tistory.com/2475</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 바이브코딩으로 죄다 만들어서 한땀한땀 코딩하는 수요가 많이 줄었습니다. 하지만 고객이 쓸 제품의 디테일을 잡을 때는 결국 인간 손이 필요하구요 숙련자가 딸깍이면 되는거 AI로 한시간쯤 이거 아니고 저렇게고 이게 아니고 저부분이고 이런식으로 설명해서 떡져있지만 돌아가는 코드 하나 얻을 수 있는 경우도 있습니다. 그래서 코딩이 아직 의미가 있구요.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserControl을 만들어야 위지윅으로 보면서 만들 수 있습니다. 익숙하기 전부터 CustomControl로 넘어가면 손에 익히기도 전에 기능으로 추상화로 넘어가니까 어질어질 합니다.&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UserControl만들기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsSWXL/dJMcahKYshr/zKXDMdez5iGfMbHjFt62H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsSWXL/dJMcahKYshr/zKXDMdez5iGfMbHjFt62H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsSWXL/dJMcahKYshr/zKXDMdez5iGfMbHjFt62H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsSWXL%2FdJMcahKYshr%2FzKXDMdez5iGfMbHjFt62H0%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;476&quot; height=&quot;256&quot; data-origin-width=&quot;476&quot; data-origin-height=&quot;256&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HhiUY/dJMcac3VAlC/gNfeBVg2zyZfi3LtsKBzck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HhiUY/dJMcac3VAlC/gNfeBVg2zyZfi3LtsKBzck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HhiUY/dJMcac3VAlC/gNfeBVg2zyZfi3LtsKBzck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHhiUY%2FdJMcac3VAlC%2FgNfeBVg2zyZfi3LtsKBzck%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;555&quot; height=&quot;144&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;144&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;1343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chpkYi/dJMcacJF8Pe/GrNyixSqZoGpvhQp1gQWek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chpkYi/dJMcacJF8Pe/GrNyixSqZoGpvhQp1gQWek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chpkYi/dJMcacJF8Pe/GrNyixSqZoGpvhQp1gQWek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchpkYi%2FdJMcacJF8Pe%2FGrNyixSqZoGpvhQp1gQWek%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;1902&quot; height=&quot;1343&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;1343&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Margin&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 많이 쓰는 Margin입니다. 버튼의 바깥쪽에 여백을 주는 기능입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777040222546&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot; /&amp;gt;&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;544&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vr9jk/dJMcahjVyp8/8BKzkPlZMV4DTOgkrkSCk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vr9jk/dJMcahjVyp8/8BKzkPlZMV4DTOgkrkSCk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vr9jk/dJMcahjVyp8/8BKzkPlZMV4DTOgkrkSCk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVr9jk%2FdJMcahjVyp8%2F8BKzkPlZMV4DTOgkrkSCk0%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;338&quot; height=&quot;343&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;552&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;Background&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 하나에 스타일을 줄 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1777040532529&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Button Content=&quot;ClickMe&quot; Margin=&quot;20&quot;&amp;gt;
    &amp;lt;Button.Style&amp;gt;
        &amp;lt;Style TargetType=&quot;Button&quot;&amp;gt;
            &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Black&quot;&amp;gt;&amp;lt;/Setter&amp;gt;
        &amp;lt;/Style&amp;gt;
    &amp;lt;/Button.Style&amp;gt;
&amp;lt;/Button&amp;gt;&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;567&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgpygY/dJMcacv8IYa/hx4HmHAAkJknCaqKoPIkt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgpygY/dJMcacv8IYa/hx4HmHAAkJknCaqKoPIkt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgpygY/dJMcacv8IYa/hx4HmHAAkJknCaqKoPIkt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgpygY%2FdJMcacv8IYa%2Fhx4HmHAAkJknCaqKoPIkt1%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;364&quot; height=&quot;361&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2475</guid>
      <comments>https://krksap.tistory.com/2475#entry2475comment</comments>
      <pubDate>Fri, 24 Apr 2026 23:24:59 +0900</pubDate>
    </item>
    <item>
      <title>WPF 창 크기, 시작위치 조정</title>
      <link>https://krksap.tistory.com/2472</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기 1024*768&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작위치 0, 0&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;2044&quot; data-origin-height=&quot;1527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzEjcK/dJMcafGluEo/Yiw1ae1Dyvk4kTiNXuAWr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzEjcK/dJMcafGluEo/Yiw1ae1Dyvk4kTiNXuAWr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzEjcK/dJMcafGluEo/Yiw1ae1Dyvk4kTiNXuAWr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzEjcK%2FdJMcafGluEo%2FYiw1ae1Dyvk4kTiNXuAWr0%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;2044&quot; height=&quot;1527&quot; data-origin-width=&quot;2044&quot; data-origin-height=&quot;1527&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_1776820225751&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Windows;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using KrkTemplateProject.Forms;
using KrkTemplateProject.Forms.UI.Views;
using KrkTemplateProject.Forms.ViewModels;

namespace KrkTemplateProject;

public class App : Application
{
    private IHost? _host;

    public static IServiceProvider? ServiceProvider { get; private set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        _host = Host.CreateDefaultBuilder()
            .ConfigureServices((context, services) =&amp;gt;
            {
                ConfigureServices(services);
            })
            .Build();

        ServiceProvider = _host.Services;
        AppServices.Current = _host.Services;

        var mainWindow = ServiceProvider.GetRequiredService&amp;lt;MainWindow&amp;gt;();
        mainWindow.WindowStartupLocation = WindowStartupLocation.Manual;
        mainWindow.Left = 0;
        mainWindow.Top = 0;
        mainWindow.Width = 1024;
        mainWindow.Height = 768;
        mainWindow.Show();
    }

    protected override void OnExit(ExitEventArgs e)
    {
        _host?.Dispose();
        base.OnExit(e);
    }

    private void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton&amp;lt;MainWindowViewModel&amp;gt;();
        services.AddSingleton&amp;lt;MainWindow&amp;gt;();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2472</guid>
      <comments>https://krksap.tistory.com/2472#entry2472comment</comments>
      <pubDate>Wed, 22 Apr 2026 10:11:15 +0900</pubDate>
    </item>
    <item>
      <title>PowerShell에 git branch보이게 하기</title>
      <link>https://krksap.tistory.com/2471</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerShell에서 git branch가 표시 되도록 기능 추가 하는 방법&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;p data-ke-size=&quot;size16&quot;&gt;프롬프트&amp;nbsp;정보&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;브랜치명&amp;nbsp;표시&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;+2&amp;nbsp;~1&amp;nbsp;-0&amp;nbsp;형태로&amp;nbsp;staged/modified/deleted&amp;nbsp;파일&amp;nbsp;수&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;!2&amp;nbsp;untracked&amp;nbsp;파일&amp;nbsp;수&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;uarr;2&amp;nbsp;&amp;darr;1&amp;nbsp;remote와의&amp;nbsp;ahead/behind&amp;nbsp;커밋&amp;nbsp;수&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Tab&amp;nbsp;자동완성&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;git&amp;nbsp;ch&amp;nbsp;+&amp;nbsp;Tab&amp;nbsp;&amp;rarr;&amp;nbsp;checkout,&amp;nbsp;cherry-pick&amp;nbsp;등&amp;nbsp;자동완성&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;브랜치명&amp;nbsp;자동완성:&amp;nbsp;git&amp;nbsp;checkout&amp;nbsp;&amp;nbsp;+&amp;nbsp;Tab&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;원격&amp;nbsp;브랜치,&amp;nbsp;태그,&amp;nbsp;스태시&amp;nbsp;이름도&amp;nbsp;자동완성&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;프롬프트&amp;nbsp;예시&lt;br /&gt;&amp;nbsp;&amp;nbsp;C:\repo&amp;nbsp;[main&amp;nbsp;&amp;equiv;&amp;nbsp;+1&amp;nbsp;~2&amp;nbsp;-0&amp;nbsp;!3]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;equiv;&amp;nbsp;동기화됨&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;uarr;1&amp;nbsp;1커밋&amp;nbsp;ahead&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;darr;2&amp;nbsp;2커밋&amp;nbsp;behind&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;posh-git설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Install-Module&amp;nbsp;posh-git&amp;nbsp;-Scope&amp;nbsp;CurrentUser&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;실행 정책 이슈&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Set-ExecutionPolicy&amp;nbsp;-ExecutionPolicy&amp;nbsp;RemoteSigned&amp;nbsp;-Scope&amp;nbsp;CurrentUser&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;Import-Module&amp;nbsp;posh-git&lt;br /&gt;Add-PoshGitToProfile -AllHosts&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;
&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;734&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfNm38/dJMcaaZcOOW/w5wcDJWiMzd8akjs0GfHWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfNm38/dJMcaaZcOOW/w5wcDJWiMzd8akjs0GfHWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfNm38/dJMcaaZcOOW/w5wcDJWiMzd8akjs0GfHWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfNm38%2FdJMcaaZcOOW%2Fw5wcDJWiMzd8akjs0GfHWk%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;734&quot; height=&quot;47&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;47&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;&amp;nbsp;&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2471</guid>
      <comments>https://krksap.tistory.com/2471#entry2471comment</comments>
      <pubDate>Mon, 13 Apr 2026 10:23:51 +0900</pubDate>
    </item>
    <item>
      <title>용어 정리 - C#</title>
      <link>https://krksap.tistory.com/2469</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dispatcher&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI 스레드에서 코드를 실행시켜주는 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WPF/WinForms에서 백그라운드 스레드가 UI 컨트롤을 건드리면 크래시가 나는데, 이걸 해결합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;csharp&quot; style=&quot;color: #eaecf0;&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;// 백그라운드 스레드에서 UI 업데이트할 때
Application.Current.Dispatcher.Invoke(() =&amp;gt;
{
    myLabel.Content = &quot;업데이트됨&quot;;
});&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심: &lt;b&gt;&quot;UI 스레드야, 이거 대신 실행해줘&quot;&lt;/b&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dispose&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비관리 리소스(파일, DB 연결, 소켓 등)를 명시적으로 해제하는 메서드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDisposable 인터페이스를 구현하면 using 문을 쓸 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;csharp&quot; style=&quot;color: #eaecf0;&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;// using 블록이 끝나면 자동으로 Dispose() 호출됨
using (var conn = new SqlConnection(connStr))
{
    // DB 작업
} // 여기서 conn.Dispose() 자동 호출

// 또는 직접 호출
var stream = new FileStream(&quot;file.txt&quot;, FileMode.Open);
stream.Dispose();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심: &lt;b&gt;&quot;다 썼으니 메모리/리소스 정리해&quot;&lt;/b&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Delegate&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메서드를 변수처럼 담아서 전달할 수 있는 타입입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;csharp&quot; style=&quot;color: #eaecf0;&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;// delegate 선언
delegate int 계산기(int a, int b);

// 사용
계산기 더하기 = (a, b) =&amp;gt; a + b;
Console.WriteLine(더하기(3, 5)); // 8

// 실제로는 Action / Func 많이 씀
Action&amp;lt;string&amp;gt; 출력 = msg =&amp;gt; Console.WriteLine(msg);
Func&amp;lt;int, int, int&amp;gt; 곱하기 = (a, b) =&amp;gt; a * b;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트(event)도 내부적으로 delegate 기반입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심: &lt;b&gt;&quot;메서드를 값처럼 저장하고 넘기는 것&quot;&lt;/b&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;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Invoke&lt;/h2&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;h3 data-ke-size=&quot;size23&quot;&gt;Marshaling&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**마샬링(Marshaling)**은&amp;nbsp;한&amp;nbsp;스레드에서&amp;nbsp;다른&amp;nbsp;스레드로&amp;nbsp;작업을&amp;nbsp;넘겨서&amp;nbsp;실행하는&amp;nbsp;것입니다.&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;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TryParse 패턴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실패가 정상적인 경우 TryParse를 쓰고 실패가 버그/예외인 경우 Parse를 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776213194898&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; if (int.TryParse(input, out int result))
  {
      Console.WriteLine($&quot;성공: {result}&quot;);
  }
  else
  {
      Console.WriteLine(&quot;실패&quot;);
  }&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;/p&gt;
&lt;pre id=&quot;code_1776298567764&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 전통적 방식
int result;
int.TryParse(&quot;42&quot;, out result);

// 인라인 선언 (권장)
int.TryParse(&quot;42&quot;, out int value);&lt;/code&gt;&lt;/pre&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2469</guid>
      <comments>https://krksap.tistory.com/2469#entry2469comment</comments>
      <pubDate>Wed, 8 Apr 2026 09:12:46 +0900</pubDate>
    </item>
    <item>
      <title>AI로 자율주행 만들기 on 게임 - 1편 좌표 인식</title>
      <link>https://krksap.tistory.com/2467</link>
      <description>&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;p data-ke-size=&quot;size16&quot;&gt;대항해시대3 라는 1997년에 출시된 게임을 대상으로 AI모델을 만들어 보는 과정을 기록 해보겠습니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;1340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvvHbx/dJMcaaSilQV/Hmb43K6XyKVCZMa4FgDx9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvvHbx/dJMcaaSilQV/Hmb43K6XyKVCZMa4FgDx9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvvHbx/dJMcaaSilQV/Hmb43K6XyKVCZMa4FgDx9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvvHbx%2FdJMcaaSilQV%2FHmb43K6XyKVCZMa4FgDx9K%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;1788&quot; height=&quot;1340&quot; data-origin-width=&quot;1788&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;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;&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;이 게임에서 자동플레이에 꼭 필요한 것은 위도 경도를 보고 배나 말을 이동 시키는 것 입니다. 이동은 마우스 또는 키보드로 8개 방향 중 하나를 정해주면 알아서 이동 합니다.&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;p data-ke-size=&quot;size16&quot;&gt;이 부분을 학습 시켜야 하는데요 학습시켜서 뭘 만들거냐면 위도가 북위인지 남위인지, 경도가 서경인지 동경인지 각각 값이 얼마인지를 인식하는 모델을 만들 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btZbxC/dJMcagrpv9U/AtJkFwdbicKk7tenLOPKGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btZbxC/dJMcagrpv9U/AtJkFwdbicKk7tenLOPKGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btZbxC/dJMcagrpv9U/AtJkFwdbicKk7tenLOPKGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtZbxC%2FdJMcagrpv9U%2FAtJkFwdbicKk7tenLOPKGK%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;288&quot; height=&quot;42&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;42&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;이미지에서 문자와 숫자를 인식 해주는 모델을 써서 1초에 한번씩 게임화면을 찍어서 만든 스샷을 라벨링 한 후에 학습을 시키면 될 것 같다는 생각이 들었습니다.&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;font-family: 'Noto Serif KR';&quot;&gt;AI 플랜&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용을 입력하니 AI가 플랜을 짜줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 OCR 모델로 자동 라벨링 &amp;rarr; TorchSharp CNN 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;전체&amp;nbsp;파이프라인&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[1단계]&amp;nbsp;데이터&amp;nbsp;수집&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;항해&amp;nbsp;중&amp;nbsp;1초마다&amp;nbsp;상단바&amp;nbsp;좌표&amp;nbsp;영역만&amp;nbsp;크롭하여&amp;nbsp;저장&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[2단계]&amp;nbsp;자동&amp;nbsp;라벨링&amp;nbsp;(기존&amp;nbsp;OCR&amp;nbsp;모델&amp;nbsp;활용)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Windows.Media.Ocr&amp;nbsp;(한국어&amp;nbsp;지원,&amp;nbsp;별도&amp;nbsp;설치&amp;nbsp;불필요)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;또는&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Tesseract.NET&amp;nbsp;(NuGet:&amp;nbsp;Tesseract)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;크롭&amp;nbsp;이미지에서&amp;nbsp;&quot;북위&amp;nbsp;38&amp;nbsp;서경&amp;nbsp;10&quot;&amp;nbsp;텍스트&amp;nbsp;추출&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;CSV로&amp;nbsp;저장:&amp;nbsp;image_path,&amp;nbsp;lat_dir(N/S),&amp;nbsp;lat_val,&amp;nbsp;lon_dir(E/W),&amp;nbsp;lon_val&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[3단계]&amp;nbsp;TorchSharp&amp;nbsp;CNN&amp;nbsp;모델&amp;nbsp;학습&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;입력:&amp;nbsp;크롭된&amp;nbsp;좌표&amp;nbsp;영역&amp;nbsp;이미지&amp;nbsp;(약&amp;nbsp;150x20&amp;nbsp;픽셀)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;출력:&amp;nbsp;[lat_dir(2),&amp;nbsp;lat_val(91),&amp;nbsp;lon_dir(2),&amp;nbsp;lon_val(181)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;분류&amp;nbsp;문제로&amp;nbsp;풀기&amp;nbsp;(방향&amp;nbsp;2클래스&amp;nbsp;+&amp;nbsp;숫자&amp;nbsp;0~90/0~180&amp;nbsp;클래스)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[4단계]&amp;nbsp;추론&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;AutoPlayService에서&amp;nbsp;TorchSharp&amp;nbsp;모델&amp;nbsp;로드&amp;nbsp;&amp;rarr;&amp;nbsp;실시간&amp;nbsp;좌표&amp;nbsp;인식&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;
&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 style=&quot;font-family: 'Noto Serif KR';&quot;&gt;ROI(Region of Interest 관심 영역)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;북위 또는 남위를 기준으로 좌표를 찾아서 인식을 하기 위해서는 저 글자가 화면상에 어디에 위치 하는지를 먼저 찾아야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctv7ce/dJMcai3MtDE/N2BW1e6Eh6wO2FXvUk7xp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctv7ce/dJMcai3MtDE/N2BW1e6Eh6wO2FXvUk7xp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctv7ce/dJMcai3MtDE/N2BW1e6Eh6wO2FXvUk7xp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctv7ce%2FdJMcai3MtDE%2FN2BW1e6Eh6wO2FXvUk7xp1%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;413&quot; height=&quot;290&quot; data-origin-width=&quot;413&quot; data-origin-height=&quot;290&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상단바 이미지 수집&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1827&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b73RrL/dJMcad2tFRP/RPYPrdvyedbwAk1yPuEqD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b73RrL/dJMcad2tFRP/RPYPrdvyedbwAk1yPuEqD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b73RrL/dJMcad2tFRP/RPYPrdvyedbwAk1yPuEqD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb73RrL%2FdJMcad2tFRP%2FRPYPrdvyedbwAk1yPuEqD1%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;1827&quot; height=&quot;121&quot; data-origin-width=&quot;1827&quot; data-origin-height=&quot;121&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1519&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgUYK6/dJMcaiisAjg/LgvFSuatWkRUKg29EXZNwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgUYK6/dJMcaiisAjg/LgvFSuatWkRUKg29EXZNwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgUYK6/dJMcaiisAjg/LgvFSuatWkRUKg29EXZNwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgUYK6%2FdJMcaiisAjg%2FLgvFSuatWkRUKg29EXZNwK%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;1519&quot; height=&quot;996&quot; data-origin-width=&quot;1519&quot; data-origin-height=&quot;996&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;&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;ai가 추천 해준 대로 윈도 ocr로 했습니다.&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;683&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brYE0X/dJMcabDEDyz/gnmQV46AMQHcJjjIVS1qy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brYE0X/dJMcabDEDyz/gnmQV46AMQHcJjjIVS1qy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brYE0X/dJMcabDEDyz/gnmQV46AMQHcJjjIVS1qy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrYE0X%2FdJMcabDEDyz%2FgnmQV46AMQHcJjjIVS1qy1%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;683&quot; height=&quot;674&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;674&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;학습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 수집하고 라벨링 한 데이터로 학습 시켰습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1445&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3FM5Q/dJMcac3A4DK/ta4IidZwEYViUfkhbuZt40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3FM5Q/dJMcac3A4DK/ta4IidZwEYViUfkhbuZt40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3FM5Q/dJMcac3A4DK/ta4IidZwEYViUfkhbuZt40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3FM5Q%2FdJMcac3A4DK%2Fta4IidZwEYViUfkhbuZt40%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;1445&quot; height=&quot;512&quot; data-origin-width=&quot;1445&quot; data-origin-height=&quot;512&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;&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;결과가 너무 안좋아서 모델 안쓰고 라벨링 할때 썼던 OCR로 했습니다. 인식이 잘 되고 있습니다.&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;675&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qJreX/dJMcaco1uAq/Odna8pmvt7BloSJonJsGq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qJreX/dJMcaco1uAq/Odna8pmvt7BloSJonJsGq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qJreX/dJMcaco1uAq/Odna8pmvt7BloSJonJsGq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqJreX%2FdJMcaco1uAq%2FOdna8pmvt7BloSJonJsGq0%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;675&quot; height=&quot;227&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;227&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;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2467</guid>
      <comments>https://krksap.tistory.com/2467#entry2467comment</comments>
      <pubDate>Sun, 29 Mar 2026 20:04:05 +0900</pubDate>
    </item>
    <item>
      <title>AI로 대항해시대3 원하는 지력 나올때 까지 누르는 기능 학습</title>
      <link>https://krksap.tistory.com/2466</link>
      <description>&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;/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;
&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;게임 설명&lt;/h2&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;&amp;nbsp;&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;중요한 것은 이 부분 입니다. 50으로 되어있는데 왼쪽이 5이고 오른쪽이 0입니다. 이 부분이 바뀌는데 학습을 시킬건 뭐가 5이고 뭐가 0인지 숫자를 학습 시키면 되겠죠&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/soOgL/dJMcaco0QCT/Q1vvCzEYD6iN3QGdrVaI10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/soOgL/dJMcaco0QCT/Q1vvCzEYD6iN3QGdrVaI10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/soOgL/dJMcaco0QCT/Q1vvCzEYD6iN3QGdrVaI10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsoOgL%2FdJMcaco0QCT%2FQ1vvCzEYD6iN3QGdrVaI10%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;502&quot; height=&quot;365&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;365&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;이런 힌트를 줬더니 AI가 더 좋은 아이디어를 내놓죠 화면에 다른 영역에도 숫자가 보이는데 0,1,4,5,7,8,9 까지 보이니까 버튼 한번 더 누르면 주사위를 다시 굴려서 다른 숫자가 나올테니 자기가 버튼을 눌러서 모든 숫자를 학습 하게끔 만든답니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1541&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbmAG9/dJMcahKDude/8K63L98sE97VSFjEh3ZBw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbmAG9/dJMcahKDude/8K63L98sE97VSFjEh3ZBw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbmAG9/dJMcahKDude/8K63L98sE97VSFjEh3ZBw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbmAG9%2FdJMcahKDude%2F8K63L98sE97VSFjEh3ZBw1%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;1541&quot; height=&quot;568&quot; data-origin-width=&quot;1541&quot; data-origin-height=&quot;568&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 수정 해줬는데요 화면에 나오는 숫자를 입력하면 자기가 학습 하겠다고 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ya7P1/dJMcahRniNc/KnNLFCA5b0D7D0WBLpkKB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ya7P1/dJMcahRniNc/KnNLFCA5b0D7D0WBLpkKB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ya7P1/dJMcahRniNc/KnNLFCA5b0D7D0WBLpkKB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fya7P1%2FdJMcahRniNc%2FKnNLFCA5b0D7D0WBLpkKB1%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;972&quot; height=&quot;75&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;75&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1663&quot; data-origin-height=&quot;1069&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Lu35/dJMb99TlvS3/PtxaGzbDnf19G02XXIZVuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Lu35/dJMb99TlvS3/PtxaGzbDnf19G02XXIZVuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Lu35/dJMb99TlvS3/PtxaGzbDnf19G02XXIZVuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Lu35%2FdJMb99TlvS3%2FPtxaGzbDnf19G02XXIZVuk%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;1663&quot; height=&quot;1069&quot; data-origin-width=&quot;1663&quot; data-origin-height=&quot;1069&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인식한 영역을 표시 해달라고 했더니 초록색, 파란색은 맞게 했지만 숫자 영역인 빨간색은 빗나가있는 것이 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1043&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3sIxi/dJMcacifsX8/DLHcA24d9tXTw32VC4lkxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3sIxi/dJMcacifsX8/DLHcA24d9tXTw32VC4lkxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3sIxi/dJMcacifsX8/DLHcA24d9tXTw32VC4lkxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3sIxi%2FdJMcacifsX8%2FDLHcA24d9tXTw32VC4lkxK%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;1394&quot; height=&quot;1043&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1043&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PuCFQ/dJMcahcMcLk/oelTrRNCkLFXc1rkYJ3Tk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PuCFQ/dJMcahcMcLk/oelTrRNCkLFXc1rkYJ3Tk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PuCFQ/dJMcahcMcLk/oelTrRNCkLFXc1rkYJ3Tk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPuCFQ%2FdJMcahcMcLk%2FoelTrRNCkLFXc1rkYJ3Tk0%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;1518&quot; height=&quot;710&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;710&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;&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zevgB/dJMcajn3KZC/wBlUK3YjGkPlJUeq1fnfd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zevgB/dJMcajn3KZC/wBlUK3YjGkPlJUeq1fnfd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zevgB/dJMcajn3KZC/wBlUK3YjGkPlJUeq1fnfd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzevgB%2FdJMcajn3KZC%2FwBlUK3YjGkPlJUeq1fnfd1%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;783&quot; height=&quot;569&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;569&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ETeCT/dJMcahjAlE1/ikk9PdJOf8pl7sz5Ej9su0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ETeCT/dJMcahjAlE1/ikk9PdJOf8pl7sz5Ej9su0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ETeCT/dJMcahjAlE1/ikk9PdJOf8pl7sz5Ej9su0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FETeCT%2FdJMcahjAlE1%2Fikk9PdJOf8pl7sz5Ej9su0%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;1407&quot; height=&quot;368&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;368&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCacRP/dJMb996TnuS/Rw4Uq9erwQsV6KSkguZiIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCacRP/dJMb996TnuS/Rw4Uq9erwQsV6KSkguZiIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCacRP/dJMb996TnuS/Rw4Uq9erwQsV6KSkguZiIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCacRP%2FdJMb996TnuS%2FRw4Uq9erwQsV6KSkguZiIK%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;1549&quot; height=&quot;604&quot; data-origin-width=&quot;1549&quot; data-origin-height=&quot;604&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;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2039&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DPsbP/dJMcagZevGd/z6KAzCiMYlXlQiELJxZrJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DPsbP/dJMcagZevGd/z6KAzCiMYlXlQiELJxZrJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DPsbP/dJMcagZevGd/z6KAzCiMYlXlQiELJxZrJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDPsbP%2FdJMcagZevGd%2Fz6KAzCiMYlXlQiELJxZrJ0%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;2039&quot; height=&quot;623&quot; data-origin-width=&quot;2039&quot; data-origin-height=&quot;623&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;&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VXu3V/dJMcaaLvfry/5VqkHXqy8HtYyYCAfyt9j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VXu3V/dJMcaaLvfry/5VqkHXqy8HtYyYCAfyt9j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VXu3V/dJMcaaLvfry/5VqkHXqy8HtYyYCAfyt9j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVXu3V%2FdJMcaaLvfry%2F5VqkHXqy8HtYyYCAfyt9j1%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;1070&quot; height=&quot;266&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;30세 지력 최고 능력치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지력 76에 보너스포인트 20으로 150회 걸렸습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t7ufX/dJMcaadFV9n/qC4TBa2itksHRE4NUzBYdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t7ufX/dJMcaadFV9n/qC4TBa2itksHRE4NUzBYdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t7ufX/dJMcaadFV9n/qC4TBa2itksHRE4NUzBYdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft7ufX%2FdJMcaadFV9n%2FqC4TBa2itksHRE4NUzBYdK%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;940&quot; height=&quot;586&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;586&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;시도2&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매력이 높게 나와서 조금 아쉽네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFWdPl/dJMcafTAaYj/DztALz1crBghEO0W4Kaag0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFWdPl/dJMcafTAaYj/DztALz1crBghEO0W4Kaag0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFWdPl/dJMcafTAaYj/DztALz1crBghEO0W4Kaag0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFWdPl%2FdJMcafTAaYj%2FDztALz1crBghEO0W4Kaag0%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;515&quot; height=&quot;375&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;375&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;시도6&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매력이 거의 필요가 없으므로 낮게 나올 수록 좋습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPNeOH/dJMcagkC18k/l0FeS7EGy2AWyIWbUb3ry0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPNeOH/dJMcagkC18k/l0FeS7EGy2AWyIWbUb3ry0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPNeOH/dJMcagkC18k/l0FeS7EGy2AWyIWbUb3ry0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPNeOH%2FdJMcagkC18k%2Fl0FeS7EGy2AWyIWbUb3ry0%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;505&quot; height=&quot;365&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;365&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;시도20&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운을 70이상으로 찾으려고 했는데요 체력이 너무 낮게 나오네요&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;521&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JHrYO/dJMcabQ92Jn/K5WoKcjymdKmE7h0qWlsak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JHrYO/dJMcabQ92Jn/K5WoKcjymdKmE7h0qWlsak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JHrYO/dJMcabQ92Jn/K5WoKcjymdKmE7h0qWlsak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJHrYO%2FdJMcabQ92Jn%2FK5WoKcjymdKmE7h0qWlsak%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;521&quot; height=&quot;381&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;381&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;시도25&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;체력은 60이상, 운을 70이상 놓고 뽑았습니다. 이정도면 거의 최상이지 않나 싶네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DCZfe/dJMcaduCJxW/39GAlhgpIZDYLZM27NkK91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DCZfe/dJMcaduCJxW/39GAlhgpIZDYLZM27NkK91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DCZfe/dJMcaduCJxW/39GAlhgpIZDYLZM27NkK91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDCZfe%2FdJMcaduCJxW%2F39GAlhgpIZDYLZM27NkK91%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;513&quot; height=&quot;373&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2466</guid>
      <comments>https://krksap.tistory.com/2466#entry2466comment</comments>
      <pubDate>Sat, 28 Mar 2026 12:19:54 +0900</pubDate>
    </item>
    <item>
      <title>AI개발은 앱 개발하는 과정과 비슷하다</title>
      <link>https://krksap.tistory.com/2465</link>
      <description>&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;AI라는 비교적 새로 나온것이 트렌드가 되었습니다. 새로 나온 것이다 보니 미지의 영역이라는 생각을 많이들 갖고 계신 것 같다는 생각이 많이 듭니다. 새로 나왔다기 보다는 대중화된게 비교적 최근이라는 것이 더 정확하겠지만요.&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 논문을 많이 읽으면서 개발을 하는데요 AI논문이 개발하는 과정과 크게 다를바가 없습니다. OOP나 디버깅, 앱 설계, DB설계, 알고리즘, 프레임웍 구조 등 계속 해오던 것 들을 이해 한다면 거기에서 많은 데이터와 GPU를 곁들이면 AI모델입니다.&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;많은 AI논문의 구조는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;어떤 아이디어를 NN으로 구현 했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;결과가 몇%나왔다&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;AI로 다 해결 하려면 어려운데 개발이 들어가주면 현장의 문제와 ML모델의 출력 계층을 연결 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 논문들입니다. 이 논문들을 쉽게 썼다는 것이 아니고 우리가 현업에서 겪는 문제와 풀어내는 과정이 비슷하다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=JAKO201909358629867&amp;amp;dbt=NART&quot;&gt;https://scienceon.kisti.re.kr/srch/selectPORSrchArticle.do?cn=JAKO201909358629867&amp;amp;dbt=NART&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://scienceon.kisti.re.kr/commons/util/originalView.do?cn=JAKO202005653789386&amp;amp;oCn=JAKO202005653789386&amp;amp;dbt=JAKO&amp;amp;journal=431883&quot;&gt;https://scienceon.kisti.re.kr/commons/util/originalView.do?cn=JAKO202005653789386&amp;amp;oCn=JAKO202005653789386&amp;amp;dbt=JAKO&amp;amp;journal=431883&lt;/a&gt;&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2465</guid>
      <comments>https://krksap.tistory.com/2465#entry2465comment</comments>
      <pubDate>Thu, 26 Mar 2026 17:37:36 +0900</pubDate>
    </item>
    <item>
      <title>라즈베리파이5+oqlink+Nvidia Graphic카드</title>
      <link>https://krksap.tistory.com/2463</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라즈베리파이 + eGPU를 써서 Linux에서 사용하는 비디오입니다. Edge Device에서도 그래픽 카드를 사용할 각이 보이고 있네요.&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;a href=&quot;https://www.youtube.com/watch?v=GRUBw0TLpLs&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=GRUBw0TLpLs&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=GRUBw0TLpLs&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Z4Pxm/dJMb9iaQPk8/a0AE0G7P5Dkg5ZOU4592hk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/0HPD2/dJMb8868u9e/8S4ABWreyOu4bQSPNuz8n1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;라즈베리 파이 5에서 eGPU로 NVIDIA 그래픽 카드를 사용하면 어느정도 게임을 즐길 수 있을까?&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/GRUBw0TLpLs&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2463</guid>
      <comments>https://krksap.tistory.com/2463#entry2463comment</comments>
      <pubDate>Thu, 26 Mar 2026 14:48:45 +0900</pubDate>
    </item>
    <item>
      <title>1D CNN의 활용</title>
      <link>https://krksap.tistory.com/2462</link>
      <description>&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;1D CNN이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차원에서 CNN하는 것. CNN은 2D CNN이 유명한데 이미지를 인식하는 기술이 CNN입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gmnam.tistory.com/274#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gmnam.tistory.com/274#google_vignette&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1774406870928&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;1D Convolutional Neural Network 이해하기 (CNN in numpy &amp;amp;  keras)&quot; data-og-description=&quot;목차 도입 머신러닝 분야에서 예측 모델을 만드는데 가장 많이 사용되는 신경망 모델은 바로 Convolutional Neural Network(CNN)일 것이다. CNN은 특히 이미지 분류에서 높은 정확도를 보이며 많은 예측 모&quot; data-og-host=&quot;gmnam.tistory.com&quot; data-og-source-url=&quot;https://gmnam.tistory.com/274#google_vignette&quot; data-og-url=&quot;https://gmnam.tistory.com/274&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQ4395/dJMb9g5aJ6T/UHtNIAoj64FBokLyePLqVk/img.jpg?width=800&amp;amp;height=1066&amp;amp;face=0_0_800_1066,https://scrap.kakaocdn.net/dn/RNM8K/dJMb8WMo9U6/qANOlyqKSfVOonT3iddJH1/img.jpg?width=800&amp;amp;height=1066&amp;amp;face=0_0_800_1066,https://scrap.kakaocdn.net/dn/QQ78I/dJMb9iIGF88/DCh7fNvMdUx1iW8mZSxPFK/img.jpg?width=960&amp;amp;height=1280&amp;amp;face=0_0_960_1280&quot;&gt;&lt;a href=&quot;https://gmnam.tistory.com/274#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gmnam.tistory.com/274#google_vignette&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQ4395/dJMb9g5aJ6T/UHtNIAoj64FBokLyePLqVk/img.jpg?width=800&amp;amp;height=1066&amp;amp;face=0_0_800_1066,https://scrap.kakaocdn.net/dn/RNM8K/dJMb8WMo9U6/qANOlyqKSfVOonT3iddJH1/img.jpg?width=800&amp;amp;height=1066&amp;amp;face=0_0_800_1066,https://scrap.kakaocdn.net/dn/QQ78I/dJMb9iIGF88/DCh7fNvMdUx1iW8mZSxPFK/img.jpg?width=960&amp;amp;height=1280&amp;amp;face=0_0_960_1280');&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;1D Convolutional Neural Network 이해하기 (CNN in numpy &amp;amp; keras)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 도입 머신러닝 분야에서 예측 모델을 만드는데 가장 많이 사용되는 신경망 모델은 바로 Convolutional Neural Network(CNN)일 것이다. CNN은 특히 이미지 분류에서 높은 정확도를 보이며 많은 예측 모&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gmnam.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1D CNN은 이런 파형 형태로 되어있는 신호에서 특징을 찾아낼 때 주로 쓰입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3146&quot; data-origin-height=&quot;1362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFjsOM/dJMcaibFbUU/9eOm5SjUlb9x3pSKhY9321/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFjsOM/dJMcaibFbUU/9eOm5SjUlb9x3pSKhY9321/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFjsOM/dJMcaibFbUU/9eOm5SjUlb9x3pSKhY9321/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFjsOM%2FdJMcaibFbUU%2F9eOm5SjUlb9x3pSKhY9321%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;3146&quot; height=&quot;1362&quot; data-origin-width=&quot;3146&quot; data-origin-height=&quot;1362&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관련 제품&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;애기 울음소리로 배고픈지 쉬했는지 알려주는 앱&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.shhush&amp;amp;hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/store/apps/details?id=com.shhush&amp;amp;hl=ko&lt;/a&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2462</guid>
      <comments>https://krksap.tistory.com/2462#entry2462comment</comments>
      <pubDate>Wed, 25 Mar 2026 11:51:16 +0900</pubDate>
    </item>
    <item>
      <title>VR 탁구로 이제 탁구 입문도 가능 합니다.</title>
      <link>https://krksap.tistory.com/2452</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저는 탁구를 좋아하는데요 잘 치지는 못 합니다. 레슨도 꽤 오래 받았는데 잘 안늘더라구요. 그리고 커뮤니티 활동 하는데 감정도 많이 써야 해서 피곤하구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런던차에 VR로 탁구를 칠 수 있다는 것을 알게 되었습니다. 동네에 VR방이 있는데 거기에 메타퀘스트3가 있어서 탁구도 있나 싶어서 찾아보니까 있더라구요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbR3UC/dJMcahXuSh3/v2WENOLOiBdKvksre8IYoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbR3UC/dJMcahXuSh3/v2WENOLOiBdKvksre8IYoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbR3UC/dJMcahXuSh3/v2WENOLOiBdKvksre8IYoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbR3UC%2FdJMcahXuSh3%2Fv2WENOLOiBdKvksre8IYoK%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;1300&quot; height=&quot;723&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;723&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;p data-ke-size=&quot;size16&quot;&gt;VR머신 메타퀘스트3 75만원쯤 합니다. 메타퀘스트2는 당근에 꽤 보이는데 15만원 정도에 구매 가능 합니다(26년 1월 기준). 탁구장 월 10만원쯤 합니다. 왔다갔다 해야 하구요. 초보자는 잘 상대를 안해주고 회원님들하고 친하게도 지내야 하고 저같이 소심한 사람들은 다니기 쉽지 않습니다. 그래서 바로 구매를 했습니다. 배송까지는 1주일 남았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2074&quot; data-origin-height=&quot;1168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxZRqb/dJMcaivg1Rj/J2A47OeTILdofhuuNLPVUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxZRqb/dJMcaivg1Rj/J2A47OeTILdofhuuNLPVUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxZRqb/dJMcaivg1Rj/J2A47OeTILdofhuuNLPVUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxZRqb%2FdJMcaivg1Rj%2FJ2A47OeTILdofhuuNLPVUk%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;2074&quot; height=&quot;1168&quot; data-origin-width=&quot;2074&quot; data-origin-height=&quot;1168&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;이 게임 고인물은 아마 실전에서도 고인물일 것입니다. 완전 넓은 공간을 왔다갔다 하면서 친다면 많이 다르겠지만 초보자들이 입문하기는 더 없이 좋을 것 같네요.&amp;nbsp;&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;VR은 왼쪽과 같은 컨트롤러를 들고 해야 하는데 탁구채 같은 어댑터가 있습니다. 이걸 쓰면 오른쪽 처럼 탁구채 처럼 쥐고 칠 수 있습니다. 저도 구매 해볼 예정입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cF2zi9/dJMcabJKjrn/JVK1O1cPxgc0rTvoxHpDZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cF2zi9/dJMcabJKjrn/JVK1O1cPxgc0rTvoxHpDZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cF2zi9/dJMcabJKjrn/JVK1O1cPxgc0rTvoxHpDZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcF2zi9%2FdJMcabJKjrn%2FJVK1O1cPxgc0rTvoxHpDZk%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;1045&quot; height=&quot;871&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;871&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2452</guid>
      <comments>https://krksap.tistory.com/2452#entry2452comment</comments>
      <pubDate>Mon, 19 Jan 2026 00:40:53 +0900</pubDate>
    </item>
    <item>
      <title>.Net MAUI할 때 개발 환경 설정 .Rider</title>
      <link>https://krksap.tistory.com/2451</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발환경 구축 할 때 시간이 한 30분 넘게 걸리는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WPF 같은 경우 git clone후에 바로 dotnet build;dotnet run 하면 실행 되는데 MAUI는 워크로드 설치 해주고 안드로이드SDK도 설치 해주어야 합니다. ㅜㅜ&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;dotnet workload 설치&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RxN6v/dJMcadgpMYr/T1PhkHOQiaZJVID464nvF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RxN6v/dJMcadgpMYr/T1PhkHOQiaZJVID464nvF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RxN6v/dJMcadgpMYr/T1PhkHOQiaZJVID464nvF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRxN6v%2FdJMcadgpMYr%2FT1PhkHOQiaZJVID464nvF1%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;1785&quot; height=&quot;455&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;455&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;.NET Multi-Platform App UI 설치&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/re7Ch/dJMcai9Qyiv/DpqChiQc2KuyVuwdzJeGxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/re7Ch/dJMcai9Qyiv/DpqChiQc2KuyVuwdzJeGxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/re7Ch/dJMcai9Qyiv/DpqChiQc2KuyVuwdzJeGxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fre7Ch%2FdJMcai9Qyiv%2FDpqChiQc2KuyVuwdzJeGxk%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;1744&quot; height=&quot;1228&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;1228&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;1757&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCtR5g/dJMcadHt6KY/hDdXstTbiEw2i0mvr0vOG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCtR5g/dJMcadHt6KY/hDdXstTbiEw2i0mvr0vOG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCtR5g/dJMcadHt6KY/hDdXstTbiEw2i0mvr0vOG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCtR5g%2FdJMcadHt6KY%2FhDdXstTbiEw2i0mvr0vOG1%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;1757&quot; height=&quot;667&quot; data-origin-width=&quot;1757&quot; data-origin-height=&quot;667&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Android SDK설치&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qczU5/dJMcacBQU4a/uwZ3laIWFl3kM3AY5ZeV61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qczU5/dJMcacBQU4a/uwZ3laIWFl3kM3AY5ZeV61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qczU5/dJMcacBQU4a/uwZ3laIWFl3kM3AY5ZeV61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqczU5%2FdJMcacBQU4a%2FuwZ3laIWFl3kM3AY5ZeV61%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;1216&quot; height=&quot;734&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;734&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2012&quot; data-origin-height=&quot;1264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l7NFI/dJMcagjV4V2/Ov2MEdJHiJJfaFUobM80Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l7NFI/dJMcagjV4V2/Ov2MEdJHiJJfaFUobM80Ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l7NFI/dJMcagjV4V2/Ov2MEdJHiJJfaFUobM80Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl7NFI%2FdJMcagjV4V2%2FOv2MEdJHiJJfaFUobM80Ik%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;2012&quot; height=&quot;1264&quot; data-origin-width=&quot;2012&quot; data-origin-height=&quot;1264&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;&amp;nbsp;&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;1946&quot; data-origin-height=&quot;1451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0XDpn/dJMcafSTdgB/Ivv18esYqDqSYWQQQCQIZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0XDpn/dJMcafSTdgB/Ivv18esYqDqSYWQQQCQIZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0XDpn/dJMcafSTdgB/Ivv18esYqDqSYWQQQCQIZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0XDpn%2FdJMcafSTdgB%2FIvv18esYqDqSYWQQQCQIZ0%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;1946&quot; height=&quot;1451&quot; data-origin-width=&quot;1946&quot; data-origin-height=&quot;1451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2451</guid>
      <comments>https://krksap.tistory.com/2451#entry2451comment</comments>
      <pubDate>Thu, 15 Jan 2026 10:26:38 +0900</pubDate>
    </item>
    <item>
      <title>AI와 함께하는 D형 큐티 - 딤전 3:1-7</title>
      <link>https://krksap.tistory.com/2450</link>
      <description>&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;2816&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EWQoy/dJMcaf6nVPg/xPj5ETjKGaVtst9x1hUvG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EWQoy/dJMcaf6nVPg/xPj5ETjKGaVtst9x1hUvG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EWQoy/dJMcaf6nVPg/xPj5ETjKGaVtst9x1hUvG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEWQoy%2FdJMcaf6nVPg%2FxPj5ETjKGaVtst9x1hUvG1%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;2816&quot; height=&quot;1536&quot; data-origin-width=&quot;2816&quot; data-origin-height=&quot;1536&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;2026년부터 저는 새로운 팀으로 옮기게 되었습니다. 24-&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;25년 2년간 몸 담았던 팀에서 적응하지 못하고 떨어져 나와&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;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;전 팀을 떠나 새로운 팀에 와보니 조금 여유가 생겼습니다. 이전에는 업무 압박 + 운영 이슈 + 코드 리뷰에 육아 기타 집안일에 치이다 보니 저도 정신을 못 차리고 하루하루 넘기며 지내고 있었습니다. 팀을 옮겨 개발 업무만 1주 정도 집중할 수 있는 상황이어서 조금 여유가 생겼는지 자신을 잠시 돌아볼 수 있었습니다. 그래서 2년만에 D형 큐티를 다시 했습니다.&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;D형 큐티에 대해 설명을 좀 드리면 교회에서 귀납적으로 성경을 공부하는 방식 중 하나입니다. 개인의 주관적인 생각이 아니라 성경 구절의 의미를 깊이 파고들며 공부하는 방식입니다. 예를 들면 '사모한다'라는 말을 교회에서 많이 쓰곤 합니다. 오늘 제가 읽었던 구절에서도 '직분을 사모하는 자 '라는 말이 나왔습니다. 정확히는 '곧 사람이 감독의 직분을 얻으려 함은 선한 일을 사모하는 것'이라는 말이지만 제 뇌는 이미 여기에서도 제식대로 처리를 해버렸습니다.&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;주관적 해석 방식으로 해석을 한다면 다음과 같이 잘못 해석 할 수 있습니다. '사모하는게 사랑 하는 것 같은데? 그러면 직분=자리 인데 팀장, 임원 이라는 자리를 사랑하는 것인가? 자리를 사랑한다고? 이거 완전 성경은 자리에 욕심내라는 사막잡신 소리구만?' 이렇게 나의 생각이나 기존의 지식(인터넷, 커뮤니티에서 본 글들)을 성경에 대입해서 해석 하면 본질에 접근하기 힘들기 때문에 귀납적으로 성격을 공부하는 방식인 D형 큐티를 하는 것입니다.&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;그럼 큐티는 또 뭐냐고 하실 수 있어서 첨언을 드리면 Quiet Time 의 약자 QT를 큐티라고 합니다. 조용히 혼자 고독한 시간을 가지면서 자신의 정신을 가다듬는 시간을 큐티라고 합니다. 업무 하다 보면 아주 많이 열어 놓은 웹브라우저 탭과 힙에 쌓인 안쓰는 객채 들을 가비지 컬렉션 해서 시스템의 건전성을 높이는 것 처럼 나와 만나는 시간을 가지는 것입니다. 그냥 만나면 헝클어져 있는 나와 만나야 하기 때문에 도구로써 경전(성경)을 사용해 조용한 시간을 가지는 것입니다.&lt;span style=&quot;letter-spacing: 0px;&quot;&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;D형큐티라는 수단을 이용해 제가 해결해야 하는 리더쉽이라는 문제를 경전의 지혜를 빌려 해결 하고 싶다는 생각이 들었습니다. 마치 최근에 네트웍 지식이 부족하여 네트웍 책을 찾아 읽고 문제를 해결 했듯이요.&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;이번에 봤던 구절은 바울이 디모데라는 자신의 후계자게에 보냈던 편지의 내용입니다. 바울은 디모데를 에베소라는 도시에 개척한 교회에 보내 그 교회의 문제를 해결하려고 했습니다. 에베소는 지금의 터키지역이고 세계 7대불가사이인 아르테미스 신전이 세워져 있던 문화와 교역의 중심지 입니다. 지금 한국의 도시와 비교를 하면 강남이라고 할 수 있습니다. 사람도 많고 교역이 많이 이루어 지다 보면 많은 문제들이 생기기 마련입니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 D형큐티에 대해 아는지 물어본 후 제미나이에 '딤전3 1-7'을 입력 하니 D형큐티 형식으로 정리를 해주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;1101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGU6ex/dJMcacohRiV/AgBWyY0h5y0bhBM9zO7CK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGU6ex/dJMcacohRiV/AgBWyY0h5y0bhBM9zO7CK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGU6ex/dJMcacohRiV/AgBWyY0h5y0bhBM9zO7CK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGU6ex%2FdJMcacohRiV%2FAgBWyY0h5y0bhBM9zO7CK1%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;1160&quot; height=&quot;1101&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;1101&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;/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;1087&quot; data-origin-height=&quot;1221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8LorL/dJMcajnmgmt/nt37Lgk0U1oOIKv0yLufa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8LorL/dJMcajnmgmt/nt37Lgk0U1oOIKv0yLufa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8LorL/dJMcajnmgmt/nt37Lgk0U1oOIKv0yLufa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8LorL%2FdJMcajnmgmt%2Fnt37Lgk0U1oOIKv0yLufa0%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;1087&quot; height=&quot;1221&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;1221&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;제미나이가 알기 쉽게 풀어 주었네요. 코딩 능력, 아키텍처 설계능력은 애플리케이션 영역이라서 실제 성과를 내지만 그것을 받혀주는 것은 커널과 OS인데 커널과 OS가 성품이라고 합니다. OS가 안좋으면 애플리케이션이 제대로 돌아갈 수 없죠.&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;그래서 커널과 OS를 잘 정비 하는 것이야 말로 중요하다고 합니다.&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2450</guid>
      <comments>https://krksap.tistory.com/2450#entry2450comment</comments>
      <pubDate>Mon, 12 Jan 2026 01:53:47 +0900</pubDate>
    </item>
    <item>
      <title>Mac Key 매퍼 - Karabiner</title>
      <link>https://krksap.tistory.com/2449</link>
      <description>&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P4bzZ/dJMcadN65qn/PbS2scuW0Iu1FhCGXuQuRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P4bzZ/dJMcadN65qn/PbS2scuW0Iu1FhCGXuQuRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P4bzZ/dJMcadN65qn/PbS2scuW0Iu1FhCGXuQuRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP4bzZ%2FdJMcadN65qn%2FPbS2scuW0Iu1FhCGXuQuRk%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;548&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;548&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;&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;2186&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1i1oP/dJMcacPgo3T/vUlntmuwGLWmKGHHKD7g9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1i1oP/dJMcacPgo3T/vUlntmuwGLWmKGHHKD7g9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1i1oP/dJMcacPgo3T/vUlntmuwGLWmKGHHKD7g9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1i1oP%2FdJMcacPgo3T%2FvUlntmuwGLWmKGHHKD7g9k%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;2186&quot; height=&quot;666&quot; data-origin-width=&quot;2186&quot; data-origin-height=&quot;666&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;space as Modifier&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;~/.config/karabiner/karabiner.json 설정파일은 이 위치에 저장됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1962&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSllvk/dJMcahXmiHw/Z3w2iE3czKC3UeQKyheIQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSllvk/dJMcahXmiHw/Z3w2iE3czKC3UeQKyheIQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSllvk/dJMcahXmiHw/Z3w2iE3czKC3UeQKyheIQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSllvk%2FdJMcahXmiHw%2FZ3w2iE3czKC3UeQKyheIQ0%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;1962&quot; height=&quot;1126&quot; data-origin-width=&quot;1962&quot; data-origin-height=&quot;1126&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lb9qS/dJMcagxl4Ea/MLrVdVt4tljnzN17vbKMf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lb9qS/dJMcagxl4Ea/MLrVdVt4tljnzN17vbKMf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lb9qS/dJMcagxl4Ea/MLrVdVt4tljnzN17vbKMf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flb9qS%2FdJMcagxl4Ea%2FMLrVdVt4tljnzN17vbKMf0%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;1790&quot; height=&quot;480&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2449</guid>
      <comments>https://krksap.tistory.com/2449#entry2449comment</comments>
      <pubDate>Sat, 27 Dec 2025 12:20:25 +0900</pubDate>
    </item>
    <item>
      <title>Obsidian Syntax Highlight 플러그인 - Shiki</title>
      <link>https://krksap.tistory.com/2445</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/mProjectsCode/obsidian-shiki-plugin&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/mProjectsCode/obsidian-shiki-plugin&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1764581612016&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 - mProjectsCode/obsidian-shiki-plugin: An Obsidian plugin that offers better code highliting via shiki and Expressive Cod&quot; data-og-description=&quot;An Obsidian plugin that offers better code highliting via shiki and Expressive Code. - mProjectsCode/obsidian-shiki-plugin&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/mProjectsCode/obsidian-shiki-plugin&quot; data-og-url=&quot;https://github.com/mProjectsCode/obsidian-shiki-plugin&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BOINj/hyZOQJcORf/XLcWhorI4pRjuleKM5ydd0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/o38uT/hyZOxqV7QJ/sKkvU9Wu84RFBLzk0QlxN0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/mProjectsCode/obsidian-shiki-plugin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/mProjectsCode/obsidian-shiki-plugin&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BOINj/hyZOQJcORf/XLcWhorI4pRjuleKM5ydd0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/o38uT/hyZOxqV7QJ/sKkvU9Wu84RFBLzk0QlxN0/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 - mProjectsCode/obsidian-shiki-plugin: An Obsidian plugin that offers better code highliting via shiki and Expressive Cod&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An Obsidian plugin that offers better code highliting via shiki and Expressive Code. - mProjectsCode/obsidian-shiki-plugin&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;Obsidian에서 문서 볼 때 Syntax Highlight기능을 개선 해주는 shiki&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;Before&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;1166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXhDgt/dJMcaa4Pay6/paobVs1hs1Ed4ysKcYCvX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXhDgt/dJMcaa4Pay6/paobVs1hs1Ed4ysKcYCvX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXhDgt/dJMcaa4Pay6/paobVs1hs1Ed4ysKcYCvX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXhDgt%2FdJMcaa4Pay6%2FpaobVs1hs1Ed4ysKcYCvX1%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;1241&quot; height=&quot;1166&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;1166&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;After&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;1155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckP0HT/dJMcajglBR1/MUxVoKyIGL1h812torC2Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckP0HT/dJMcajglBR1/MUxVoKyIGL1h812torC2Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckP0HT/dJMcajglBR1/MUxVoKyIGL1h812torC2Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckP0HT%2FdJMcajglBR1%2FMUxVoKyIGL1h812torC2Q1%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;1253&quot; height=&quot;1155&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;1155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2445</guid>
      <comments>https://krksap.tistory.com/2445#entry2445comment</comments>
      <pubDate>Mon, 1 Dec 2025 18:34:34 +0900</pubDate>
    </item>
    <item>
      <title>Wpf와 Winform의 차이</title>
      <link>https://krksap.tistory.com/2444</link>
      <description>&lt;h1&gt;WPF vs WinForms 비교&lt;/h1&gt;
&lt;h2&gt;1. 기본 개념&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;WinForms&lt;/th&gt;
&lt;th&gt;WPF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;출시&lt;/td&gt;
&lt;td&gt;2002 (.NET 1.0)&lt;/td&gt;
&lt;td&gt;2006 (.NET 3.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;렌더링&lt;/td&gt;
&lt;td&gt;GDI/GDI+ (CPU)&lt;/td&gt;
&lt;td&gt;DirectX (GPU)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI 정의&lt;/td&gt;
&lt;td&gt;C# 코드 (Designer)&lt;/td&gt;
&lt;td&gt;XAML + C#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;아키텍처&lt;/td&gt;
&lt;td&gt;이벤트 기반&lt;/td&gt;
&lt;td&gt;MVVM 패턴 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;2. 렌더링 방식&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;WinForms:
┌─────────────┐
│  Control    │ → GDI/GDI+ → CPU → 화면
└─────────────┘
  (픽셀 기반)

WPF:
┌─────────────┐
│  Visual     │ → DirectX → GPU → 화면
└─────────────┘
  (벡터 기반)&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WinForms&lt;/strong&gt;: CPU 기반 렌더링, 픽셀 단위&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WPF&lt;/strong&gt;: GPU 가속, 벡터 기반으로 해상도 독립적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;3. UI 정의 방식&lt;/h2&gt;
&lt;h3&gt;WinForms - 코드 중심&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;Button btn = new Button();
btn.Text = &amp;quot;클릭&amp;quot;;
btn.Location = new Point(10, 10);
btn.Click += Btn_Click;
this.Controls.Add(btn);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;WPF - XAML 선언적 방식&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;Button Content=&amp;quot;클릭&amp;quot; 
        Margin=&amp;quot;10&amp;quot; 
        Command=&amp;quot;{Binding ClickCommand}&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;4. 데이터 바인딩&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;WinForms&lt;/th&gt;
&lt;th&gt;WPF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;바인딩&lt;/td&gt;
&lt;td&gt;단순 (DataSource)&lt;/td&gt;
&lt;td&gt;강력 (INotifyPropertyChanged)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;방향&lt;/td&gt;
&lt;td&gt;단방향 위주&lt;/td&gt;
&lt;td&gt;양방향, 단방향 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;변환기&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;IValueConverter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;템플릿&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;DataTemplate, ControlTemplate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;WinForms 바인딩&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;textBox1.DataBindings.Add(&amp;quot;Text&amp;quot;, person, &amp;quot;Name&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;WPF 바인딩&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;TextBox Text=&amp;quot;{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;5. 레이아웃 시스템&lt;/h2&gt;
&lt;h3&gt;WinForms - 절대/앵커 위치&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;button.Location = new Point(100, 50);  // 절대 좌표
button.Anchor = AnchorStyles.Top | AnchorStyles.Right;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;WPF - 유연한 레이아웃 패널&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;Grid&amp;gt;
    &amp;lt;Grid.RowDefinitions&amp;gt;
        &amp;lt;RowDefinition Height=&amp;quot;Auto&amp;quot;/&amp;gt;
        &amp;lt;RowDefinition Height=&amp;quot;*&amp;quot;/&amp;gt;
    &amp;lt;/Grid.RowDefinitions&amp;gt;
    &amp;lt;Button Grid.Row=&amp;quot;0&amp;quot; Content=&amp;quot;상단&amp;quot;/&amp;gt;
    &amp;lt;ListBox Grid.Row=&amp;quot;1&amp;quot;/&amp;gt;
&amp;lt;/Grid&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;레이아웃 패널 대응표&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;WinForms&lt;/th&gt;
&lt;th&gt;WPF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;FlowLayoutPanel&lt;/td&gt;
&lt;td&gt;StackPanel, WrapPanel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TableLayoutPanel&lt;/td&gt;
&lt;td&gt;Grid, UniformGrid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;절대좌표&lt;/td&gt;
&lt;td&gt;Canvas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;DockPanel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;6. 스타일링/테마&lt;/h2&gt;
&lt;h3&gt;WinForms - 제한적&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;button.BackColor = Color.Blue;
button.FlatStyle = FlatStyle.Flat;
// 컨트롤별 개별 설정 필요&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;WPF - 강력한 스타일/템플릿&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;Style TargetType=&amp;quot;Button&amp;quot;&amp;gt;
    &amp;lt;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;Blue&amp;quot;/&amp;gt;
    &amp;lt;Setter Property=&amp;quot;Template&amp;quot;&amp;gt;
        &amp;lt;Setter.Value&amp;gt;
            &amp;lt;ControlTemplate TargetType=&amp;quot;Button&amp;quot;&amp;gt;
                &amp;lt;!-- 완전히 새로운 모양 정의 가능 --&amp;gt;
            &amp;lt;/ControlTemplate&amp;gt;
        &amp;lt;/Setter.Value&amp;gt;
    &amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;7. 장단점 비교&lt;/h2&gt;
&lt;h3&gt;WinForms&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;장점&lt;/th&gt;
&lt;th&gt;단점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;쉬운 학습곡선&lt;/td&gt;
&lt;td&gt;구식 외관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;빠른 개발&lt;/td&gt;
&lt;td&gt;제한적 커스터마이징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가벼움&lt;/td&gt;
&lt;td&gt;해상도 의존적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;풍부한 레거시 자료&lt;/td&gt;
&lt;td&gt;제한적 데이터바인딩&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;WPF&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;장점&lt;/th&gt;
&lt;th&gt;단점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;현대적 UI&lt;/td&gt;
&lt;td&gt;높은 학습곡선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;강력한 데이터바인딩&lt;/td&gt;
&lt;td&gt;상대적으로 무거움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MVVM 패턴 지원&lt;/td&gt;
&lt;td&gt;복잡한 디버깅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;해상도 독립적&lt;/td&gt;
&lt;td&gt;초기 개발 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;애니메이션/3D 지원&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;8. 선택 가이드&lt;/h2&gt;
&lt;h3&gt;WinForms 선택 시&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;간단한 내부 도구&lt;/li&gt;
&lt;li&gt;빠른 프로토타이핑&lt;/li&gt;
&lt;li&gt;레거시 시스템 유지보수&lt;/li&gt;
&lt;li&gt;팀이 WinForms에 익숙&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WPF 선택 시&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;현대적 UI 필요&lt;/li&gt;
&lt;li&gt;복잡한 데이터 바인딩&lt;/li&gt;
&lt;li&gt;커스텀 컨트롤 다수&lt;/li&gt;
&lt;li&gt;MVVM 아키텍처 적용&lt;/li&gt;
&lt;li&gt;고해상도/다양한 DPI 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2444</guid>
      <comments>https://krksap.tistory.com/2444#entry2444comment</comments>
      <pubDate>Sun, 30 Nov 2025 16:33:55 +0900</pubDate>
    </item>
    <item>
      <title>AI의 진화 - 웹툰으로 제품 홍보</title>
      <link>https://krksap.tistory.com/2440</link>
      <description>&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NGaq8/dJMcacIbALy/ZgdxX9tOYL3HHuCuyeFXOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NGaq8/dJMcacIbALy/ZgdxX9tOYL3HHuCuyeFXOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NGaq8/dJMcacIbALy/ZgdxX9tOYL3HHuCuyeFXOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNGaq8%2FdJMcacIbALy%2FZgdxX9tOYL3HHuCuyeFXOK%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;1024&quot; height=&quot;1024&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xK6Ro/dJMcacIbALx/XTInK4YJU8HJdWrRo783r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xK6Ro/dJMcacIbALx/XTInK4YJU8HJdWrRo783r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xK6Ro/dJMcacIbALx/XTInK4YJU8HJdWrRo783r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxK6Ro%2FdJMcacIbALx%2FXTInK4YJU8HJdWrRo783r0%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;1024&quot; height=&quot;1024&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj (2).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NGbHE/dJMcaj1B6uA/KaHJkAh1iYeY3jKkHHIaUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NGbHE/dJMcaj1B6uA/KaHJkAh1iYeY3jKkHHIaUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NGbHE/dJMcaj1B6uA/KaHJkAh1iYeY3jKkHHIaUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNGbHE%2FdJMcaj1B6uA%2FKaHJkAh1iYeY3jKkHHIaUk%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;1024&quot; height=&quot;1024&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj (2).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj (3).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PARLP/dJMcaap39oR/U5f35idBkJGtmZvXbUTRGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PARLP/dJMcaap39oR/U5f35idBkJGtmZvXbUTRGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PARLP/dJMcaap39oR/U5f35idBkJGtmZvXbUTRGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPARLP%2FdJMcaap39oR%2FU5f35idBkJGtmZvXbUTRGk%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;1024&quot; height=&quot;1024&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj (3).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj (4).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FbNk4/dJMcaeeVSmO/7lsrkB05APt67OSaMbbXNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FbNk4/dJMcaeeVSmO/7lsrkB05APt67OSaMbbXNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FbNk4/dJMcaeeVSmO/7lsrkB05APt67OSaMbbXNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFbNk4%2FdJMcaeeVSmO%2F7lsrkB05APt67OSaMbbXNk%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;1024&quot; height=&quot;1024&quot; data-filename=&quot;Gemini_Generated_Image_nncjr4nncjr4nncj (4).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1c1d; text-align: left;&quot;&gt;네컷만화 만들건데&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1c1d; text-align: left;&quot;&gt;1. 전기요금 고지서를 받고 사장님이 화를 내시는 장면&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1c1d; text-align: left;&quot;&gt;2. 계약전력의 Peak를 초과해서 과징금 3000만원 나오는 장면&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1c1d; text-align: left;&quot;&gt;3. 머신365 똑똑쓰가 Peak를 넘기 전에 알림을 보내는 장면&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1c1d; text-align: left;&quot;&gt;4. 전기 요금을 아껴서&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1d1c1d; text-align: left;&quot;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://machine365.ai&quot;&gt;https://machine365.ai&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1762390016738&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;Machine365&quot; data-og-description=&quot;Energy monitoring and machine monitoring solution&quot; data-og-host=&quot;machine365.ai&quot; data-og-source-url=&quot;https://machine365.ai&quot; data-og-url=&quot;https://machine365.ai&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jhZBT/hyZNbG9Fw5/vXQoDKLJNy65tnjHHWtBX0/img.png?width=830&amp;amp;height=680&amp;amp;face=0_0_830_680,https://scrap.kakaocdn.net/dn/ckp1k8/hyZNcTABqV/ipBh0zKLEgOzV9oRUI2SQ0/img.png?width=830&amp;amp;height=680&amp;amp;face=0_0_830_680&quot;&gt;&lt;a href=&quot;https://machine365.ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://machine365.ai&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jhZBT/hyZNbG9Fw5/vXQoDKLJNy65tnjHHWtBX0/img.png?width=830&amp;amp;height=680&amp;amp;face=0_0_830_680,https://scrap.kakaocdn.net/dn/ckp1k8/hyZNcTABqV/ipBh0zKLEgOzV9oRUI2SQ0/img.png?width=830&amp;amp;height=680&amp;amp;face=0_0_830_680');&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;Machine365&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Energy monitoring and machine monitoring solution&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;machine365.ai&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;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2440</guid>
      <comments>https://krksap.tistory.com/2440#entry2440comment</comments>
      <pubDate>Thu, 6 Nov 2025 09:48:22 +0900</pubDate>
    </item>
    <item>
      <title>SQL Server 커버링 인덱스 (Covering Index) 완벽 가이드</title>
      <link>https://krksap.tistory.com/2438</link>
      <description>&lt;h1&gt;SQL Server 커버링 인덱스 (Covering Index) 완벽 가이드&lt;/h1&gt;
&lt;h2&gt;개요&lt;/h2&gt;
&lt;p&gt;커버링 인덱스는 쿼리에 필요한 모든 컬럼을 인덱스에 포함시켜 테이블 접근 없이 인덱스만으로 쿼리를 처리하는 최적화 기법입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;커버링 인덱스란?&lt;/h2&gt;
&lt;h3&gt;정의&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;커버링 인덱스 (Covering Index)&lt;/strong&gt;: 쿼리가 필요로 하는 모든 컬럼이 인덱스에 포함되어 있어, 테이블 데이터에 접근하지 않고 인덱스만으로 쿼리를 완전히 처리할 수 있는 인덱스&lt;/p&gt;
&lt;h3&gt;핵심 개념&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;일반 인덱스:
1. 인덱스에서 키 값 검색
2. 인덱스에서 레코드 위치(RID/클러스터드 키) 확인
3. ⚠️ 테이블 데이터 페이지로 이동 (Key Lookup)
4. 나머지 컬럼 값 읽기

커버링 인덱스:
1. 인덱스에서 키 값 검색
2. ✅ 인덱스에 모든 필요한 컬럼이 있음
3. 완료! (테이블 접근 불필요)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;SQL Server의 인덱스 구조&lt;/h2&gt;
&lt;h3&gt;1. 기본 인덱스 구조&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE NONCLUSTERED INDEX IX_Example
ON sensor_data(device_id, recorded_at);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;인덱스 구조&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[device_id] → [recorded_at] → [클러스터드 키 또는 RID]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Key Columns: device_id, recorded_at&lt;/li&gt;
&lt;li&gt;Leaf Level: 키 값 + 포인터 (테이블 위치)&lt;/li&gt;
&lt;li&gt;다른 컬럼 필요 시: 테이블 접근 (Key Lookup)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. INCLUDE를 사용한 커버링 인덱스&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE NONCLUSTERED INDEX IX_Example_Covering
ON sensor_data(device_id, recorded_at)
INCLUDE (status, current_1, current_2, current_3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;인덱스 구조&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Non-Leaf Level: [device_id] → [recorded_at]
     ↓
Leaf Level:     [device_id] → [recorded_at] → [status] → [current_1] → [current_2] → [current_3] → [포인터]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;특징&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Key Columns: device_id, recorded_at (인덱스 트리 구조에 포함)&lt;/li&gt;
&lt;li&gt;Include Columns: status, current_1, current_2, current_3 (Leaf Level에만 저장)&lt;/li&gt;
&lt;li&gt;WHERE/ORDER BY/GROUP BY: Key Columns 사용&lt;/li&gt;
&lt;li&gt;SELECT: Include Columns도 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;INCLUDE 절의 원리&lt;/h2&gt;
&lt;h3&gt;Key Columns vs Include Columns&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;항목&lt;/th&gt;
&lt;th&gt;Key Columns&lt;/th&gt;
&lt;th&gt;Include Columns (INCLUDE)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;위치&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;모든 레벨 (Root → Leaf)&lt;/td&gt;
&lt;td&gt;Leaf Level만&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;정렬&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;정렬됨&lt;/td&gt;
&lt;td&gt;정렬 안 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;검색 가능&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes (WHERE, ORDER BY)&lt;/td&gt;
&lt;td&gt;❌ No (SELECT만)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;인덱스 크기&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;큰 영향&lt;/td&gt;
&lt;td&gt;작은 영향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 목적&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;필터링, 정렬, 조인&lt;/td&gt;
&lt;td&gt;SELECT 컬럼만 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;왜 INCLUDE를 사용하나?&lt;/h3&gt;
&lt;h4&gt;Before (INCLUDE 없이)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE INDEX IX_Bad ON sensor_data(device_id, recorded_at, 
    current_1, current_2, current_3, voltage_1, voltage_2, voltage_3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;문제점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모든 컬럼이 Key Column&lt;/li&gt;
&lt;li&gt;인덱스 트리의 모든 레벨에 저장&lt;/li&gt;
&lt;li&gt;인덱스 크기 ↑↑↑ (5-10배 커짐)&lt;/li&gt;
&lt;li&gt;인덱스 탐색 속도 ↓↓↓ (B-Tree 깊이 증가)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;After (INCLUDE 사용)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE INDEX IX_Good ON sensor_data(device_id, recorded_at)
INCLUDE (current_1, current_2, current_3, voltage_1, voltage_2, voltage_3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Key Columns: 검색에 필요한 것만&lt;/li&gt;
&lt;li&gt;Include Columns: SELECT 컬럼만 Leaf Level에&lt;/li&gt;
&lt;li&gt;인덱스 크기 ↓ (2-3배 작음)&lt;/li&gt;
&lt;li&gt;인덱스 탐색 속도 ↑ (B-Tree 얕아짐)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최적의 균형!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;실전 예제&lt;/h2&gt;
&lt;h3&gt;예제 쿼리&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT 
    device_id,
    recorded_at,
    status,
    current_1,
    current_2,
    current_3,
    voltage_1,
    voltage_2,
    voltage_3
FROM sensor_data
WHERE device_id = &amp;#39;A1B2C3D4-1234-5678-ABCD-123456789ABC&amp;#39;
    AND recorded_at &amp;gt;= &amp;#39;2024-09-01 00:00:00&amp;#39;
    AND recorded_at &amp;lt;= &amp;#39;2024-10-01 00:00:00&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;시나리오 1: 인덱스 없음&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 인덱스 없음&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;실행 계획&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Table Scan (전체 테이블 스캔)
→ 모든 데이터 페이지 읽기
→ 매우 느림 (수백만 건이면 분 단위)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;성능&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logical Reads: 50,000-100,000 페이지&lt;/li&gt;
&lt;li&gt;실행 시간: 100-200초&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;시나리오 2: 일반 인덱스&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE INDEX IX_Device_DateTime 
ON sensor_data(device_id, recorded_at);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;실행 계획&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Index Seek (인덱스 탐색)
→ Key Lookup (테이블 접근) ⚠️ 병목!
→ Nested Loops
→ 느림 (1,457번 랜덤 I/O)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;성능&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logical Reads: 10,000-20,000 페이지&lt;/li&gt;
&lt;li&gt;Key Lookup: 1,457번&lt;/li&gt;
&lt;li&gt;실행 시간: 30-60초&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;문제&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1,457건 조회 시:
- Index Seek: 1,457개 레코드 위치 찾기
- Key Lookup: 1,457번 테이블 페이지 접근 (랜덤 I/O!)
  → current_1, current_2, current_3, voltage_1, voltage_2, voltage_3 읽기&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;시나리오 3: 커버링 인덱스 ✅&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE INDEX IX_Device_DateTime_Covering 
ON sensor_data(device_id, recorded_at)
INCLUDE (status, current_1, current_2, current_3, 
         voltage_1, voltage_2, voltage_3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;실행 계획&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Index Seek (인덱스 탐색만!)
→ 완료! (테이블 접근 불필요)
→ 매우 빠름&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;성능&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logical Reads: 500-2,000 페이지&lt;/li&gt;
&lt;li&gt;Key Lookup: 0번 ✅&lt;/li&gt;
&lt;li&gt;실행 시간: 1-5초&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;개선&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Key Lookup 제거!
- 모든 컬럼이 인덱스에 있음
- 연속된 페이지 읽기 (Sequential I/O)
- 랜덤 I/O 없음
→ 10-100배 빠름&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;커버링 인덱스 생성 문법&lt;/h2&gt;
&lt;h3&gt;기본 문법&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE [UNIQUE] NONCLUSTERED INDEX index_name
ON table_name (key_column1, key_column2, ...)
INCLUDE (include_column1, include_column2, ...)
[WHERE filter_condition]
[WITH (옵션)];&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;옵션 설명&lt;/h3&gt;
&lt;h4&gt;ONLINE = ON/OFF&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;WITH (ONLINE = ON)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ONLINE = ON&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인덱스 생성 중에도 테이블 사용 가능&lt;/li&gt;
&lt;li&gt;SELECT, INSERT, UPDATE, DELETE 모두 가능&lt;/li&gt;
&lt;li&gt;서비스 중단 없음&lt;/li&gt;
&lt;li&gt;⚠️ Enterprise Edition만 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ONLINE = OFF&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인덱스 생성 중 테이블 잠금&lt;/li&gt;
&lt;li&gt;SELECT만 가능, 쓰기 차단&lt;/li&gt;
&lt;li&gt;Standard Edition도 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;MAXDOP&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;WITH (MAXDOP = 4)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;병렬 처리 프로세서 수 제한&lt;/li&gt;
&lt;li&gt;1: 순차 처리&lt;/li&gt;
&lt;li&gt;4: 4개 CPU 사용&lt;/li&gt;
&lt;li&gt;0: 시스템 최대값 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;FILLFACTOR&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;WITH (FILLFACTOR = 80)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;인덱스 페이지 채움 비율&lt;/li&gt;
&lt;li&gt;80: 20% 여유 공간 (INSERT/UPDATE 성능 향상)&lt;/li&gt;
&lt;li&gt;100: 공간 절약 (읽기 전용 테이블)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;PAD_INDEX&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;WITH (PAD_INDEX = ON, FILLFACTOR = 80)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;FILLFACTOR를 Leaf Level뿐만 아니라 Non-Leaf Level에도 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;실전 예제&lt;/h3&gt;
&lt;h4&gt;1. 기본 커버링 인덱스&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE NONCLUSTERED INDEX IX_sensor_device_datetime_covering
ON sensor_data(device_id, recorded_at)
INCLUDE (status, current_1, current_2, current_3, voltage_1, voltage_2, voltage_3);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 온라인 + 병렬 생성&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE NONCLUSTERED INDEX IX_sensor_device_datetime_covering
ON sensor_data(device_id, recorded_at)
INCLUDE (status, current_1, current_2, current_3, voltage_1, voltage_2, voltage_3)
WITH (ONLINE = ON, MAXDOP = 4);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 필터된 인덱스 (Filtered Index)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- status = &amp;#39;ACTIVE&amp;#39;인 데이터만 인덱싱
CREATE NONCLUSTERED INDEX IX_sensor_device_datetime_active_only
ON sensor_data(device_id, recorded_at)
INCLUDE (current_1, current_2, current_3)
WHERE status = &amp;#39;ACTIVE&amp;#39;
WITH (ONLINE = ON);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;장점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인덱스 크기 대폭 감소 (필터 조건에 맞는 데이터만)&lt;/li&gt;
&lt;li&gt;유지 비용 감소&lt;/li&gt;
&lt;li&gt;특정 쿼리에 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;성능 비교&lt;/h2&gt;
&lt;h3&gt;테스트 환경&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;테이블: sensor_data (500만 건)&lt;/li&gt;
&lt;li&gt;쿼리: 1,457건 조회 (특정 디바이스, 1개월)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;결과&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;Logical Reads&lt;/th&gt;
&lt;th&gt;Physical Reads&lt;/th&gt;
&lt;th&gt;실행 시간&lt;/th&gt;
&lt;th&gt;Key Lookup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;테이블 스캔&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;80,000&lt;/td&gt;
&lt;td&gt;15,000&lt;/td&gt;
&lt;td&gt;150초&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;일반 인덱스&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12,000&lt;/td&gt;
&lt;td&gt;3,000&lt;/td&gt;
&lt;td&gt;45초&lt;/td&gt;
&lt;td&gt;1,457번&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;커버링 인덱스&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,200&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;3초&lt;/td&gt;
&lt;td&gt;0번&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;개선 효과&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;일반 인덱스 → 커버링 인덱스: &lt;strong&gt;15배 빠름&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;테이블 스캔 → 커버링 인덱스: &lt;strong&gt;50배 빠름&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;커버링 인덱스 설계 가이드&lt;/h2&gt;
&lt;h3&gt;1. Key Columns 선택&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;WHERE, JOIN, ORDER BY, GROUP BY에 사용되는 컬럼
→ Key Columns로 설정&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;선택 기준&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;선택도 (Selectivity)&lt;/strong&gt; 높은 순서&lt;ul&gt;
&lt;li&gt;좋음: device_id (디바이스별 구분)&lt;/li&gt;
&lt;li&gt;나쁨: status (&amp;#39;ACTIVE&amp;#39; 또는 &amp;#39;INACTIVE&amp;#39;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;범위 검색 컬럼은 마지막&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;device_id (=) → recorded_at (범위)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. Include Columns 선택&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;SELECT에만 사용되는 컬럼
→ INCLUDE로 설정&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;예시&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT    -- ↓ INCLUDE 후보
    status, current_1, current_2, current_3
FROM sensor_data
WHERE device_id = @id          -- ↓ Key Column
    AND recorded_at &amp;gt;= @start  -- ↓ Key Column
    AND recorded_at &amp;lt;= @end;   -- ↓ Key Column&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 컬럼 순서 최적화&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Key Columns 순서&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 좋은 예: 선택도 높은 순 + 범위 검색 마지막
CREATE INDEX IX_Good 
ON sensor_data(device_id, recorded_at);

-- 나쁜 예: 범위 검색이 먼저
CREATE INDEX IX_Bad 
ON sensor_data(recorded_at, device_id);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;이유&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;좋은 예:
1. device_id = &amp;#39;XXX&amp;#39; (1개 디바이스 선택)
2. recorded_at 범위 스캔 (해당 디바이스 내에서만)

나쁜 예:
1. recorded_at 범위 스캔 (전체에서)
2. device_id 필터링 (이미 많은 데이터 스캔함)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;주의사항 및 트레이드오프&lt;/h2&gt;
&lt;h3&gt;1. 저장 공간&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;커버링 인덱스는 크다!

예시:
- Key Columns: device_id (36), recorded_at (8) = 44 bytes
- Include: 7개 컬럼 × 4 bytes = 28 bytes
- 총: 72 bytes per row

500만 건 × 72 bytes ≈ 360MB&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;대책&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;필요한 컬럼만 INCLUDE&lt;/li&gt;
&lt;li&gt;필터된 인덱스 사용 (WHERE 절)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 쓰기 성능&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;인덱스가 많을수록 INSERT/UPDATE/DELETE 느려짐

각 쓰기 작업마다 인덱스 갱신 필요:
- Key Columns: 정렬 구조 유지
- Include Columns: Leaf Level만 업데이트&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;측정&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 쓰기 성능 테스트
INSERT INTO sensor_data (...) VALUES (...);

-- 인덱스 없음: 10ms
-- 인덱스 5개: 50ms (5배 느림)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;대책&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;읽기 중심 테이블에만 적용&lt;/li&gt;
&lt;li&gt;배치 INSERT 시 인덱스 일시 비활성화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 인덱스 유지 비용&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;조각화 (Fragmentation)
- INSERT/UPDATE/DELETE 반복 시 발생
- 조각화율 30% 이상: 성능 저하&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;해결&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 월 1회 재구성
ALTER INDEX IX_sensor_device_datetime_covering 
ON sensor_data REBUILD WITH (ONLINE = ON);&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;커버링 인덱스 검증&lt;/h2&gt;
&lt;h3&gt;1. 실행 계획 확인&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SET STATISTICS IO ON;
SET SHOWPLAN_ALL ON;

-- 쿼리 실행...

SET SHOWPLAN_ALL OFF;
SET STATISTICS IO OFF;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;확인 포인트&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Index Seek&lt;/strong&gt;: 인덱스 탐색 (좋음)&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Key Lookup&lt;/strong&gt;: 테이블 접근 (나쁨)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Logical Reads &amp;lt; 2000&lt;/strong&gt;: 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 커버링 여부 확인&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 실행 계획 XML에서 확인
SELECT query_plan
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
WHERE query_plan.exist(&amp;#39;//RelOp[@LogicalOp=&amp;quot;Index Seek&amp;quot;]&amp;#39;) = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;커버링 인덱스 사용 시&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;IndexScan&amp;gt;
  &amp;lt;Object Index=&amp;quot;IX_sensor_device_datetime_covering&amp;quot;/&amp;gt;
  &amp;lt;SeekPredicates&amp;gt;...&amp;lt;/SeekPredicates&amp;gt;
  &amp;lt;!-- Key Lookup 없음! --&amp;gt;
&amp;lt;/IndexScan&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 성능 비교&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- Before
DBCC DROPCLEANBUFFERS;  -- 캐시 제거
CHECKPOINT;

SET STATISTICS TIME ON;
-- 쿼리 실행...
SET STATISTICS TIME OFF;

-- After (인덱스 생성 후)
DBCC DROPCLEANBUFFERS;
CHECKPOINT;

SET STATISTICS TIME ON;
-- 쿼리 실행...
SET STATISTICS TIME OFF;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;실전 팁&lt;/h2&gt;
&lt;h3&gt;1. 인덱스 추천 도구 활용&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- Missing Index DMV 확인
SELECT 
    migs.avg_user_impact,
    migs.user_seeks,
    mid.statement AS TableName,
    mid.equality_columns,
    mid.inequality_columns,
    mid.included_columns
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_user_impact &amp;gt; 50
ORDER BY migs.avg_user_impact DESC;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 인덱스 중복 확인&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 중복/유사 인덱스 찾기
SELECT 
    t.name AS TableName,
    i1.name AS Index1,
    i2.name AS Index2,
    &amp;#39;Potential Duplicate&amp;#39; AS Status
FROM sys.indexes i1
INNER JOIN sys.indexes i2 ON i1.object_id = i2.object_id
INNER JOIN sys.tables t ON i1.object_id = t.object_id
WHERE i1.index_id &amp;lt; i2.index_id
    AND i1.type_desc = &amp;#39;NONCLUSTERED&amp;#39;
    AND i2.type_desc = &amp;#39;NONCLUSTERED&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 점진적 적용&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 1단계: 필터된 인덱스로 테스트 (크기 작음)
CREATE INDEX IX_Test 
ON sensor_data(device_id, recorded_at)
INCLUDE (current_1)
WHERE recorded_at &amp;gt;= &amp;#39;2024-09-01&amp;#39;;

-- 2단계: 성능 확인 후 전체 인덱스 생성
CREATE INDEX IX_Final 
ON sensor_data(device_id, recorded_at)
INCLUDE (current_1, current_2, current_3, voltage_1, voltage_2, voltage_3);

-- 3단계: 테스트 인덱스 삭제
DROP INDEX IX_Test ON sensor_data;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;체크리스트&lt;/h2&gt;
&lt;h3&gt;커버링 인덱스 생성 전&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 쿼리 분석 (WHERE, SELECT 컬럼 확인)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 기존 인덱스 확인 (중복 방지)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 디스크 공간 확인&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 실행 계획 확인 (Key Lookup 존재?)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;커버링 인덱스 설계&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Key Columns: WHERE, JOIN, ORDER BY 컬럼&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Include Columns: SELECT만 사용되는 컬럼&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 컬럼 순서: 선택도 높은 순, 범위 검색 마지막&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; ONLINE = ON 옵션 (서비스 중단 방지)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;생성 후 검증&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 실행 계획 확인 (Index Seek만, Key Lookup 없음)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; Logical Reads 감소 확인&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 실행 시간 측정 및 비교&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 인덱스 크기 확인&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&gt; 쓰기 성능 영향 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;참고 자료&lt;/h2&gt;
&lt;h3&gt;Microsoft 공식 문서&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-indexes-with-included-columns&quot;&gt;Create Indexes with Included Columns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide&quot;&gt;Nonclustered Index Design Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;성능 최적화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide&quot;&gt;SQL Server Index Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://use-the-index-luke.com/&quot;&gt;Use The Index, Luke!&lt;/a&gt; - 인덱스 최적화 가이드&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;모니터링&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-index-usage-stats-transact-sql&quot;&gt;sys.dm_db_index_usage_stats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-missing-index-details-transact-sql&quot;&gt;sys.dm_db_missing_index_details&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2438</guid>
      <comments>https://krksap.tistory.com/2438#entry2438comment</comments>
      <pubDate>Tue, 21 Oct 2025 14:43:01 +0900</pubDate>
    </item>
    <item>
      <title>섬기는 자세가 필요하지 않나</title>
      <link>https://krksap.tistory.com/2421</link>
      <description>&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xfX9AdkrH4s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=xfX9AdkrH4s&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=xfX9AdkrH4s&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/jLNTN/hyZGl42Hkt/eVevGny1BTI5P2zfFouqo1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=330_124_982_300,https://scrap.kakaocdn.net/dn/bBWgIZ/hyZGaJdaCL/Kqmb3klIK0nkLBvOe0tGkK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=330_124_982_300&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;백 명이 사는 섬에서 신앙을 지키며 산다는 것은｜소랑도 2부&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/xfX9AdkrH4s&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연고도 없고 얻을 것도 없는 것 같은 섬마을 오지에 부임해서 7년간 목회를 하시는 이 목사님 보면 이런 분들이야 말로 제가 본 받아야 할 삶이 아닌가 다시 생각 해보았습니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2421</guid>
      <comments>https://krksap.tistory.com/2421#entry2421comment</comments>
      <pubDate>Sat, 6 Sep 2025 14:24:38 +0900</pubDate>
    </item>
    <item>
      <title>회사의 부당한 요구? 실력이 먼저다</title>
      <link>https://krksap.tistory.com/2412</link>
      <description>&lt;p data-end=&quot;259&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;취준생 개발자 분들, 현업 주니어 개발자 분들 상처받은 영혼들 무지 많지요. 저도 많이 받았습니다. 지금도 마찬가지구요. 하지만은 극복을 해야하지 않겠습니까?&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;제가 아는 비전공자 한명은 게시판 하나 만드는 데 한 달씩 만들었습니다. 기능도 그리 복잡하지 않았어요. 그냥 글을 쓰고, 읽는 정도의 단순한 구조였고, 로그인 기능조차 없었습니다. 그런데도 겨우 한달 걸려서 힘들게 만들었지요. 알고리즘도 잘 못했습니다. 알고리즘 레벨1 문제 하나 푸는데 1주일 걸렸습니다. PostFix계산기 만드는 거였는데 겨울방학 한달을 내내 보냈지요.&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;이런 인원들 저 포함 제 주변에 여럿 있습니다. 지금은 개발자, 인프라엔지니어, PM 다 한자리씩 하고 있습니다. 운이 좋아서 그런것도 있지만 시간을 엄청나게 썼습니다. 퇴근후, 주말 가리지 않고요.&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;160&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;300&quot; data-start=&quot;261&quot; data-ke-size=&quot;size16&quot;&gt;이 인원들 지금은 한 달이 주어지면, 하나의 프로젝트를 완성할 수 있는 수준이 되었죠. 규모가 더 크다면 인력을 더 쓰면서요.&lt;/p&gt;
&lt;p data-end=&quot;460&quot; data-start=&quot;358&quot; data-ke-size=&quot;size16&quot;&gt;이 글을 쓰는 이유는, 신입 개발자분들 사이에서 취업이 안된다, 회사가 부당하게 대우한다 이런 이야기를 자주 듣기 때문입니다.&lt;/p&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;462&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;462&quot; data-ke-size=&quot;size16&quot;&gt;하지만 조금만 시야를 바꿔 보면 어떨까요?&lt;/p&gt;
&lt;p data-end=&quot;638&quot; data-start=&quot;487&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지금의 연봉보다 더 중요한 건, 앞으로 올라갈 가능성과 그 속도입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;638&quot; data-start=&quot;487&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;638&quot; data-start=&quot;487&quot; data-ke-size=&quot;size16&quot;&gt;최저시급보다 낮은 대우를 받으며, 매일 야근하고 주말까지 일한 2~3년. 물론, 회사가 부당한 요구를 하는 경우도 있겠죠.&lt;br /&gt;하지만 그 전에 먼저 스스로에게 질문해봤으면 합니다.&lt;/p&gt;
&lt;p data-end=&quot;734&quot; data-start=&quot;701&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;나는 지금 어떤 퍼포먼스를 낼 수 있는 사람인가?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;804&quot; data-start=&quot;736&quot; data-ke-size=&quot;size16&quot;&gt;외부 환경을 탓하기 전에, 나의 성장과 실력을 먼저 돌아보는 것.&lt;br /&gt;그게 진짜 실력 있는 개발자로 가는 첫걸음 아닐까요?&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2412</guid>
      <comments>https://krksap.tistory.com/2412#entry2412comment</comments>
      <pubDate>Sun, 3 Aug 2025 00:52:37 +0900</pubDate>
    </item>
    <item>
      <title>개발자 신입과 주니어를 나누는 기준 - 안정성에 대한 생각을 하는지?</title>
      <link>https://krksap.tistory.com/2410</link>
      <description>&lt;p data-end=&quot;256&quot; data-start=&quot;81&quot; 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;저는 이 문제에 대해 오랫동안 고민해 왔습니다. 그러던 중 오늘 『모던 소프트웨어 엔지니어링』(데이비드 팔리, 2025)을 읽다가 그 개념을 명확히 정리해 준 내용을 보고 &quot;바로 이거다!&quot; 싶어 이렇게 포스트를 남깁니다.&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-end=&quot;287&quot; data-start=&quot;208&quot; data-ke-size=&quot;size16&quot;&gt;저는 &lt;b&gt;&amp;lsquo;안정성&amp;rsquo;&lt;/b&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;변경 실패율&lt;/b&gt; change failure rate: 코드 수정했는데 문제 생긴 비율 &lt;br /&gt;&lt;b&gt;복구&amp;nbsp;실패&amp;nbsp;시간&amp;nbsp;&lt;/b&gt;recovery&amp;nbsp;failure&amp;nbsp;time:&amp;nbsp;실패한&amp;nbsp;뒤&amp;nbsp;복구까지의&amp;nbsp;시간&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;b&gt;&quot;코드를 수정했을 때 문제를 일으키는 비율이 낮아야 한다&quot;&lt;/b&gt;는 점입니다.&lt;br /&gt;코드 변경에서 문제가 생기는 주된 이유는 한번 돌아가는데에만 집중해서 만들기 때문입니다. 바꾸어 말하면 &lt;b&gt;원칙을 지키지 않고 개발했다&lt;/b&gt;는 의미입니다.&lt;br /&gt;지켜야 할 원칙은 여러 가지가 있겠지만, 그중 하나를 꼽자면 바로 &lt;b&gt;단일 책임 원칙(SRP: Single Responsibility Principle)&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;230&quot; data-start=&quot;83&quot; data-ke-size=&quot;size16&quot;&gt;함수 하나가 파싱도 하고, 비즈니스 로직도 수행하고, DB 입출력까지 처리하는 식으로 코드를 작성하는 경우가 많습니다. 하지만 이러한 역할들은 &lt;b&gt;Parser&lt;/b&gt;, &lt;b&gt;Service&lt;/b&gt;, &lt;b&gt;Repository&lt;/b&gt;로 분리하여 각각의 책임을 적절히 나누어야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;464&quot; data-start=&quot;232&quot; 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;&amp;nbsp;간호사에 비유하자면, 주사를 놓는 일과 비슷하다고 볼 수 있습니다. 쉬워 보일 수 있지만, 실제로는 혈관을 찾고, 정확하게 바늘을 꽂아야 하며, 압력도 고려해야 하고, 경우에 따라 환자의 혈압도 확인해야 하죠. 또한 투여하는 약물이 어떤 것인지도 잘 알고 있어야 합니다. 이처럼 단순해 보이는 일도 실제로는 많은 전문성과 주의가 필요한 작업입니다.&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;&amp;nbsp;&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;a href=&quot;https://jusths.tistory.com/m/465&quot;&gt;https://jusths.tistory.com/m/465&lt;/a&gt;&lt;/p&gt;</description>
      <author>KyeongRok Kim</author>
      <guid isPermaLink="true">https://krksap.tistory.com/2410</guid>
      <comments>https://krksap.tistory.com/2410#entry2410comment</comments>
      <pubDate>Wed, 30 Jul 2025 08:02:45 +0900</pubDate>
    </item>
  </channel>
</rss>