<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on 42Class</title><link>https://42class.com/posts/</link><description>Recent content in Posts on 42Class</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Sun, 05 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://42class.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>21/01/18</title><link>https://42class.com/posts/21/01/18/</link><pubDate>Mon, 18 Jan 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/21/01/18/</guid><description>&lt;p&gt;&lt;img src="https://42class.com/img/210118.JPG" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;</description></item><item><title>Meetnote 개발 회고 — 로컬 회의록 자동화 Obsidian 플러그인</title><link>https://42class.com/posts/meetnote-retrospective/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>https://42class.com/posts/meetnote-retrospective/</guid><description>&lt;h2 id="왜-만들었나"&gt;왜 만들었나
&lt;/h2&gt;&lt;p&gt;회의가 끝나고 나면 항상 같은 고민이 반복됐다. &amp;ldquo;누가 뭐라고 했더라?&amp;rdquo; 회의록을 작성하자니 회의에 집중이 안 되고, 녹음만 해두면 다시 듣기가 귀찮다. 기존 SaaS 서비스들은 비용도 문제지만, 회의 내용이 외부 서버로 나가는 것 자체가 부담스러웠다.&lt;/p&gt;
&lt;p&gt;그리고 결정적인 이유가 하나 더 있었다. 지금 모든 업무 문서를 Obsidian에서 마크다운으로 관리하고 있는데, 이건 AX(AI Transformation) 관점에서 매우 중요한 선택이었다. &lt;strong&gt;마크다운은 AI 에이전트에게 전달하기 가장 좋은 포맷이다.&lt;/strong&gt; 회의록도 마크다운으로 생성되면 별도 서비스에서 옮기는 번거로움 없이, 다른 업무 문서들과 함께 한 곳에서 관리할 수 있다. 에이전트가 과거 회의 맥락을 참조하고, 액션 아이템을 추적하고, 관련 문서를 연결하는 것까지 자연스럽게 이어진다.&lt;/p&gt;
&lt;p&gt;그래서 만들었다. &lt;strong&gt;완전히 로컬에서 동작하는 회의록 자동화 도구.&lt;/strong&gt; 비용 0원, 오프라인 가능, GPU 가속. 그리고 결과물은 Obsidian Vault 안의 마크다운 파일.&lt;/p&gt;
&lt;h2 id="무엇을-만들었나"&gt;무엇을 만들었나
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/changsu-jin/meetnote" target="_blank" rel="noopener"
 &gt;Meetnote&lt;/a&gt;는 Obsidian 플러그인 + Python 백엔드로 구성된 로컬 회의록 자동화 도구다.&lt;/p&gt;
&lt;p&gt;핵심 기능:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;실시간 음성 인식&lt;/strong&gt; — Whisper large-v3-turbo, 5초 단위 스트리밍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;화자 분리&lt;/strong&gt; — pyannote 3.1, GPU 자동 감지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;화자 식별&lt;/strong&gt; — 임베딩 DB 기반, 회의할수록 정확도 향상&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 요약&lt;/strong&gt; — Claude CLI / Ollama, 액션 아이템 자동 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이메일 발송&lt;/strong&gt; — 참석자별 회의록 HTML 메일&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;암호화&lt;/strong&gt; — AES 암호화, 자동 삭제, 감사 로그&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apple Silicon 기준 60분 회의를 약 5분 만에 처리한다.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/meetnote-screenshot.png" alt="Meetnote 실제 사용 화면" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;h2 id="기술-스택"&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Plugin&lt;/td&gt;
 &lt;td&gt;TypeScript, Obsidian API, Web Audio API&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Backend&lt;/td&gt;
 &lt;td&gt;Python, FastAPI, WebSocket&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;STT&lt;/td&gt;
 &lt;td&gt;mlx-whisper (Apple Silicon), faster-whisper (CPU)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;화자 분리&lt;/td&gt;
 &lt;td&gt;pyannote.audio 3.1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;화자 임베딩&lt;/td&gt;
 &lt;td&gt;wespeaker-voxceleb-resnet34-LM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AI 요약&lt;/td&gt;
 &lt;td&gt;Claude CLI, Ollama&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;배포&lt;/td&gt;
 &lt;td&gt;Docker, GitHub Actions, GHCR&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="아키텍처"&gt;아키텍처
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────┐ WebSocket (PCM 16kHz) ┌──────────────┐
│ Obsidian │ ──────────────────────────────▶│ FastAPI │
│ Plugin │◀────────────── JSON ──────────│ Backend │
│ (TS) │ │ (Python) │
└─────────────┘ └──────┬───────┘
 │
 ┌─────────────────┼─────────────────┐
 │ │ │
 ┌─────▼─────┐ ┌──────▼──────┐ ┌──────▼──────┐
 │ Whisper │ │ pyannote │ │ Speaker │
 │ STT │ │ Diarizer │ │ Embedding │
 └───────────┘ └─────────────┘ └─────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Plugin이 Web Audio API로 마이크 음성을 캡처해서 5초 단위로 WebSocket을 통해 바이너리 전송한다. 백엔드는 Whisper로 실시간 전사하고, 녹음 종료 후 pyannote로 화자 분리를 수행한다. 전사 결과와 화자 분리 결과를 시간 기반으로 병합해서 &amp;ldquo;누가 무슨 말을 했는지&amp;rdquo; 최종 결과를 만든다.&lt;/p&gt;
