프로그래밍 언어

PySide6 실전 강좌 #8 배포와 마무리 — 아이콘·버전 정보, 서명, GitHub Actions
5 분 소요

PySide6 실전 강좌 #8 배포와 마무리 — 아이콘·버전 정보, 서명, GitHub Actions

시리즈 마지막 편으로 앱을 남에게 건넬 수 있는 상태로 마감합니다. PyInstaller spec 파일로 아이콘·이름·리소스를 관리하는 법, 버전을 한 곳에서 정의해 앱과 빌드에 공급하는 법, 서명 없는 앱이 다운로드 직후 차단되는 이유와 macOS 공증·Windows 서명의 지형, GitHub Actions 매트릭스로 3개 운영체제 빌드를 자동화하는 워크플로, 그리고 시리즈 전체의 회고까지 다룹니다.

PySide6 실전 강좌 #7 테스트 — pytest-qt와 층별 테스트 전략
5 분 소요

PySide6 실전 강좌 #7 테스트 — pytest-qt와 층별 테스트 전략

GUI 앱은 테스트하기 어렵다는 통념을 층 구조로 해체합니다. Qt 없이 도는 core 테스트가 가장 많아야 하는 이유, 임시 DB 파일로 리포지토리를 검증하는 법, qtbot이 QApplication과 이벤트 루프를 대신 관리해 주는 pytest-qt의 동작 방식, 모델의 계약(rowCount·data·setData)을 검증하는 테스트, 시그널 대기(waitSignal)와 위젯 상호작용 테스트, 그리고 CI에서 화면 없이 Qt 테스트를 돌리는 방법까지 다룹니다.

PySide6 실전 강좌 #6 설정 화면 — QSettings, 다크 테마, 데이터 백업
4 분 소요

PySide6 실전 강좌 #6 설정 화면 — QSettings, 다크 테마, 데이터 백업

하드코딩되어 있던 값들을 사용자에게 넘깁니다. 플랫폼별 표준 위치에 설정을 저장해 주는 QSettings의 사용법과 타입 함정, 설정 화면과 실제 동작(리마인더 시각, 닫기 버튼 동작)의 연결, 스타일시트 교체로 구현하는 다크·라이트 테마와 시스템 테마 감지, 그리고 사용자 데이터를 존중하는 마지막 조각인 CSV 내보내기와 DB 백업까지 다룹니다.

PySide6 실전 강좌 #5 트레이 상주와 리마인더 — 닫아도 죽지 않는 앱
5 분 소요

PySide6 실전 강좌 #5 트레이 상주와 리마인더 — 닫아도 죽지 않는 앱

습관 트래커를 진짜 도구로 만드는 조건, 상주를 구현합니다. QSystemTrayIcon으로 시스템 트레이에 아이콘과 메뉴를 띄우는 법, 창 닫기를 종료가 아니라 숨기기로 바꾸는 closeEvent 처리와 그 UX 논쟁, QTimer로 매일 정해진 시각에 리마인더 알림을 보내는 법, 트레이 알림의 한계와 운영체제별 차이, 그리고 앱이 두 개 떠 버리는 것을 막는 단일 인스턴스 처리까지 다룹니다.

PySide6 실전 강좌 #4 통계 화면 — QPainter로 잔디 히트맵 그리기
4 분 소요

PySide6 실전 강좌 #4 통계 화면 — QPainter로 잔디 히트맵 그리기

기성 위젯이 없는 화면을 직접 그립니다. 달성률 계산과 연속 기록 같은 통계 로직을 Qt 없는 core 층에 두고 테스트 가능하게 만드는 법, paintEvent와 QPainter로 깃허브 잔디 스타일의 히트맵 위젯을 그리는 법, 좌표 계산과 크기 대응(resizeEvent, sizeHint), 마우스 위치의 칸을 찾아 툴팁을 띄우는 히트 테스트, 그리고 다시 그리기는 update() 호출로 요청한다는 커스텀 위젯의 규칙까지 다룹니다.

PySide6 실전 강좌 #3 오늘 화면 — 커스텀 모델과 체크 토글
4 분 소요

PySide6 실전 강좌 #3 오늘 화면 — 커스텀 모델과 체크 토글

앱의 첫 실제 화면을 만듭니다. 리스트 위젯에 직접 아이템을 넣는 방식이 실전에서 금방 한계에 부딪히는 이유, QAbstractListModel을 상속해 리포지토리를 뷰에 연결하는 커스텀 모델, 역할(role)로 데이터의 여러 얼굴을 노출하는 법, 체크 상태 토글이 모델을 거쳐 DB까지 흐르는 경로, dataChanged 시그널로 뷰를 정확히 갱신하는 법, 습관 추가 다이얼로그까지 다룹니다.

