Windows Markdown Viewer 개발기 (WPF + .NET 8 + WebView2)

Windows
로컬 Markdown 파일을 보다 효율적으로 다루기 위해 탐색 + 편집 + 미리보기 + 검색을 하나로 통합한 Windows 전용 뷰어를 개발했습니다. ## 1. 프로젝트 개요기존 Markdown 툴들은 다음과 같은 불편함이 있었습니다- 파일 탐색 기능이 약함- 로컬 기반 작업 흐름이 끊김- 여러 파일을 동시에 관리하기 번거로움이를 해결하기 위해 다음 목표로 개발했습니다- 로컬 파일 중심 워크플로우- IDE 스타일 멀티 탭 구조- 편집 + 미리보기 동시 작업- 외부 변경 대응## 2. 기술 스택Framework : .NET 8UI : WPFRenderer : MarkdigPreview : WebView2Output : WinExe 선택 이유 WPF: Windows 네이티브 UX + 빠른 개발 Markdig: 확장성 높은 Markdown 파서 WebView2: HTML 렌더링 + JS 확장 가능 3. 전체 구조 [Explorer] ────────────────┐ │ ▼ [Tab Manager] │ ┌───────────┬────────────┐ ▼ ▼ ▼ [Editor] [Preview] [Search] 4. 파일 탐색기 (Explorer) 핵심 기능 드라이브 루트부터 탐색 폴더 트리 구조…
Read More

안전하고 효율적인 코드 작성법: 개발자를 위한 팁

일반
좋은 코드는 단지 작동하는 코드가 아니라, 안전하고 효율적이며 유지보수가 쉬운 코드입니다. 이번 포스트에서는 개발자라면 꼭 알아야 하는 코드 작성법과 유용한 팁을 소개합니다. 1. 좋은 코드의 기준 이해하기 가독성 높은 코드 유지보수가 쉬운 구조 확장 가능한 아키텍처 2. 코드 리뷰 체크리스트 코드 리뷰 시 다음 항목을 확인하세요. 변수 및 함수 이름 명확성 점검 중복 코드 제거 여부 적절한 예외처리 여부 코드 일관성(들여쓰기, 주석, 포맷) 3. 효과적인 리팩토링 기법 리팩토링은 코드 품질을 높이는 중요한 작업입니다. 작은 함수로 쪼개기 조건문 간소화하기 반복 코드 함수화하기 예제 코드: # Before 리팩토링if status == "active": do_something()elif status == "inactive": do_something_else()# After 리팩토링action_map = { "active": do_something, "inactive": do_something_else}action_map[status]() 4. 보안성을 고려한 코드 작성법 보안 사고를 예방하기 위한 기본 가이드라인: SQL Injection 방지를 위한 Prepared Statement 사용 민감한 데이터 암호화하기 입력 데이터 검증하기 (Input Validation) 5. 코드…
Read More

개발자를 위한 효과적인 블로그 운영 전략

일반
개발자로서 기술 블로그를 운영하는 것은 개인 브랜딩과 전문성을 높이는 데 매우 유용합니다. 이번 포스트에서는 효과적인 블로그 운영 전략과 성공적인 콘텐츠 작성법을 소개합니다. 1. 기술 블로그의 목적과 방향 설정하기 블로그 운영의 목적(기술 공유, 포트폴리오, 커뮤니티 기여 등) 명확화 나의 전문 분야와 주요 독자층 설정하기 2. 양질의 콘텐츠 작성 방법 글의 주제를 명확히 정하고, 단계적으로 구성하기 독자가 따라 하기 쉽게 예시 코드 및 화면 캡처 활용하기 지속적으로 읽고 싶은 매력적인 제목 작성법 소개 3. SEO(Search Engine Optimization) 기본 원칙 적용하기 키워드 선정 및 글에 자연스럽게 배치하는 방법 메타 태그(제목, 설명 등) 설정하기 이미지 태그와 내부 링크 최적화하기 4. 블로그 글 주기적 업데이트와 관리하기 일정한 주기로 콘텐츠를 업로드하는 중요성 꾸준히 운영 가능한 콘텐츠 주제 선정법 방문자와의 소통을 위한 댓글 관리 방법 5. 방문자 분석 및 개선 전략 Google Analytics 등의 분석 도구 활용법…
Read More

Git 기초부터 고급 명령어까지: 개발자를 위한 가이드