&lt;h2 id="개발-과정에서-마주친-문제들"&gt;개발 과정에서 마주친 문제들
&lt;/h2&gt;&lt;h3 id="1-mlx-vs-faster-whisper--플랫폼별-분기"&gt;1. MLX vs faster-whisper — 플랫폼별 분기
&lt;/h3&gt;&lt;p&gt;Apple Silicon에서는 MLX가 압도적으로 빠르지만, Linux/CUDA 환경에서는 faster-whisper가 낫다. 처음에는 하나로 통일하려 했지만, 성능 차이가 너무 커서 런타임에 플랫폼을 감지하고 분기하는 방식을 택했다.&lt;/p&gt;
&lt;h3 id="2-화자-분리와-전사-결과-병합"&gt;2. 화자 분리와 전사 결과 병합
&lt;/h3&gt;&lt;p&gt;Whisper와 pyannote는 독립적으로 동작한다. 둘의 타임스탬프가 정확히 일치하지 않기 때문에, 시간 구간의 최대 겹침(temporal overlap)을 기준으로 화자를 배정했다. 같은 화자의 연속 발언은 5초 이내 간격이면 하나로 합친다.&lt;/p&gt;
&lt;h3 id="3-환각hallucination-필터링"&gt;3. 환각(Hallucination) 필터링
&lt;/h3&gt;&lt;p&gt;Whisper는 가끔 무음 구간에서 환각을 일으킨다. &lt;code&gt;no_speech_prob&lt;/code&gt;과 &lt;code&gt;compression_ratio&lt;/code&gt;를 기준으로 품질 필터를 넣어 해결했다. LLM 기반 전사 보정도 추가했는데, 고유명사나 전문 용어의 정확도가 체감될 정도로 올라갔다.&lt;/p&gt;
&lt;h3 id="4-동시-녹음-세션-처리"&gt;4. 동시 녹음 세션 처리
&lt;/h3&gt;&lt;p&gt;Transcriber와 Diarizer는 GPU 메모리를 많이 쓰기 때문에 싱글톤으로 관리한다. 하지만 여러 사용자가 동시에 녹음할 수 있어야 하므로, WebSocket 세션별로 격리하되 공유 리소스는 Lock으로 보호하는 구조로 만들었다.&lt;/p&gt;
&lt;h3 id="5-docker-빌드-최적화"&gt;5. Docker 빌드 최적화
&lt;/h3&gt;&lt;p&gt;처음 Docker 빌드는 46분이 걸렸다. PyTorch + pyannote 의존성이 무거웠기 때문이다. base 이미지와 app 이미지를 분리하고, GitHub Actions에서 base 이미지를 캐싱하는 방식으로 빌드 시간을 3분까지 줄였다. 이후 추가 최적화로 1분대까지 단축했다.&lt;/p&gt;
&lt;h2 id="누적-학습--화자-임베딩-db"&gt;누적 학습 — 화자 임베딩 DB
&lt;/h2&gt;&lt;p&gt;가장 만족스러운 기능이다. 회의에서 새로운 화자가 감지되면 임베딩 벡터를 자동 저장한다. 다음 회의에서 코사인 유사도(임계값 0.70)로 기존 화자와 매칭한다. 회의를 할수록 화자 인식 정확도가 올라가는 구조다.&lt;/p&gt;
&lt;h2 id="타임라인"&gt;타임라인
&lt;/h2&gt;&lt;p&gt;집중적으로 작업한 건 약 일주일. 115개 커밋, 혼자서 기획부터 배포까지.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phase 0&lt;/strong&gt; — MVP: 실시간 전사, 화자 분리, 요약, 암호화, RAG 검색&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase 1&lt;/strong&gt; — 안정화: 버그 수정, 환각 필터, 품질 최적화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase 2&lt;/strong&gt; — UX: 사이드 패널, 화자 관리 UI, 이메일, 원클릭 설치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase 3&lt;/strong&gt; — 배포: Docker, GHA 캐싱, 온보딩 모달, 보안 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="돌아보며"&gt;돌아보며
&lt;/h2&gt;&lt;p&gt;일주일이라는 짧은 기간이었지만, &amp;ldquo;내가 직접 쓸 도구&amp;quot;를 만드는 과정이라 몰입도가 높았다. 특히 화자 임베딩 DB의 누적 학습은 쓸수록 똑똑해지는 느낌이 있어서 뿌듯하다.&lt;/p&gt;
&lt;p&gt;아쉬운 점은 Windows 네이티브 지원이 아직 Docker(WSL2) 의존이라는 것. 그리고 CPU 환경에서는 60분 회의 처리에 40분이 걸려서 실용성이 떨어진다.&lt;/p&gt;
&lt;p&gt;다음 목표는 웹 기반 대시보드와 팀 단위 화자 DB 공유 기능이다.&lt;/p&gt;
&lt;hr&gt;
&lt;div style="background: linear-gradient(135deg, #24292e 0%, #40464d 100%); border-radius: 12px; padding: 24px 32px; text-align: center; margin-top: 32px;"&gt;
 &lt;p style="color: #f0f0f0; font-size: 1.2em; margin-bottom: 12px; font-weight: bold;"&gt;Meetnote — 로컬 회의록 자동화&lt;/p&gt;
 &lt;p style="color: #8b949e; font-size: 0.9em; margin-bottom: 16px;"&gt;Obsidian plugin for local meeting transcription, speaker diarization, and AI summarization&lt;/p&gt;
 &lt;a href="https://github.com/changsu-jin/meetnote" style="display: inline-block; background: #238636; color: white; padding: 10px 24px; border-radius: 8px; text-decoration: none; font-weight: bold; font-size: 1em;"&gt;GitHub에서 보기 →&lt;/a&gt;
&lt;/div&gt;</description></item><item><title>21/06/25</title><link>https://42class.com/posts/21/06/25/</link><pubDate>Fri, 25 Jun 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/21/06/25/</guid><description>&lt;p&gt;&lt;img src="https://42class.com/img/image-20210625110355562.png" alt="image-20210625110355562" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;</description></item><item><title>Choose Your Own Adventure 모험, 나의 선택 - Hernan Bas</title><link>https://42class.com/posts/choose-your-own-adventure-%EB%AA%A8%ED%97%98-%EB%82%98%EC%9D%98-%EC%84%A0%ED%83%9D-hernan-bas/</link><pubDate>Sun, 23 May 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/choose-your-own-adventure-%EB%AA%A8%ED%97%98-%EB%82%98%EC%9D%98-%EC%84%A0%ED%83%9D-hernan-bas/</guid><description>&lt;h2 id="space-k-seoul-20210522"&gt;SPACE K SEOUL 2021.05.22
&lt;/h2&gt;&lt;p&gt;BTS RM도 다녀갔다는 Hernan Bas 전시 ㅎㅎ&lt;br&gt;
강서구민은 할인도 되네요.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://www.artinculture.kr/online/1096" target="_blank" rel="noopener"
 &gt;헤르난 바스 인터뷰&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://www.spacek.co.kr/index.do" target="_blank" rel="noopener"
 &gt;SPACE K&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/hernanbas/1.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/hernanbas/2.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/hernanbas/3.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/hernanbas/4.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/hernanbas/5.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/hernanbas/6.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/hernanbas/7.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/hernanbas/8.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/w0K1mH5D5XY" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt; 