PySide6 실전 강좌 #2 SQLite 데이터 층 — 리포지토리 패턴과 마이그레이션
5 분 소요

PySide6 실전 강좌 #2 SQLite 데이터 층 — 리포지토리 패턴과 마이그레이션

앱의 기억을 담당하는 데이터 층을 만듭니다. 데스크톱 앱에 SQLite가 기본값인 이유, 운영체제마다 다른 앱 데이터 폴더를 올바르게 찾는 법, 습관과 체크 기록의 스키마 설계, SQL을 한곳에 모으는 리포지토리 패턴, 그리고 앱 업데이트 후에도 사용자 데이터가 깨지지 않게 하는 user_version 기반의 초간단 마이그레이션까지 다룹니다.

PySide6 실전 강좌 #1 프로젝트 설계 — 습관 트래커를 만들며 배우는 앱 구조
5 분 소요

PySide6 실전 강좌 #1 프로젝트 설계 — 습관 트래커를 만들며 배우는 앱 구조

PySide6 입문을 마친 사람이 실제 앱 하나를 완성까지 끌고 가는 실전 시리즈의 첫 편입니다. 무엇을 만들지(로컬 습관 트래커)와 왜 이 소재인지, 기능 요구를 화면 단위로 쪼개는 법, UI·코어·데이터의 3층으로 코드를 나누는 구조와 그 이유, uv 기반 프로젝트 셋업, 그리고 앞으로 8편을 지탱할 메인 윈도우 뼈대까지 만듭니다.

NumPy 입문: 배열이 파이썬 리스트보다 빠른 이유와 기본 사용법
6 분 소요

NumPy 입문: 배열이 파이썬 리스트보다 빠른 이유와 기본 사용법

데이터 작업의 기반 라이브러리 NumPy를 원리부터 정리합니다. 파이썬 리스트가 느릴 수밖에 없는 메모리 구조와 ndarray가 그것을 해결하는 방식, 루프를 없애는 벡터화 연산, 모양이 다른 배열끼리 계산되는 브로드캐스팅의 규칙, 슬라이스가 복사가 아니라 뷰라서 생기는 함정, axis 개념으로 읽는 집계, 그리고 NumPy를 쓰지 않는 것이 나은 경우까지 다룹니다.

Rust에서 JSON 다루기: serde 역직렬화 실전 정리
5 분 소요

Rust에서 JSON 다루기: serde 역직렬화 실전 정리

Rust JSON 처리의 표준인 serde를 실전 순서로 정리합니다. derive 한 줄로 시작하는 구조체 역직렬화, 필드가 없을 수도 있는 현실 JSON을 받는 Option과 default, API의 camelCase를 잇는 rename_all, 구조를 모르는 JSON을 더듬는 Value, 형태가 여러 개인 응답을 받는 enum과 untagged, 그리고 에러 메시지에서 위치를 읽는 법까지 다루겠습니다.

PyO3로 파이썬 확장 모듈 만들기: maturin 빌드부터 wheel 배포까지
4 분 소요

PyO3로 파이썬 확장 모듈 만들기: maturin 빌드부터 wheel 배포까지

Polars, Ruff, pydantic이 증명한 경로인 "파이썬의 병목 함수만 Rust로"를 직접 밟아 봅니다. maturin new로 시작하는 프로젝트 구조, #[pyfunction]과 #[pymodule]로 Rust 함수를 파이썬에 노출하는 법, maturin develop의 개발 사이클, 타입 변환(str·list·dict)의 규칙, free-threaded 파이썬 시대와의 궁합, 그리고 wheel 빌드와 PyPI 배포까지 다루겠습니다.

Box, Rc, Arc 차이: Rust 스마트 포인터, 언제 무엇을 쓰나
5 분 소요

Box, Rc, Arc 차이: Rust 스마트 포인터, 언제 무엇을 쓰나

기초 강좌가 The Book에 맡겨 둔 공백을 회수합니다. 값을 힙에 두는 Box가 필요한 세 상황(재귀 타입, dyn 트레이트, 큰 값의 이동), 소유자를 여럿 만드는 Rc와 참조 카운트, 스레드를 건너는 Arc, 런타임 빌림 검사로 내부 가변성을 여는 RefCell, 그리고 실무 관용구인 Rc<RefCell<T>>와 Arc<Mutex<T>>까지, 선택 기준을 결정 순서도로 정리하겠습니다.