- 정보처리기사
- r
- 오라클
- python
- AI 플랫폼을 활용한 데이터 분석
- Ai
- 프로그래머스
- 빅데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- 데이터 분석 기반 에너지 운영 관리자 양성 및 취업과정
- Django
- 부스트코스
- 네이버부스트캠프
- boostcourse
- [멀티잇]데이터 시각화&분석 취업캠프(Python)
- SQL
- 데이터베이스
- DB
- unsub
- PY4E
- boostcoures
- 파이썬
- 코딩테스트
- 인공지능기초다지기
- 이기적
- 빅분기
- 이것이 취업을 위한 코딩테스트다 with 파이썬
- 코딩테스트 python
- Oracle
- 빅데이터분석기사
- 기초다지기
- Today
- Total
목록전체 글 (235)
매일공부
사내에서 운영 중인 이메일 발송(수신거부/캠페인 관리) 앱에 "발송하는 메일마다 참조(CC)를 걸 수 있게 해달라"는 기능 요청이 들어왔다. 간단해 보이는 요청이었지만, 구현하면서 실제로 한 번은 겪어봐야 아는 함정을 만나서 기록해둔다.요구사항캠페인(메일 발송 단위)마다 CC 수신자를 지정할 수 있어야 한다한 명이 아니라 여러 명을 지정할 수 있어야 한다실제 발송뿐 아니라 테스트 발송에서도 동일하게 동작해야 한다설계: 캠페인 단위 CCCC를 어느 레벨에서 관리할지부터 정해야 했다. 후보는 두 가지였다.시스템 전역 설정으로 고정 CC 주소를 두는 방식캠페인(발송 건)마다 개별적으로 CC를 지정하는 방식캠페인마다 성격이 다르고(부서별, 대상별로 다른 담당자가 참조로 들어가야 하는 경우가 있음), 매번 관리자..
배경홍보 메일을 두 건 연달아 발송했다. 앞의 메일은 13명한테 보내는 거라 순식간에 전체 성공했고, 뒤이어 보낸 약 650~700명짜리 메일이 문제였다 — 초반 50~100명까지는 정상 속도로 나가다가, 그 지점을 넘기고 나서부터 갑자기 1분에 5~6건으로 뚝 떨어졌다. 원인을 찾다가 두 번이나 진단을 정정하게 된 이야기.1차 의심 — 첨부파일 (이번엔 해당 없음)이전에 다른 캠페인에서 4MB짜리 PDF 첨부파일 때문에 느려진 적이 있었다. 수신자마다 첨부파일을 매번 다시 읽어서 base64로 인코딩하고 SMTP로 업로드하는 구조였는데, 4MB → base64 인코딩 시 약 5.4MB, 수백 명이면 총 수 GB를 업로드하는 셈이었다. 이번엔 첨부파일이 없어서 이 원인은 아니었다.2차 의심 — 본문에 박..
요약운영서버에 새 기능(발주서 관리)을 배포하는데 migrate가 이런 에러를 내며 실패했다.django.db.utils.OperationalError: (1054, "Unknown column 'status' in 'NEW'")원인은 한 문장으로 요약된다.마이그레이션 파일이 "그 시점의 스키마"를 기록해야 하는데, 트리거 생성 SQL을 매번 파일에서 읽어오는 방식이라 나중에 그 파일을 고치면 과거 마이그레이션까지 조용히 동작이 바뀌어 버린다.이 글은 이 버그를 잡은 과정, 왜 지금까지 개발 환경에서는 한 번도 안 터졌는지, 그리고 같은 유형의 버그가 프로젝트에 더 있는지 전수조사한 결과와 재발 방지책을 정리한 기록이다.1. 발생 상황사내 B2B 영업관리 시스템(Django 기반, 이하 "이 프로젝트")..
새로고침 직후 첫 클릭만 씹히고, 이슈 앱만 멀쩡했던 이상한 버그. 가설을 다섯 번 갈아치우고 나서야 범인을 잡았다 — 부트스트랩 드롭다운의 상태를 손으로 흉내 낸 코드 한 줄이었다.요약: 기각된 가설 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..
발단개발 중인 project 디버깅 결과를 리뷰하다가 조치사항에 이런 항목이 있었다.컨테이너에서 black 실행 — 이번 수정분 스타일 정리 + 2-space 들여쓰기 자동 교정컨테이너에서 pytest 실행 — 정적 리뷰만 하고 직접 못 돌렸음...python manage.py check 실행pytest, mypy는 이미 pre-receive 훅에 걸려 있어서 push할 때마다 자동으로 도는데, black은 없었다. "왜 하나만 빠졌지?"에서 시작한 확인이었다.black과 pytest/mypy는 애초에 카테고리가 다르다겹치는 도구가 아니라 서로 다른 역할을 나눠 맡는다.black — 코드 포매터. 들여쓰기, 따옴표, 줄바꿈, 공백 같은 스타일만 자동으로 고쳐준다. 테스트도 안 하고 타입도 안 본다.pyt..
이메일 캠페인 도구 개발기 시리즈 (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..