왜 저기까지 올라가서 뛰어 내려오는지는 알수가 없네...</description></item><item><title>RDP(Mac to Windows)환경에서 Mac OS환경과 동일한 단축키 사용하기</title><link>https://42class.com/posts/rdpmac-to-windows%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-mac-os%ED%99%98%EA%B2%BD%EA%B3%BC-%EB%8F%99%EC%9D%BC%ED%95%9C-%EB%8B%A8%EC%B6%95%ED%82%A4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/</link><pubDate>Sat, 22 May 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/rdpmac-to-windows%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-mac-os%ED%99%98%EA%B2%BD%EA%B3%BC-%EB%8F%99%EC%9D%BC%ED%95%9C-%EB%8B%A8%EC%B6%95%ED%82%A4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/</guid><description>&lt;h2 id="개발은-mac-os에서-하는데-운영-데이터-조회는-windows에서-해야-하네"&gt;개발은 Mac OS에서 하는데 운영 데이터 조회는 Windows에서 해야 하네&amp;hellip;
&lt;/h2&gt;&lt;p&gt;운영을 하다 보면 DB에 접근해서 데이터 확인을 해야 할 일이 빈번한데 DB에 접근 가능한 환경이 윈도우 기반인 경우가 있습니다.&lt;br&gt;
개발 작업은 주로 Mac에서 진행을 하고 있고 어쩔 수 없이 RDP를 이용해 원격접속을 이용합니다.&lt;br&gt;
저 같은 경우 SQL작성 시에 주로 사용하는 프로그램은 &lt;a class="link" href="https://dbeaver.io/" target="_blank" rel="noopener"
 &gt;DBeaver&lt;/a&gt;입니다.&lt;br&gt;
&lt;a class="link" href="https://dbeaver.io/" target="_blank" rel="noopener"
 &gt;DBeaver&lt;/a&gt;는 &lt;strong&gt;Mac OS&lt;/strong&gt;버전과 &lt;strong&gt;Windows&lt;/strong&gt;버전이 있고 자주 사용하는 단축키는 아래 표와 같이 미묘하게 다릅니다.&lt;br&gt;
그래서 두 가지 환경을 수시로 전환하면서 쿼리를 짜다보면 &lt;span style="color:orange"&gt;생산성이 떨어지고 짜증이 치밀어 오릅니다. &lt;/span&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;Command&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Mac OS&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Windows&lt;/th&gt;
 &lt;th style="text-align: center"&gt;RDP(Mac to Windows)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Home&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ←&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ←&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ←&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;End&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + →&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + →&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + →&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Page Up&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ↑&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ↑&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ↑&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Page Down&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ↓&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ↓&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ↓&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Copy&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + C&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Paste&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + V&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + V&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Cut&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + X&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + X&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + X&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Undo&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + Z&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + Z&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + Z&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;한영전환&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Right ⌘&lt;/td&gt;
 &lt;td style="text-align: center"&gt;한/영&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Right ⌥&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;span style="color:yellow"&gt; &lt;strong&gt;Mac OS&lt;/strong&gt; 환경의 단축키와 &lt;strong&gt;RDP(Mac to Windows)&lt;/strong&gt; 환경의 단축키를 맞추고 싶다!! &lt;/span&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;RDP(Mac to Windows)&lt;/strong&gt; 에서 한참동안 작업하다가 단축키가 손에 익은 상태에서 &lt;strong&gt;Mac OS&lt;/strong&gt;로 돌아오면 버벅대고 &lt;strong&gt;Mac OS&lt;/strong&gt;에서 한 동안 로컬 개발하다가 &lt;strong&gt;RDP(Mac to Windows)&lt;/strong&gt; 에서 운영하면 또 버벅대고..
하여간 환경 전환 때마다 계속 버벅이게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;span style="color:orange"&gt;도저히 이렇게는 못해먹겠다 싶어 방법을 찾아보았습니다.&lt;/span&gt;&lt;br&gt;
단축키를 한 쪽 환경에 맞춰야 겠다고 생각했고, 자주 사용하는 &lt;strong&gt;Mac OS&lt;/strong&gt;환경에 단축키를 맞추기로 했습니다.&lt;/p&gt;
&lt;h2 id="먼저-한영-전환부터"&gt;먼저 한/영 전환부터
&lt;/h2&gt;&lt;p&gt;저는 &lt;strong&gt;Mac OS&lt;/strong&gt;에서 한영전환을 우측 **Right ⌘**키를 사용하고 있습니다.&lt;br&gt;
지금은 Mac을 사용하고 있지만 예전에 오랫동안 Windows를 사용 했었습니다.&lt;br&gt;
스페이스 바로 우측 옆에 키가 한영전환으로 사용되는 거에 너무 익숙합니다.&lt;br&gt;
그래서 맥을 사용 하면서도 처음부터 그렇게 매핑해두고 사용하고 있습니다.&lt;br&gt;
딱히 Mac을 사용할 때 우측 **Right ⌘**키를 사용하는 경우가 거의 없기도 하구요.&lt;/p&gt;
&lt;p&gt;하지만 &lt;strong&gt;RDP(Mac to Windows)&lt;/strong&gt; 에서는 한영전환이 **Right ⌥**키로 매핑됩니다.&lt;br&gt;
바로 한 칸 차이 지만 실제 몰두 해서 타이핑 할 때 요 한칸 차이 땜에 엄청 버벅이고 있더군요.&lt;br&gt;
그래서 &lt;a class="link" href="https://karabiner-elements.pqrs.org/" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;Karabiner&lt;/strong&gt;&lt;/a&gt;를 이용해 &lt;span style="color:orange"&gt;RDP전용 Profile을 하나 만들고 해당 Profile에선 **Right ⌘**키와 **Right ⌥**키를 서로 스위칭&lt;/span&gt; 했습니다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Karabiner Profile 추가&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/profile-add.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;한영전환 Key Remapping&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/comman-option-switch.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;한영전환 변경 후 Key Mapping 상태&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;Command&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Mac OS&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Windows&lt;/th&gt;
 &lt;th style="text-align: center"&gt;RDP(Mac to Windows)&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Karabiner RDP Profile&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Home&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ←&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ←&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ←&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;End&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + →&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + →&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + →&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Page Up&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ↑&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ↑&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ↑&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Page Down&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ↓&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ↓&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ↓&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Copy&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + C&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Paste&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + V&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + V&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + V&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Cut&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + X&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + X&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + X&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Undo&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + Z&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + Z&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + Z&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;한영전환&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Right ⌘&lt;/td&gt;
 &lt;td style="text-align: center"&gt;한/영&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Right ⌥&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;Right ⌘&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="rdp-client-tool-옵션의-한계-그리고-fnmac키와-키를-스위칭"&gt;RDP Client tool 옵션의 한계 그리고 Fn(Mac)키와 ⌘키를 스위칭