소스관리
Git은 분산형 버전 관리 시스템으로서 개발자에게 필수 도구입니다. 이번 포스팅에서는 Git의 기본 명령어부터 실무에서 활용 가능한 고급 명령어까지 알아봅니다. 1. Git이란? Git의 기본 개념과 중요성 Git 설치 방법과 초기 설정(사용자 이름, 이메일 등) git config --global user.name "홍길동"git config --global user.email "hong@example.com" 2. Git 기본 명령어 정리 저장소 초기화하기: git init 변경사항 추가 및 커밋: git add .git commit -m "Initial commit" 원격 저장소 연결하기: git remote add origin <원격저장소 주소>git push origin main 3. 브랜치 관리와 병합하기 브랜치를 활용하면 협업 및 기능별 작업 관리가 용이합니다. 브랜치 생성 및 전환: git branch feature-logingit checkout feature-login 브랜치 병합: git checkout maingit merge feature-login 병합 충돌 해결 방법 안내 4. Git 고급 명령어와 팁 히스토리 관리(커밋 메시지 변경, 병합): git rebase -i HEAD~3 커밋 취소 또는 되돌리기: git reset --hard <커밋해시>git revert…
Read More

WPF 애플리케이션 UI 디자인 실전 가이드

CSharp
WPF(Windows Presentation Foundation)는 강력한 데스크톱 애플리케이션 UI 개발 플랫폼입니다. 이번 글에서는 WPF에서 효과적이고 아름다운 UI를 만드는 방법을 단계별로 안내하겠습니다. 1. WPF와 XAML의 이해 WPF는 XAML 기반의 UI 디자인을 사용하여, 깔끔하고 직관적인 UI를 쉽게 만들 수 있도록 돕습니다. XAML의 기본 문법과 구조 소개 주요 레이아웃 컨트롤 (Grid, StackPanel, DockPanel 등) 2. 간단한 화면 설계하기 XAML을 사용한 레이아웃 구성 방법: <Grid> <StackPanel Orientation="Vertical" Margin="20"> <TextBlock Text="WPF UI 실습 예제" FontSize="24" FontWeight="Bold"/> <Button Content="버튼 클릭" Margin="10"/> </StackPanel></Grid> 3. 스타일과 테마 관리하기 XAML의 Style과 ResourceDictionary를 활용한 스타일 재사용법 애플리케이션 전체에 적용되는 테마 관리하기 예시 코드: <Window.Resources> <Style TargetType="Button"> <Setter Property="FontSize" Value="16"/> <Setter Property="Background" Value="#FF007ACC"/> <Setter Property="Foreground" Value="White"/> </Style></Window.Resources> 4. 데이터 바인딩과 MVVM 패턴 활용 MVVM(Model-View-ViewModel) 구조의 장점 설명 데이터 바인딩으로 View와 ViewModel 연동하기 간단한 예제 코드: <TextBlock Text="{Binding UserName}" /> 5. 커스텀 컨트롤 제작…
Read More

안드로이드 앱에서 Retrofit을 활용한 API 통신 완벽 가이드

