- 파이썬
- python
- boostcourse
- 오라클
- Ai
- r
- SQL
- 기초다지기
- boostcoures
- Oracle
- 이것이 취업을 위한 코딩테스트다 with 파이썬
- 코딩테스트 python
- 데이터베이스
- AI 플랫폼을 활용한 데이터 분석
- 인공지능기초다지기
- 빅데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 프로그래머스
- 코딩테스트
- 빅분기
- 이기적
- [멀티잇]데이터 시각화&분석 취업캠프(Python)
- DB
- 정보처리기사
- PY4E
- 네이버부스트캠프
- unsub
- 부스트코스
- 빅데이터분석기사
- Django
- Today
- Total
목록전체 글 (232)
매일공부
새로고침 직후 첫 클릭만 씹히고, 이슈 앱만 멀쩡했던 이상한 버그. 가설을 다섯 번 갈아치우고 나서야 범인을 잡았다 — 부트스트랩 드롭다운의 상태를 손으로 흉내 낸 코드 한 줄이었다.요약: 기각된 가설 5개, 진짜 원인은 코드 1줄, 영향 범위는 거의 전 앱(이슈 앱만 예외).증상: 첫 클릭은 항상 씹혔다리스트 화면의 검색 필터, 등록 폼의 텍스트·숫자·날짜 입력창, 드롭다운 선택창까지 — 페이지에 처음 진입했을 때(새로고침 직후, 또는 다른 페이지에서 넘어온 직후) 첫 번째 클릭은 아무 반응이 없었다. 입력창을 클릭해도 커서가 안 들어가고, 드롭다운을 클릭해도 안 열렸다. 두 번째 클릭부터는 멀쩡했다. 매번, 어느 브라우저에서나, 운영 서버에서도 항상 재현됐다.단서는 하나 있었다 — 이슈 관리 앱만 이..
9개 앱에 테스트를 새로 추가하면서 겪은 시행착오와, "애초에 뭘 테스트해야 하는가"에 대한 정리. 나중에 또 pytest를 추가하거나 고칠 때 이 글을 보면 될 것 같다.1부 — mock으로 Django 내부까지 흉내내려다 걸린 것들실제 DB에 접속하지 않고 테스트하려고, DB 대신 쓸 "가짜 대역" 객체를 쓴다.from unittest.mock import MagicMockfake_user = MagicMock() # "User인 척"하는 가짜 객체fake_user는 아무 속성이나 접근해도 에러 없이 또 다른 가짜 객체를 돌려준다. 편하지만 문제는, 진짜 Django 객체가 갖고 있는 내부 속성까지는 안 갖고 있다는 것.문제 1 — 폼(Form): __init__을 건너뛰면 내부 속성이 통째로 빔f..
두 줄 요약사내 협업 도구를 다른 개발자와 통합하는 문제로 "지금 만들고 있는 프로젝트를 Node.js/NestJS로 통째로 리팩토링할까?"를 고민했다. 결론은 "지금은 완성이 먼저, 스택 통일은 나중에"였고, 그 판단 근거가 됐던 두 스택의 차이를 정리해둔다.배경혼자서 Django + MariaDB로 개발해온 사내용 프로그램이 있다. 그런데 다른 개발자가 별도 서버에서 Node.js/NestJS + PostgreSQL 기반의 사내 협업 플랫폼을 만들고 있고, 언젠가 두 시스템을 합치게 될 가능성이 있다. 그렇다면 "나중에 다시 짤 바엔 지금부터 NestJS로 맞춰서 가는 게 낫지 않나?" 하는 생각이 자연스럽게 들었다.하지만 지금 당장 다른 언어·프레임워크로 갈아타기보다는, 진행 중인 프로젝트를 Dja..
증상apps/folders/utils.py:39: SyntaxWarning: "\)" is an invalid escape sequence.Such sequences will not work in the future. Did you mean "\\)"? A raw string is also an option. - 파일구분문자(/, \), 제어문자, 콜론 등 제거 또는 대체apps/folders/utils.py:255: SyntaxWarning: "\S" is an invalid escape sequence.Such sequences will not work in the future. Did you mean "\\S"? A raw string is also an option. """DB에 저장된 \\S..
발단salesproject 디버깅 결과를 리뷰하다가 조치사항에 이런 항목이 있었다.컨테이너에서 black 실행 — 이번 수정분 스타일 정리 + 2-space 들여쓰기 자동 교정컨테이너에서 pytest 실행 — 정적 리뷰만 하고 직접 못 돌렸음...python manage.py check 실행pytest, mypy는 이미 pre-receive 훅에 걸려 있어서 push할 때마다 자동으로 도는데, black은 없었다. "왜 하나만 빠졌지?"에서 시작한 확인이었다.black과 pytest/mypy는 애초에 카테고리가 다르다겹치는 도구가 아니라 서로 다른 역할을 나눠 맡는다.black — 코드 포매터. 들여쓰기, 따옴표, 줄바꿈, 공백 같은 스타일만 자동으로 고쳐준다. 테스트도 안 하고 타입도 안 본다.pyte..
이메일 캠페인 도구 개발기 시리즈 (9/9). 전체 개요배포 구조Docker + Synology NAS. web 컨테이너 하나만 상시 실행(포트 5050:8000)예약 발송은 별도 컨테이너 없이, NAS Task Scheduler가 1분 주기로 docker exec unsub_web python scripts/send_scheduled_campaigns.py를 실행하는 방식 — 상시 대기하는 두 번째 컨테이너 없이도 예약 발송이 동작한다리버스 프록시로 unsub.example.com 연결(DSM 애플리케이션 포털 → 역방향 프록시)# 배포cd /volume1/docker/unsub_appsudo docker compose up -d --build# 이후 업데이트git pullsudo docker comp..
이메일 캠페인 도구 개발기 시리즈 (8/9). 전체 개요왜 필요했나send_messages(발송 함수)는 원래 성공 시 카운터만 올리고, 실패는 print()로 콘솔에만 남겼다. 캠페인이 sent로 바뀐 뒤에는 "실제로 누구에게 성공적으로 발송됐는지"를 나중에 조회할 방법이 전혀 없었다 — 수신자 목록 자체가 발송 시점에 동적으로 계산될 뿐 저장되지 않기 때문. 최소 기능으로 "누구한테 보낸 게 성공/실패했는지" 이력을 남기고, 캠페인 상세 화면에서 조회할 수 있게 했다.스키마CREATE TABLE campaign_send_logs ( id INT NOT NULL AUTO_INCREMENT, campaign_id INT NOT NULL, subscriber_id INT NULL, email VAR..
이메일 캠페인 도구 개발기 시리즈 (7/9). 전체 개요문제캠페인 수신 대상은 두 갈래로 나뉜다.친환경 사업 고객: 이 앱 자체 테이블 eco_contacts에 이름/회사/부서/직책/연락처 저장SW 사업 고객(그룹 100/101/102): 영업 관리 시스템이 소유한 salesdb.customer (같은 MySQL 서버의 다른 스키마)에 데이터가 있음subscribers 테이블 하나로 발송 대상(이메일 + 구독 여부 + 그룹)을 관리하지만, 이메일 주소만으로는 "이 사람이 누구인지" 알 수 없어서 관리 화면에서 이름/소속을 같이 보여줘야 했다.설계: LEFT JOIN이 아니라 상관 서브쿼리subscribers에는 eco_contact_id FK가 있어 eco_contacts는 그냥 LEFT JOIN하면 된..
이메일 캠페인 도구 개발기 시리즈 (6/9). 전체 개요메일 클라이언트마다 CSS/HTML 해석이 제각각이라, "화면에서는 예쁘게 보이는 HTML"이 "실제 수신함에서도 똑같이 보인다"를 보장하지 않는다. 이 프로젝트에서 겪은 문제들을 순서대로 정리한다.1. Quill 에디터의 글자 크기/정렬이 실제 메일함에서 안 먹히던 문제캠페인 본문 입력에 Quill(WYSIWYG 에디터)을 붙였는데, Quill은 기본적으로 글자 크기 (ql-size-*)와 정렬(ql-align-*)을 CSS class로 저장한다. 문제는 발송되는 메일 HTML에는 그 class를 정의하는 스타일시트가 포함되지 않는다는 것 — 이메일은 보통 블록이나 외부 CSS를 신뢰하지 않고 인라인 style 속성만 확실하게 렌더링한다.해결: ..
이메일 캠페인 도구 개발기 시리즈 (5/9). 전체 개요문제초기 버전은 캠페인을 만들면 바로 pending 상태가 되고, 스케줄러 (scripts/send_scheduled_campaigns.py)가 scheduled_at이 되면 별도 확인 없이 전체 대상자에게 즉시 발송했다. 실수로 오타가 있는 본문, 잘못된 대상 그룹을 그대로 전체 발송해버릴 위험이 있는 구조였다.해결: 상태 머신에 "테스트 승인" 단계 추가pending_review (작성/테스트 대기) │ 테스트 발송(TEST 그룹) 성공 ▼ pending (승인, 예약 발송 대기) │ scheduled_at 도달 + 스케줄러 실행 ▼ sending → sent / failedcampaigns.st..