&lt;/h2&gt;&lt;p&gt;Mac을 사용하면서 Copy,Paste 등은 항상 &lt;strong&gt;⌘+C,⌘+V&lt;/strong&gt;를 사용합니다.&lt;br&gt;
RDP Client에서도 이 부분을 잘 알고 있어서인지, Client tool에서 옵션으로 제공합니다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;RDP Client 설정 (참고로 &lt;strong&gt;RDP(Mac to Windows)&lt;/strong&gt; 에서 **⌘**키는 &lt;strong&gt;Windows Key&lt;/strong&gt;로 인식합니다.)&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/rdp-client.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;하지만 &lt;span style="color:orange"&gt;아쉽게도 &lt;strong&gt;⌘ + 방향키&lt;/strong&gt; 조합으로 Home,End,Page Up,Page Down을 사용하는 부분까지는 지원되지 않습니다.&lt;/span&gt;&lt;br&gt;
애초에 &lt;span style="color:orange"&gt;목적은 &lt;strong&gt;RDP(Mac to Windows)&lt;/strong&gt; 에서도 &lt;strong&gt;Mac OS&lt;/strong&gt;와 완전히 동일한 단축키 구성을 맞추는 것&lt;/span&gt;입니다.&lt;br&gt;
그래서 &lt;strong&gt;Fn(Mac)&lt;/strong&gt; 키와 &lt;strong&gt;Left ⌘&lt;/strong&gt; 키를 스위칭 했습니다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Fn(Mac) 과 Left ⌘ 스위칭&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/arrow-key.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;h2 id="karabiner-complex-modification을-이용하여-copypaste-등-자주-사용하는-단축키만-remapping"&gt;karabiner Complex Modification을 이용하여 Copy,Paste 등 자주 사용하는 단축키만 Remapping
&lt;/h2&gt;&lt;p&gt;&lt;span style="color:orange"&gt; &lt;strong&gt;Fn(Mac)&lt;/strong&gt; 키와 &lt;strong&gt;Left ⌘&lt;/strong&gt; 키가 스위칭 됨에 따라 &lt;strong&gt;Fn(Mac)+C,Fn(Mac)+V&lt;/strong&gt;로 바뀌어 버린 Copy,Paste를 &lt;strong&gt;karabiner Complex Modification&lt;/strong&gt;기능을 이용해 &lt;strong&gt;⌘+C,⌘+V&lt;/strong&gt; 로 재설정 해주었습니다.&lt;/span&gt;&lt;br&gt;
스위칭을 하지 않고 &lt;strong&gt;⌘+방향키&lt;/strong&gt; 를 Home,End,Page Up,Page Down으로 매핑해줄수도 있습니다.&lt;br&gt;
하지만 &lt;strong&gt;⌘+방향키&lt;/strong&gt;조합은 이미 Mac OS에서 사용하는 단축키라서 스위칭 후 Fn키에 매핑하는 방식으로 진행했습니다.&lt;br&gt;
설정방법은 아래 링크와 캡처화면 및 코드 참고하시어 진행하시면 됩니다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;karabiner에서 제공하는 문서입니다. &lt;a class="link" href="https://karabiner-elements.pqrs.org/docs/json/typical-complex-modifications-examples" target="_blank" rel="noopener"
 &gt;complex modifications example&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;이미 저장소엔 여러 사람들이 올려 둔 karabiner Complex Modification Rule이 있습니다. &lt;a class="link" href="https://ke-complex-modifications.pqrs.org" target="_blank" rel="noopener"
 &gt;Rule Repostory&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/rules-repository.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Rule은 Json형태로 구성됩니다. &lt;a class="link" href="https://genesy.github.io/karabiner-complex-rules-generator" target="_blank" rel="noopener"
 &gt;Rule Generator&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/rule-generator.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;아래 코드는 제가 작성해서 적용한 cut, copy, paste, undo Rule의 code입니다.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;RDP cut, copy, paste, undo&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Fn+x &amp;gt; Cmd+x&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;manipulators&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;fn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Fn+c &amp;gt; Cmd+c&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;manipulators&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;fn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Fn+v &amp;gt; Cmd+v&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;manipulators&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;v&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;fn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;v&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Fn+z &amp;gt; Cmd+z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;manipulators&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;fn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이 코드는 아래 링크로 Generator에 바로 접근할 수도 있습니다.&lt;br&gt;
&lt;a class="link" href="https://genesy.github.io/karabiner-complex-rules-generator/#eyJ0aXRsZSI6IlJEUCBjdXQsIGNvcHksIHBhc3RlLCB1bmRvIiwicnVsZXMiOlt7ImRlc2NyaXB0aW9uIjoiRm4reCA&amp;#43;IENtZCt4IiwibWFuaXB1bGF0b3JzIjpbeyJmcm9tIjp7ImtleV9jb2RlIjoieCIsIm1vZGlmaWVycyI6eyJtYW5kYXRvcnkiOlsiZm4iXX19LCJ0byI6W3sia2V5X2NvZGUiOiJ4IiwibW9kaWZpZXJzIjpbImNvbW1hbmQiXX1dLCJ0eXBlIjoiYmFzaWMifV19LHsiZGVzY3JpcHRpb24iOiJGbitjID4gQ21kK2MiLCJtYW5pcHVsYXRvcnMiOlt7ImZyb20iOnsia2V5X2NvZGUiOiJjIiwibW9kaWZpZXJzIjp7Im1hbmRhdG9yeSI6WyJmbiJdfX0sInRvIjpbeyJrZXlfY29kZSI6ImMiLCJtb2RpZmllcnMiOlsiY29tbWFuZCJdfV0sInR5cGUiOiJiYXNpYyJ9XX0seyJkZXNjcmlwdGlvbiI6IkZuK3YgPiBDbWQrdiIsIm1hbmlwdWxhdG9ycyI6W3siZnJvbSI6eyJrZXlfY29kZSI6InYiLCJtb2RpZmllcnMiOnsibWFuZGF0b3J5IjpbImZuIl19fSwidG8iOlt7ImtleV9jb2RlIjoidiIsIm1vZGlmaWVycyI6WyJjb21tYW5kIl19XSwidHlwZSI6ImJhc2ljIn1dfSx7ImRlc2NyaXB0aW9uIjoiRm4reiA&amp;#43;IENtZCt6IiwibWFuaXB1bGF0b3JzIjpbeyJ0eXBlIjoiYmFzaWMiLCJmcm9tIjp7Im1vZGlmaWVycyI6eyJtYW5kYXRvcnkiOlsiZm4iXX0sImtleV9jb2RlIjoieiJ9LCJ0byI6W3sia2V5X2NvZGUiOiJ6IiwibW9kaWZpZXJzIjpbImNvbW1hbmQiXX1dfV19XX0=" target="_blank" rel="noopener"
 &gt;RDP cut, copy, paste, undo&lt;/a&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;생성한 룰은 Install하여 Karabiner에 적용합니다.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/rule-add.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;설정 후 &lt;strong&gt;Mac OS&lt;/strong&gt; 와 &lt;strong&gt;RDP Profile&lt;/strong&gt;모든 단축키 구성이 같아졌습니다.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;Command&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Mac OS&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Windows&lt;/th&gt;
 &lt;th style="text-align: center"&gt;RDP(Mac to Windows)&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Karabiner RDP Profile&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Home&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ←&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ←&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ←&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;⌘ + ←&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;End&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + →&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + →&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + →&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;⌘ + →&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Page Up&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ↑&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ↑&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ↑&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;⌘ + ↑&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Page Down&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + ↓&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Win) + ↓&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Fn(Mac) + ↓&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;⌘ + ↓&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Copy&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;⌘ + C&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Paste&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + V&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + V&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + V&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;⌘ + V&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Cut&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + X&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + X&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + X&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;⌘ + X&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;Undo&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + Z&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Ctrl + Z&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⌘ + Z&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;span style="color:yellow"&gt;⌘ + Z&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;한영전환&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Right ⌘&lt;/td&gt;
 &lt;td style="text-align: center"&gt;한/영&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Right ⌥&lt;/td&gt;
 &lt;td style="text-align: center"&gt;Right ⌘&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이제 모든 설정이 끝났습니다.&lt;br&gt;