Android
Retrofit은 안드로이드 앱에서 서버와 쉽게 통신할 수 있는 가장 널리 사용되는 라이브러리입니다. 이번 포스트에서는 Retrofit을 활용하여 API 통신하는 방법을 기초부터 상세히 소개합니다. 1. Retrofit이란? Retrofit은 Square에서 만든 타입 안전(type-safe)의 REST 클라이언트로, HTTP 통신을 쉽게 해주는 라이브러리입니다. 코드 간결화 및 가독성 향상 비동기 처리 지원 2. 프로젝트에 Retrofit 추가하기 build.gradle(:app)에 의존성 추가: implementation 'com.squareup.retrofit2:retrofit:2.11.0'implementation 'com.squareup.retrofit2:converter-gson:2.11.0' 3. Retrofit 기본 구조 이해하기 기본 API 인터페이스 정의 예시: public interface ApiService { @GET("users/{id}") Call<User> getUser(@Path("id") int userId);} 4. Retrofit을 이용한 API 요청 구현 레트로핏 객체 생성 예제: Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build();ApiService apiService = retrofit.create(ApiService.class); API 요청 및 응답 처리 예제: apiService.getUser(1).enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { if(response.isSuccessful()) { User user = response.body(); // 성공적으로 응답받은 데이터 처리 } } @Override public void onFailure(Call<User> call, Throwable…
Read More

AWS Lightsail을 이용한 웹 서버 구축 가이드

컴퓨터
AWS Lightsail은 아마존이 제공하는 간편한 클라우드 호스팅 서비스입니다. 이번 글에서는 초보자도 쉽게 따라 할 수 있는 AWS Lightsail을 활용하여 웹 서버를 구축하는 과정을 안내하겠습니다. 1. AWS 계정 생성 및 Lightsail 접속하기 AWS Lightsail에 가입하고 로그인합니다. Create instance를 클릭하여 새 인스턴스를 생성합니다. 2. 인스턴스 설정하기 원하는 운영체제(추천: Ubuntu 22.04)를 선택합니다. 인스턴스 플랜(가격과 성능)을 선택합니다. 초보자는 $5 플랜을 추천합니다. 인스턴스 이름을 입력하고 생성합니다. 3. SSH로 서버 접속 및 업데이트하기 AWS에서 제공하는 웹 기반 SSH 또는 PuTTY 등의 클라이언트를 사용해 서버에 접속합니다. 서버를 최신 상태로 업데이트합니다. sudo apt update && sudo apt upgrade -y 4. 웹 서버 설치 (Apache 또는 Nginx) Apache 설치 예시: sudo apt install apache2 -ysudo systemctl start apache2sudo systemctl enable apache2 Nginx 설치 예시: sudo apt install nginx -ysudo systemctl start nginxsudo systemctl enable nginx 5. SSL 인증서 발급…
Read More

MySQL 성능 최적화를 위한 기초 가이드

Database
MySQL을 사용하는 프로젝트가 많아지면서 데이터베이스 성능은 개발자의 중요한 고민 중 하나입니다. 이번 포스트에서는 MySQL의 성능을 기초적으로 최적화하는 방법을 소개합니다. 1. 인덱스(Index) 설정과 최적화 인덱스는 데이터 조회 속도를 현저히 높여줍니다. 자주 조회하는 컬럼에 인덱스를 설정합니다. 인덱스는 과도하게 생성하면 삽입, 수정, 삭제 성능이 떨어지므로 적정 수준을 유지합니다. 예시: CREATE INDEX idx_user_email ON users(email); 2. 느린 쿼리(Slow Query) 확인 및 개선하기 느린 쿼리는 성능 저하의 주범입니다. MySQL에서는 이를 쉽게 확인할 수 있습니다. MySQL의 Slow Query Log 활성화: [mysqld]slow_query_log = 1slow_query_log_file = /var/log/mysql/mysql-slow.loglong_query_time = 2 느린 쿼리 최적화 전략: 서브쿼리를 JOIN으로 변경 WHERE절에 인덱스 적용 여부 확인 LIMIT를 활용하여 반환 데이터를 최소화 3. 쿼리 최적화 팁 성능을 높이기 위해 쿼리 작성 시 다음 사항을 참고하세요. SELECT 문에서 꼭 필요한 컬럼만 지정하여 불필요한 데이터 전송을 줄입니다. LIKE 검색 시 % 앞부분 사용을 자제합니다. ORDER BY를…
Read More

안드로이드 앱 출시 방법과 필수 체크리스트

Android
안드로이드 개발자로서 앱을 구글 플레이스토어에 출시하는 것은 매우 중요한 단계입니다. 본 포스팅에서는 앱을 성공적으로 출시하기 위한 방법과 필수 체크리스트를 안내합니다. 1. 구글 개발자 계정 생성하기 Google Play Console에 가입하고 개발자 등록비($25)를 결제합니다. 2. 앱 패키지 이름 결정 및 생성 고유하고 명확한 패키지 이름(예: com.company.appname)을 선택합니다. 3. 앱 콘텐츠 준비 스크린샷, 앱 아이콘, 설명 등 스토어 등록에 필요한 모든 콘텐츠를 준비합니다. 4. APK/AAB 파일 빌드 및 서명 Android Studio에서 앱을 빌드하고 디지털 서명을 하여 릴리즈 파일을 생성합니다. APK나 권장하는 AAB(Android App Bundle) 파일 형식으로 준비합니다. 5. 스토어 등록 및 정책 점검 플레이 콘솔에서 앱 등록 시 모든 세부사항(개인정보 처리방침, 등급, 타겟층)을 명확히 설정합니다. 앱 정책 위반 여부를 꼼꼼히 검토합니다. 6. 앱 출시 전 최종 점검 체크리스트 필수 권한 설정 확인 테스트 기기에서 앱 실행 테스트 앱 설명 및 스크린샷 정확성 검증…
Read More

개발자 포트폴리오 사이트 만들기: GitHub Pages 활용하기

컴퓨터
개발자에게 포트폴리오 웹사이트는 필수입니다. 오늘은 누구나 쉽게 접근 가능한 GitHub Pages를 활용해 자신만의 포트폴리오 사이트를 만드는 과정을 안내하겠습니다. 1. GitHub 계정 생성 및 Repository 만들기 GitHub에 가입합니다. portfolio 또는 원하는 이름으로 새 Repository를 만듭니다. 2. GitHub Pages 활성화 Repository의 Settings에서 Pages 탭으로 이동합니다. Source를 선택해 Branch를 main으로 설정하고, 저장합니다. 설정 후 GitHub가 제공한 URL로 사이트가 접근 가능합니다. 3. 포트폴리오 웹페이지 만들기 HTML과 CSS를 활용하여 간단한 웹페이지를 만듭니다. 자기소개, 기술스택, 프로젝트 경험 등을 포함하세요. 다음은 간단한 HTML 예시입니다: <!DOCTYPE html> <html> <head> <title>개발자 홍길동 포트폴리오</title> <link rel="stylesheet" href="style.css"> </head> <body> <header> <h1>홍길동의 포트폴리오</h1> </header> <section> <h2>자기소개</h2> <p>안녕하세요. 웹 및 앱 개발자 홍길동입니다.</p> </section> <section> <h2>기술 스택</h2> <ul> <li>HTML/CSS/JavaScript</li> <li>Python</li> <li>Android(Java, Kotlin)</li> </ul> </section> <section> <h2>주요 프로젝트</h2> <p>GitHub에 공개한 프로젝트 목록과 링크를 삽입하세요.</p> </section> <footer> <p>이메일: honggildong@example.com</p> </footer> </body> </html> 4. GitHub에…
Read More

Gitea 서버 설치 및 설정 가이드

Linux, 소스관리
이 가이드는 Ubuntu 환경에서 Gitea 서버를 설치하고 설정하는 전체 과정을 단계별로 안내합니다. 1. 시스템 업데이트 sudo apt update sudo apt dist-upgrade -y sudo apt autoremove -y cp /etc/skel/.bashrc /root/.bashrc 2. 로케일 및 시간대 설정 sudo vi /etc/default/locale # 파일 내 LANG=en_US.UTF-8로 설정 dpkg-reconfigure tzdata timedatectl sudo apt install systemd-timesyncd sudo systemctl enable systemd-timesyncd --now timedatectl timesync-status sudo apt install chrony chronyc sourcestats -v 3. Nginx 설치 및 설정 sudo apt install nginx -y sudo vi /etc/nginx/sites-available/gitea # 아래 내용을 파일에 추가 server { listen 80; server_name git.도메인.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/gitea sudo nginx -t sudo systemctl restart nginx 4. SSL 인증서 발급 (Let's Encrypt) sudo apt install certbot python3-certbot-nginx -y…
Read More

OpenVPN Client 파일 생성서 remote 주소를 IP 말고 도메인으로 설정

Linux, 컴퓨터
OpenVPN을 사용할 때, 클라이언트가 서버에 접속하기 위한 정보는 보통 .ovpn 파일 혹은 공통 템플릿(client-common.txt)에 작성됩니다. 이때 서버 주소를 IP 주소가 아닌 도메인 이름(DNS) 으로 설정하면 훨씬 유연한 구성이 가능합니다. 왜 IP 주소 대신 도메인 주소를 써야 할까? ✔️ IP는 바뀔 수 있다 많은 서버는 고정 IP를 사용하지 않거나, 유동 IP 환경에서 운영되기도 합니다. 예를 들어, 일반 가정용 인터넷이나 일부 클라우드 환경에서는 재부팅 혹은 일정 시간 경과 후 IP가 변경될 수 있습니다. ✔️ 도메인 주소는 항상 유효하다 이를 해결하기 위해 DDNS(Dynamic DNS) 기능을 활용하면, IP가 변경되더라도 도메인 이름을 항상 최신 IP로 연결시킬 수 있습니다. 클라이언트는 접속 시 항상 도메인을 기준으로 DNS 조회를 하므로 IP 변경에 신경 쓰지 않아도 됩니다. #vi /etc/openvpn/server/client-common.txt 설정 예시: client-common.txt에서 도메인 적용하기 OpenVPN의 클라이언트 설정 파일 또는 공통 템플릿 파일에서 다음과 같이 설정을 변경합니다. 기존 설정 (IP…
Read More

OPEN VPN으로 Client 간 접속 및 도메인 접속 차단

Linux, Windows
VPN으로 외부에서 내부 Test 서버를 접속 하기 위해서 조금은 설정을 하다가 일단은 기록을 진행 합니다. 물리적으로 거리가 있고, 동일 네트워크망에 있지 않을 경우에 해당 문제를 해결 하기 위해서 기록을 하는것입니다. 응용을 하기에 따라서 다른 용도로 사용을 할 수 있지만 제가 중점적으로 노리는 효과는 "가상 내부망 구축", "접속할 사이트 제한" 2가지를 중점적으로 해서 처리한 내용입니다. 일단 OPEN VPN 서버 설정을 변경을 하여서 Client간에 통신이 되도록 허용하고, DNS 조정을 통해서 원하지 않는 웹사이트는 접속 하디 않도록 설정을 합니다. # vi /etc/openvpn/server/server.conf # 서버 설정 파일에 클라이언트 간 통신 허용 client-to-client # OPENVPN에 다른 DNS 차단하도록 설정 push "block-outside-dns" # 고정IP 할당하기 위한 설정 client-config-dir /etc/openvpn/ccd # OPENVPN Status 기록 status /var/log/openvpn-status.log status-version 2 # DNS를 현재 서버로 이용하기 push "dhcp-option DNS 10.8.0.1" #※ 이미 있을 경우는 삭제를 하거나 수정하시며 됩니다. 해당 설정을…
Read More

OpenVPN이란? 안전한 원격 접속을 위한 오픈소스 VPN 솔루션

컴퓨터
OpenVPN은 인터넷 상에서 암호화된 안전한 네트워크 통신을 가능하게 해주는 오픈소스 VPN 솔루션입니다. 기업 및 개인 사용자 모두에게 강력한 보안을 제공하면서도 유연한 설정이 가능해 인기가 많습니다. 1. VPN(Virtual Private Network)의 개념 VPN은 공용 네트워크(인터넷)를 통해 사설 네트워크에 **보안된 연결(터널링)**을 만들어주는 기술입니다. 보안성 향상: 데이터 암호화로 도청 방지 IP 우회: 지정된 서버를 통해 외부 IP를 변경 원격 접속: 외부에서도 회사 네트워크에 접속 가능 2. OpenVPN의 특징 오픈소스: 누구나 무료로 사용 가능 고성능: UDP/TCP를 통한 빠르고 안정적인 통신 강력한 암호화: SSL/TLS 기반 보안 운영체제 다양성: Windows, Linux, macOS, Android, iOS 지원 확장성: 인증서 기반 인증, 사용자 관리, 로깅 등 기업 환경에 최적화 가능 3. OpenVPN의 기본 구성 OpenVPN은 서버-클라이언트 구조입니다. 서버: VPN 허브 역할, 인증 및 암호화 설정 클라이언트: 각 장치에서 서버에 접속하여 사설망처럼 사용 OpenVPN 연결은 보통 .ovpn 구성 파일을 통해 설정됩니다.…
Read More

왜 웹서버에 접속이 많을까나?

Linux
일단 제가 운영하는 블로그는 몇개 있습니다. 최근에 너무 바빠서 글을 적지 않고 있어서 검색엔진과 다른 사이트에서 방문할 일이 0%에 가깝습니다. 이전에 작성할 글이 있기 때문에 접속이 없다고는 말을 하지 못하지만, 최근에 맞춰서 글이 없어서 방문할 이유가 전혀 없습니다. 그런데, 검색엔징 Bot등이 엄청 방문하니 조용하던 웹서버는 비명을 지르고 있습니다. 서버관리를 통해서 차단을 하고 있지만 이게 차단을 한다고 막아 지는게 아니지만 최대한 자동으로 막아 두고 있습니다. 개인적인 블로그만 운영하고, 커뮤니티도 없고 파일 업로드등도 열어 두지 않는 웹서버라서 제가 모르는 사람이 방문하다고 하여서 할게 블로그에 댓글을 남기는게 끝입니다. 블로그에도 스펨을 막기 위해서 플러그인등을 설치 하는등 여러가지 하고 있어서 뚫고 들어오는 사람이 일주일에 몇명은 있지만, 나날이 발전하는 스펨이야 조금 뚫릴 수 있다고 보고 있습니다. 스펨과 Bot은 그나마 서버 탈취나 취약점 찾기 위한 노력을 한다고 하지만 SEO 사이트들이 들어오는것은 100% 이해를 하지 못하겠습니다. 저는 블로그를…
Read More