앞으로는 &lt;span style="color:orange"&gt;원격접속시에는 Karabiner Profile을 &lt;strong&gt;RDP Profile&lt;/strong&gt;로 변경해서 사용하면 &lt;strong&gt;Mac OS&lt;/strong&gt;와 완전히 동일한 단축키 구성&lt;/span&gt;으로 사용할 수 있습니다.&lt;/p&gt;
&lt;h2 id="karabiner-profile-전환의-불편함"&gt;karabiner Profile 전환의 불편함
&lt;/h2&gt;&lt;p&gt;그런데 여기까지 진행하고 보니 Karabiner의 Profile 전환이 불편해졌습니다.&lt;br&gt;
항상 상단바의 아이콘을 클릭하여 Profile을 전환 해야 했습니다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;항상 상단 바로 이동해서 Profile을 변경하는 건 너무 불편하다.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/profile-change.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;상단 바에 Profile명은 기본으로 노출 되지 않습니다.(옵션을 변경해야 합니다.)&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://42class.com/img/show-profile.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;Profile 전환도 Complex Modification을 이용하여 단축키 지정이 가능합니다.&lt;br&gt;
&lt;span style="color:orange"&gt;Karabiner cli명령어를 이용하여 프로필 전환 단축키&lt;/span&gt;를 만들 수 있었습니다.&lt;br&gt;
아래는 제가 Profile 전환에 사용한 Rule입니다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Switch profile (RDP -&amp;gt; Default)&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Change Profile&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Press left-shift+caps_lock to enable default profile&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;manipulators&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;caps_lock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;shell_command&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;&amp;#39;/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli&amp;#39; --select-profile &amp;#39;Default&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://genesy.github.io/karabiner-complex-rules-generator/#eyJ0aXRsZSI6IkNoYW5nZSBQcm9maWxlIiwicnVsZXMiOlt7ImRlc2NyaXB0aW9uIjoiUHJlc3MgbGVmdC1zaGlmdCtjYXBzX2xvY2sgdG8gZW5hYmxlIGRlZmF1bHQgcHJvZmlsZSIsIm1hbmlwdWxhdG9ycyI6W3sidHlwZSI6ImJhc2ljIiwiZnJvbSI6eyJtb2RpZmllcnMiOnsibWFuZGF0b3J5IjpbImxlZnRfc2hpZnQiXX0sImtleV9jb2RlIjoiY2Fwc19sb2NrIn0sInRvIjpbeyJzaGVsbF9jb21tYW5kIjoiJy9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvb3JnLnBxcnMvS2FyYWJpbmVyLUVsZW1lbnRzL2Jpbi9rYXJhYmluZXJfY2xpJyAtLXNlbGVjdC1wcm9maWxlICdEZWZhdWx0JyJ9XX1dfV19" target="_blank" rel="noopener"
 &gt;Switch profile (RDP -&amp;gt; Default)&lt;/a&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Switch profile (Default -&amp;gt; RDP)&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Change Profile&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Press left-shift+caps_lock to enable RDP profile&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;manipulators&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;mandatory&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#34;left_shift&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;caps_lock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;&amp;#34;shell_command&amp;#34;&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;&amp;#39;/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli&amp;#39; --select-profile &amp;#39;RDP&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://genesy.github.io/karabiner-complex-rules-generator/#eyJ0aXRsZSI6IkNoYW5nZSBQcm9maWxlIiwicnVsZXMiOlt7ImRlc2NyaXB0aW9uIjoiUHJlc3MgbGVmdC1zaGlmdCtjYXBzX2xvY2sgdG8gZW5hYmxlIFJEUCBwcm9maWxlIiwibWFuaXB1bGF0b3JzIjpbeyJ0eXBlIjoiYmFzaWMiLCJmcm9tIjp7Im1vZGlmaWVycyI6eyJtYW5kYXRvcnkiOlsibGVmdF9zaGlmdCJdfSwia2V5X2NvZGUiOiJjYXBzX2xvY2sifSwidG8iOlt7InNoZWxsX2NvbW1hbmQiOiInL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9vcmcucHFycy9LYXJhYmluZXItRWxlbWVudHMvYmluL2thcmFiaW5lcl9jbGknIC0tc2VsZWN0LXByb2ZpbGUgJ1JEUCcifV19XX1dfQ==" target="_blank" rel="noopener"
 &gt;Switch profile (Default -&amp;gt; RDP)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;여기까지 해서 **RDP(Mac to Windows)**환경에서 &lt;strong&gt;Mac OS&lt;/strong&gt;환경과 완전히 동일하게 단축키를 맞추는 작업을 마쳤습니다.&lt;br&gt;
저와 비슷한 상황을 겪고 계신 분이 있으시면 도움이 되었으면 좋겠습니다.&lt;/p&gt;</description></item><item><title>Spring DATA JPA in MySQL에서 Pessimistic Lock(비관적 락) 처리</title><link>https://42class.com/posts/spring-data-jpa-in-mysql%EC%97%90%EC%84%9C-pessimistic-lock%EB%B9%84%EA%B4%80%EC%A0%81-%EB%9D%BD-%EC%B2%98%EB%A6%AC/</link><pubDate>Wed, 03 Feb 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/spring-data-jpa-in-mysql%EC%97%90%EC%84%9C-pessimistic-lock%EB%B9%84%EA%B4%80%EC%A0%81-%EB%9D%BD-%EC%B2%98%EB%A6%AC/</guid><description>&lt;p&gt;&lt;img src="https://42class.com/img/title_jpa.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;WMS운영 중 비정상적인 락 처리 현상이 있어 확인한 결과 공유드립니다.
Spring DATA JPA in MySQL에서 Pessimistic Lock(비관적 락) 처리&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;락 어논테이션으로 처리 : @Lock(LockModeType.PESSIMISTIC_WRITE)&lt;/li&gt;
&lt;li&gt;쓰기,읽기 모두 lock를 거는 방식이지만 실제로는 읽기에 대핸 lock이 걸리지 않음&lt;/li&gt;
&lt;li&gt;읽기도 lock을 걸려면, 해당 row에 접근하는 select 쿼리에 모두 for update구문을 걸어줘야 함(@Lock(LockModeType.PESSIMISTIC_WRITE))&lt;/li&gt;
&lt;li&gt;해당 락은 row level lock이지만 mysql innoDB의 락 처리 방식은 인덱싱 되지 않은 조건으로 선별 된 row에 대해선 row level로 락은 잡지 못함&lt;/li&gt;
&lt;li&gt;mysql innoDB는 인덱싱 범위에 대해서 락을 잡는 방식으로 인덱싱 되지 않은 조건으로 선별 된 select결과는 row가 아닌 테이블이 락이 걸리는 현상이 발생됨&lt;/li&gt;
&lt;li&gt;락을 걸어야 하는 데이터 셋의 검색조건은 인덱싱된 컬럼을 기준으로 잡아야 함&lt;/li&gt;
&lt;li&gt;JPA에서 lock scope범위에 따라 릴레이션 된 모델들도 함께 락이 잡히게 됨&lt;/li&gt;
&lt;li&gt;대상 테이블만 락의 범위로 잡으려면 scope를 지정해줘야 함&lt;/li&gt;
&lt;li&gt;락 범위 어논테이션으로 처리 : @QueryHints(value = {@QueryHint(name = &amp;ldquo;javax.persistence.lock.scope&amp;rdquo;, value = &amp;ldquo;NORMAL&amp;rdquo;)})&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JPA N+1튜닝과정에서 선언한 배치 사이즈와 다르게 쿼리 분할 되어 수행되는 이유</title><link>https://42class.com/posts/jpa-n-1%ED%8A%9C%EB%8B%9D%EA%B3%BC%EC%A0%95%EC%97%90%EC%84%9C-%EC%84%A0%EC%96%B8%ED%95%9C-%EB%B0%B0%EC%B9%98-%EC%82%AC%EC%9D%B4%EC%A6%88%EC%99%80-%EB%8B%A4%EB%A5%B4%EA%B2%8C-%EC%BF%BC%EB%A6%AC-%EB%B6%84%ED%95%A0-%EB%90%98%EC%96%B4-%EC%88%98%ED%96%89%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0/</link><pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/jpa-n-1%ED%8A%9C%EB%8B%9D%EA%B3%BC%EC%A0%95%EC%97%90%EC%84%9C-%EC%84%A0%EC%96%B8%ED%95%9C-%EB%B0%B0%EC%B9%98-%EC%82%AC%EC%9D%B4%EC%A6%88%EC%99%80-%EB%8B%A4%EB%A5%B4%EA%B2%8C-%EC%BF%BC%EB%A6%AC-%EB%B6%84%ED%95%A0-%EB%90%98%EC%96%B4-%EC%88%98%ED%96%89%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0/</guid><description>&lt;p&gt;&lt;img src="https://42class.com/img/title_jpa.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;h2 id="jdbc-preparedstatement의-캐싱-방식"&gt;JDBC preparedstatement의 캐싱 방식
&lt;/h2&gt;&lt;p&gt;먼저 이 현상을 설명하려면 JDBC의 preparedstatement의 캐싱 방식을 알아야 합니다.&lt;br&gt;
preparedstatement는 in절이 들어가는 select 쿼리에 대해 각 경우를 모두 캐싱합니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;#&lt;/span&gt; 데이터가 &lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;개 들어올 때 : &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt; xxx &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;#&lt;/span&gt; 데이터가 &lt;span style="color:#bd93f9"&gt;2&lt;/span&gt;개 들어올 때 : &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt; xxx &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;,&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;#&lt;/span&gt; 데이터가 n개 들어올 때 : &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt; xxx &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;,&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, ...)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hibernate의-batch_size에-의한-캐싱-방식"&gt;hibernate의 batch_size에 의한 캐싱 방식
&lt;/h2&gt;&lt;p&gt;위의 방식으로 캐시되는 경우 데이터가 많아질수록 많은 케이스를 캐싱해야 해서 성능에 문제가 발생합니다.&lt;br&gt;
그래서 하이버네이트는 최적화를 위해 캐싱케이스를 줄이는 방식으로 수행됩니다.&lt;br&gt;
줄이는 방식은 프로젝트에 선언 된 기본배치사이즈 &lt;em&gt;(hibernate.default_batch_fetch_size: 100)&lt;/em&gt; 를 기준으로 절반씩 나눠가면서 캐싱합니다.&lt;br&gt;
그리고 자주사용할 것으로 예상되는 1~10 사이는 모두 캐싱 하게됩니다.&lt;br&gt;
in절 항목값을 100으로 잡을 때, 기존 preparedstatement 방식에 의하면 총 100개의 케이스를 캐싱해두게 됩니다.&lt;br&gt;
하이버네이트의 방식으로 하게 되면 14개로 줄어듭니다.&lt;br&gt;
(1,2,3,4,5,6,7,8,9,10,12, 25,50,100)&lt;/p&gt;
&lt;p&gt;N+1이슈가 발생한 쿼리가 있고 총 데이터가 83건이면 83번의 동일한 쿼리가 나가는 상황일겁니다.&lt;br&gt;
현상 튜닝을 위해 &lt;em&gt;hibernate.default_batch_fetch_size: 100&lt;/em&gt; 으로 설정 후 조회합니다.&lt;br&gt;
예상으로는 쿼리는 한번 나가고 in절 항목이 83개가 들어간 쿼리를 기대합니다.&lt;br&gt;
하지만 실제로는 캐싱된 케이스에 의해 아래와 같이 총 3번의 동일한 쿼리가 나가게 됩니다.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;in절 항목이 50으로 캐싱된 쿼리 한 번
in절 항목이 25로 캐싱된 쿼리 한 번
in절 항목이 8으로 캐싱된 쿼리 한 번
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="83개-항목이-분리-요청-된-실제-예"&gt;83개 항목이 분리 요청 된 실제 예
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;select&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; id1_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_2_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_3_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod4_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod5_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; code6_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.name &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; name7_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_group_code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_8_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_type &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_9_38_0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;from&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product product0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bd93f9"&gt;2020&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;08&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;07&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;17&lt;/span&gt;:&lt;span style="color:#bd93f9"&gt;33&lt;/span&gt;:&lt;span style="color:#bd93f9"&gt;30&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;948&lt;/span&gt; DEBUG [XNIO&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt; task&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;] &lt;span style="color:#ff79c6"&gt;SQL&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;select&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; id1_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_2_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_3_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod4_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod5_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; code6_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.name &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; name7_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_group_code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_8_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_type &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_9_38_0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;from&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product product0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bd93f9"&gt;2020&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;08&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;07&lt;/span&gt; &lt;span style="color:#bd93f9"&gt;17&lt;/span&gt;:&lt;span style="color:#bd93f9"&gt;33&lt;/span&gt;:&lt;span style="color:#bd93f9"&gt;30&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;969&lt;/span&gt; DEBUG [XNIO&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt; task&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;&lt;span style="color:#bd93f9"&gt;1&lt;/span&gt;] &lt;span style="color:#ff79c6"&gt;SQL&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;select&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; id1_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_2_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.created_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; created_3_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_by &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod4_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.last_modified_date &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; last_mod5_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; code6_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.name &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; name7_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_group_code &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_8_38_0_,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.product_type &lt;span style="color:#ff79c6"&gt;as&lt;/span&gt; product_9_38_0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;from&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product product0_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; product0_.id &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;, &lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="최적화-전략"&gt;최적화 전략
&lt;/h2&gt;&lt;p&gt;위와 같이 하이버네이트는 최적화 전략으로 수행됩니다.&lt;br&gt;
3번의 캐싱된 쿼리가 수행되는 것은 정상적인 부분이며 하이버네이트에서 권장하는 기본전략입니다.&lt;br&gt;
참고로, 선언한 &lt;em&gt;(hibernate.default_batch_fetch_size: 100 )&lt;/em&gt; 사이즈 만큼 in절 항목을 발생시키고 싶다면 설정파일에 &lt;em&gt;hibernate.batch_fetch_style: dynamic&lt;/em&gt;을 추가하시면 됩니다.&lt;br&gt;
하지만 이 방식은 캐싱되지 않은 케이스로 쿼리가 수행되므로 권장하지 않는 방식이라고 합니다.&lt;/p&gt;</description></item><item><title>21/01/11</title><link>https://42class.com/posts/21/01/11/</link><pubDate>Mon, 11 Jan 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/21/01/11/</guid><description>&lt;p&gt;&lt;img src="https://42class.com/img/210111.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;아직 앱이 익숙하지 않네.&lt;/p&gt;</description></item><item><title>21/01/04</title><link>https://42class.com/posts/21/01/04/</link><pubDate>Mon, 04 Jan 2021 00:00:00 +0000</pubDate><guid>https://42class.com/posts/21/01/04/</guid><description>&lt;p&gt;&lt;img src="https://42class.com/img/girl.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;에어4 구매기념~&lt;/p&gt;</description></item><item><title>Mac에서 WSL로 자유롭게 접근하기(ssh와 Port Forwarding)</title><link>https://42class.com/posts/mac%EC%97%90%EC%84%9C-wsl%EB%A1%9C-%EC%9E%90%EC%9C%A0%EB%A1%AD%EA%B2%8C-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0ssh%EC%99%80-port-forwarding/</link><pubDate>Mon, 03 Aug 2020 00:00:00 +0000</pubDate><guid>https://42class.com/posts/mac%EC%97%90%EC%84%9C-wsl%EB%A1%9C-%EC%9E%90%EC%9C%A0%EB%A1%AD%EA%B2%8C-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0ssh%EC%99%80-port-forwarding/</guid><description>&lt;h2 id="wsl에서-ssh-서버-세팅하기"&gt;WSL에서 SSH 서버 세팅하기
&lt;/h2&gt;&lt;p&gt;wsl을 설치하면 기본적으로 ssh서버가 세팅되어 있습니다.&lt;br&gt;
하지만 왜 인지는 모르겠으나 wsl에 기본으로 세팅되어 있는 ssh서버는 정상적으로 작동 하지 않습니다.&lt;br&gt;
기본 세팅되어 있는 ssh서버는 제거하고 갈끔하게 새로 세팅하는 것이 좋을 것 같습니다.&lt;br&gt;
일단 제 WSL을 Ubuntu 18.04 배포판이라 apt를 사용하여 설치하겠습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;apt 패키지 매니저부터 update &amp;amp; upgrade하고 진행하겠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update &lt;span style="color:#ff79c6"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-get upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;기본으로 세팅되어 있는 ssh 서버를 제거합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get purge openssh-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;ssh 서버를 재설치 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install openssh-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="windows에서-wsl로-port-forwarding"&gt;Windows에서 WSL로 Port Forwarding
&lt;/h2&gt;&lt;p&gt;작성 중&lt;/p&gt;
&lt;h2 id="wsl-ssh서버---port-forwarding-script-실행-스케쥴러-등록"&gt;WSL SSH서버 / Port Forwarding script 실행 스케쥴러 등록
&lt;/h2&gt;&lt;p&gt;Windows10 PC도 여전히 개발작업에 사용 중이고 수시로 온/오프 하는 랩탑이라서 매번 포트포워딩 잡아주고 ssh서버 실행해주는게 번거로웠습니다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bash.exe -c &lt;span style="color:#f1fa8c"&gt;&amp;#34;sudo service ssh start&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;powershell.exe -ExecutionPolicy Bypass -File D:&lt;span style="color:#f1fa8c"&gt;\w&lt;/span&gt;sl2-network.ps1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wsl2-network.ps1 : 파일안에 $ports 변수에 포워딩할 포트 지정&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$remoteport&lt;/span&gt; = bash.exe -c &lt;span style="color:#f1fa8c"&gt;&amp;#34;ifconfig eth0 | grep &amp;#39;inet &amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$found&lt;/span&gt; = &lt;span style="color:#8be9fd;font-style:italic"&gt;$remoteport&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;-match&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;if&lt;/span&gt;( &lt;span style="color:#8be9fd;font-style:italic"&gt;$found&lt;/span&gt; ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;$remoteport&lt;/span&gt; = &lt;span style="color:#8be9fd;font-style:italic"&gt;$matches&lt;/span&gt;[&lt;span style="color:#bd93f9"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#ff79c6"&gt;else&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;echo &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;The Script Exited, the ip address of WSL 2 cannot be found&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;#[Ports]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;#All the ports you want to forward separated by coma&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$ports&lt;/span&gt;=&lt;span style="color:#8be9fd;font-style:italic"&gt;@&lt;/span&gt;(&lt;span style="color:#bd93f9"&gt;80&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;443&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;10000&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;3000&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;5000&lt;/span&gt;,&lt;span style="color:#bd93f9"&gt;22&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;#[Static ip]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;#You can change the addr to your ip config to listen to a specific address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$addr&lt;/span&gt;=&lt;span style="color:#f1fa8c"&gt;&amp;#39;0.0.0.0&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$ports_a&lt;/span&gt; = &lt;span style="color:#8be9fd;font-style:italic"&gt;$ports&lt;/span&gt; -join &lt;span style="color:#f1fa8c"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;#Remove Firewall Exception Rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;iex &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;Remove-NetFireWallRule -DisplayName &amp;#39;WSL 2 Firewall Unlock&amp;#39; &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;#adding Exception Rules for inbound and outbound Rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;iex &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;New-NetFireWallRule -DisplayName &amp;#39;WSL 2 Firewall Unlock&amp;#39; -Direction Outbound -LocalPort &lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$ports_a&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; -Action Allow -Protocol TCP&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;iex &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;New-NetFireWallRule -DisplayName &amp;#39;WSL 2 Firewall Unlock&amp;#39; -Direction Inbound -LocalPort &lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$ports_a&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; -Action Allow -Protocol TCP&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;for&lt;/span&gt;( &lt;span style="color:#8be9fd;font-style:italic"&gt;$i&lt;/span&gt; = &lt;span style="color:#bd93f9"&gt;0&lt;/span&gt;; &lt;span style="color:#8be9fd;font-style:italic"&gt;$i&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;-lt&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;$ports&lt;/span&gt;.length; &lt;span style="color:#8be9fd;font-style:italic"&gt;$i&lt;/span&gt;++ ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;$port&lt;/span&gt; = &lt;span style="color:#8be9fd;font-style:italic"&gt;$ports&lt;/span&gt;[&lt;span style="color:#8be9fd;font-style:italic"&gt;$i&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;iex &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;netsh interface portproxy delete v4tov4 listenport=&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$port&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; listenaddress=&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$addr&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;iex &lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;netsh interface portproxy add v4tov4 listenport=&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$port&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; listenaddress=&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$addr&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; connectport=&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$port&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt; connectaddress=&lt;/span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;$remoteport&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://www.tuwlab.com/ece/29302" target="_blank" rel="noopener"
 &gt;SSH 서버 세팅하기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;WSL환경에서 맥으로 작업환경 옮기면서 SSH접속이 되면 편할 거 같아서 세팅한건데 맥에서 wsl로 ssh 접근 필요하신 분은 사용하시면 될 듯 합니다.&lt;/p&gt;
&lt;p&gt;링크(&lt;a class="link" href="https://www.tuwlab.com/ece/29302" target="_blank" rel="noopener"
 &gt;https://www.tuwlab.com/ece/29302&lt;/a&gt;) 참조하셔서 wsl에 ssh 서버 설치하시고 첨부 한 zip파일 받으셔서 route.bat 파일 시작프로그램에 넣으시면 됩니다.&lt;/p&gt;
&lt;p&gt;route.bat : 파일안에 파워셀스크립트 파일 경로 자신의 경로대로 변경 필요&lt;/p&gt;</description></item><item><title>Docker 개발환경 성능 비교</title><link>https://42class.com/posts/docker-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90/</link><pubDate>Sat, 13 Apr 2019 00:00:00 +0000</pubDate><guid>https://42class.com/posts/docker-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90/</guid><description>&lt;p&gt;&lt;img src="https://tva1.sinaimg.cn/large/007S8ZIlgy1ghf5bdzy4aj318g0rs752.jpg" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;도커 성능 테스트라고는 하지만 각 개발환경 호스트의 파일시스템에 따른 도커볼륨 I/O 속도 테스트 인 것 같다.&lt;/p&gt;
&lt;h1 id="wsl--docker-desktop-for-windows"&gt;WSL + Docker Desktop for Windows
&lt;/h1&gt;&lt;h2 id="eeee"&gt;eeee
&lt;/h2&gt;&lt;h3 id="aaaa"&gt;aaaa
&lt;/h3&gt;&lt;p&gt;이 환경에선 초반에 버그도 많았고, 사용하면서 많은 인내심이 필요했다.
(&lt;em&gt;작년쯤엔 wsl2테스트 해보려고 &lt;a class="link" href="https://github.com/microsoft/WSL/issues/4978" target="_blank" rel="noopener"
 &gt;윈도우 인사이더 프로그램으로 진행하다가 O/S&lt;/a&gt;도 한번 날려 먹고&amp;hellip;.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;사용하다 보니 점차 안정화 되고, &lt;a class="link" href="https://code.visualstudio.com/docs/remote/containers" target="_blank" rel="noopener"
 &gt;Visual Studio Code에서 원격개발 Extension&lt;/a&gt;도 나오면서 속도가 좀 아쉽긴 했어도 그럭저럭 개발환경으로서 사용할만 했다.&lt;/p&gt;
&lt;h1 id="wsl2--docker-desktop-for-windows"&gt;WSL2 + Docker Desktop for Windows
&lt;/h1&gt;&lt;p&gt;Pages가 다른 블로그 플랫폼 보다 편한 것 같아서 마음에 든다.
다른 사람들도 같이 많이 사용했으면 좋겠다는 생각이 든다.&lt;/p&gt;
&lt;p&gt;YFM에서 정의한 제목을 이중 괄호 구문으로 본문에 추가할 수 있다.
이 글의 제목은 {{ page.title }}이고
마지막으로 수정된 시간은 {{ page.last_modified_at }}이다.&lt;/p&gt;
&lt;h1 id="mac-os--docker-desktop-for-mac"&gt;Mac OS + Docker Desktop for Mac
&lt;/h1&gt;&lt;h1 id="mac-os--docker-desktop-for-macedge"&gt;Mac OS + Docker Desktop for Mac(edge)
&lt;/h1&gt;&lt;p&gt;&lt;img src="https://i.imgur.com/MgxpQbQ.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/nF9Aalx.png" alt="" loading="lazy" class="gallery-image"&gt;
&lt;/p&gt;
&lt;h1 id="ubuntu-1804"&gt;Ubuntu 18.04
&lt;/h1&gt;</description></item></channel></rss>