오늘 해낸 것 (2026-05-15)
이 글은 Daily Log 시리즈의 55번째 기록입니다. (총 155개)
오늘 한 일
- 회사 툴
- 시설물별 사양(Spec 항목)을 인라인 테이블로 관리.
- 이유: 별도의 field로 따로 관리하기에는 시설물별 spec이 너무 다양했다.
- 해결: 항목은 사용자가 추가/삭제 가능하도록 하되 기존에 입력했던 것을 목록으로 보여줘 고를 수도 있게 했다. 문제점은 사용자가 항목을 오타낼 수 있다는 점인데 일단 사용자가 적은 상태이므로 패스
- 시설물의 관할(purpose) field 생성
- 이유: 시설물 마다 어디를 관할하는 것인지 표기가 필요했음
- 해결: text field 생성
- work에서 연관 시설물 선택 시 location 자동 입력.
- 이유: 시설물 model에 위치가 있는데 시설물을 수리하는 work의 특이사항이 없다면 시설물이 있는 위치에서 수리할 것이므로 재차 입력하기 번거로웠다
- 해결: 혹시 수동 입력 필요할 수 있으니 boolean 처리
- Payment와 Work 관계를 CASCADE로 변경.
- 이유: 작업을 했으면 돈이 나갈텐데 돈이 안나간다면 작업을 하기로 했다가 안한 것이고 그런 경우 해당 work를 fk를 사용하는 곳들에 데이터가 남게된다.
- 해결: 혹시 무상 수리되는 건이 있을 수 있으니 Payment 삭제 시 연결된 work 목록을 이용한 경고 표시하여 분리 해야함을 사용자로 인지하도록 함.
- ErrorLog 중복 방지
- 이유: 보통 오류가 발생하면 동일한 동작을 여러번 누르게되어 같은 오류가 여러번 발생함
- 해결: 동일 (exception_type, exception_message, path) 조합은 get_or_create + F(“count”) + 1 + last_seen 갱신.
- 결과: 발생 횟수, 최초/최근 발생 시각 컬럼 생성 및 최근 발생 역순 정렬해서 몇 번 발생되었고 가장 마지막에 언제였는지 확인하도록 구현
- 시설물별 사양(Spec 항목)을 인라인 테이블로 관리.
- 습관만들기 Pawbit 개발
어려웠던 점
배운 점
- @login_required는 바로 아래 def에 붙는다.
- 데코레이터와 함수 사이에 다른 def를 끼워 넣으면 그 함수에 잘못 적용된다. 헬퍼 함수를 @login_required 위에 두거나, 데코레이터 직후에 바로 대상 함수가 오도록 순서를 지켜야 한다.
- Django FK+M2M 혼합 prefetch 주의
- 문제점: M2M 거쳐 FK, 또는 FK 거쳐 M2M을 prefetch_related로 체이닝하면 불안정하다.
- Work.facility→ M2M (여러 facility)
- facility.location → FK (하나의 location)
- Work.location ← 여기에 자동으로 채우려는 상황
- 방안: FK는 select_related, M2M은 prefetch_related → 각각 따로 접근할 것
- 문제점: M2M 거쳐 FK, 또는 FK 거쳐 M2M을 prefetch_related로 체이닝하면 불안정하다.
- ErrorLog 중복 방지: get_or_create + F() 패턴
- 문제점: 동일 에러가 반복 발생할 때 매번 row를 INSERT하면 로그가 폭증한다.
- 방안: get_or_create로 중복 판별 후, 기존 레코드는 filter(pk=).update(count=F(“count”)+1, last_seen=now())로 처리한다.
- get_or_create: Django ORM 기본 제공 함수. 있으면 get, 없으면 create
- F(): Python에서 계산할 경우 동시에 동일한 에러 발생 시 동시에 count=1를 읽고 count=2로 저장하는 오류를 방지하기 위해 DB 레벨에서 계산한다(log.save()는 race condition에 취약하므로 Python이 계산하고 DB에 저장하는게 아니고 DB에 +1하라는 명령만 보내는 방식).
- auto_now_add=True는 기존 모델에 그냥 추가할 수 없다.
- 이유: ErrorLog 최근 발생 순으로 정렬하기 위해 field 추가함.
- 문제점: 기존 row에 값이 없으므로 Django가 default를 요구한다.
- 방안: default=timezone.now로 선언하면 마이그레이션 시 기존 row에 현재 시각이 채워지면서 통과된다.
_pendingDraftItem패턴 —setTag()함수에 추가 데이터 전달하는 방법- 이유: Draft를 FK로 참조하는 Payment 생성 시 Draft에서 title, date등을 가져오기 위함.
- 문제점: setTag()는 id/name만 받는데 Draft 객체 전체가 필요함. 서버에서 처리하는 경우 Payment 생성 후 저장해야만 확인이 가능해서 저장 → 확인 → 수정으로 단계가 길어짐.
- 방안:
_pendingDraftItem에 임시 저장 후 콜백에서 소비하면 생성과 수정이 한 번에 가능. 단, 초기화(edit 폼 로드 시 자동실행 방지)를 위해 null 리셋 타이밍을 정확히 잡아야 한다.
해야 할 일
- 회사 툴
- 기존 AppSheet에 있던 것 하나씩 구현하기.
- UE5 수업
- RGBP 복습
- VS2022 Cplus 복습
- ChordSheet
- 섹션 색상 Picker 만들기
- 다중선택 > 마디 복제 만들기
- Gacha
- 동전을 먹으러 돌아다니면 체력이 깎이도록 하자
- 김로그의 우당탕탕 개선
- Suggested Posts 구현
- 습관만들기 Pawbit
- 풀스택 웹 기초 속성 챌린지
Series: Daily Log
1 | 오늘 해낸 것 2 | 오늘 해낸 것 3 | 오늘 해낸 것 4 | 오늘 해낸 것 5 | 오늘 해낸 것 6 | 오늘 해낸 것 7 | 오늘 해낸 것 8 | 오늘 해낸 것 9 | 오늘 해낸 것 10 | 오늘 해낸 것 11 | 오늘 해낸 것 12 | 오늘 해낸 것 13 | 오늘 해낸 것 14 | 오늘 해낸 것 15 | 오늘 해낸 것 16 | 오늘 해낸 것 17 | 오늘 해낸 것 18 | 오늘 해낸 것 19 | 오늘 해낸 것 20 | 오늘 해낸 것 21 | 오늘 해낸 것 22 | 오늘 해낸 것 23 | 오늘 해낸 것 24 | 오늘 해낸 것 25 | 오늘 해낸 것 26 | 오늘 해낸 것 27 | 오늘 해낸 것 28 | 오늘 해낸 것 29 | 오늘 해낸 것 30 | 오늘 해낸 것 31 | 오늘 해낸 것 32 | 오늘 해낸 것 33 | 오늘 해낸 것 34 | 오늘 해낸 것 35 | 오늘 해낸 것 36 | 오늘 해낸 것 37 | 오늘 해낸 것 38 | 오늘 해낸 것 39 | 오늘 해낸 것 40 | 오늘 해낸 것 41 | 오늘 해낸 것 42 | 오늘 해낸 것 43 | 오늘 해낸 것 44 | 오늘 해낸 것 45 | 오늘 해낸 것 46 | 오늘 해낸 것 47 | 오늘 해낸 것 48 | 오늘 해낸 것 49 | 오늘 해낸 것 50 | 오늘 해낸 것 51 | 오늘 해낸 것 52 | 오늘 해낸 것 53 | 오늘 해낸 것 54 | 오늘 해낸 것 55 | 오늘 해낸 것 읽는 중 56 | 오늘 해낸 것 57 | 오늘 해낸 것 58 | 오늘 해낸 것 59 | 오늘 해낸 것 60 | 오늘 해낸 것 61 | 오늘 해낸 것 62 | 오늘 해낸 것 63 | 오늘 해낸 것 64 | 오늘 해낸 것 65 | 오늘 해낸 것 66 | 오늘 해낸 것 67 | 오늘 해낸 것 68 | 오늘 해낸 것 69 | 오늘 해낸 것 70 | 오늘 해낸 것 71 | 오늘 해낸 것 72 | 오늘 해낸 것 73 | 오늘 해낸 것 74 | 오늘 해낸 것 75 | 오늘 해낸 것 76 | 오늘 해낸 것 77 | 오늘 해낸 것 78 | 오늘 해낸 것 79 | 오늘 해낸 것 80 | 오늘 해낸 것 81 | 오늘 해낸 것 82 | 오늘 해낸 것 83 | 오늘 해낸 것 84 | 오늘 해낸 것 85 | 오늘 해낸 것 86 | 오늘 해낸 것 87 | 오늘 해낸 것 88 | 오늘 해낸 것 89 | 오늘 해낸 것 90 | 오늘 해낸 것 91 | 오늘 해낸 것 92 | 오늘 해낸 것 93 | 오늘 해낸 것 94 | 오늘 해낸 것 95 | 오늘 해낸 것 96 | 오늘 해낸 것 97 | 오늘 해낸 것 98 | 오늘 해낸 것 99 | 오늘 해낸 것 100 | 오늘 해낸 것 101 | 오늘 해낸 것 102 | 오늘 해낸 것 103 | 오늘 해낸 것 104 | 오늘 해낸 것 105 | 오늘 해낸 것 106 | 오늘 해낸 것 107 | 오늘 해낸 것 108 | 오늘 해낸 것 109 | 오늘 해낸 것 110 | 오늘 해낸 것 111 | 오늘 해낸 것 112 | 오늘 해낸 것 113 | 오늘 해낸 것 114 | 오늘 해낸 것 115 | 오늘 해낸 것 116 | 오늘 해낸 것 117 | 오늘 해낸 것 118 | 오늘 해낸 것 119 | 오늘 해낸 것 120 | 오늘 해낸 것 121 | 오늘 해낸 것 122 | 오늘 해낸 것 123 | 오늘 해낸 것 124 | 오늘 해낸 것 125 | 오늘 해낸 것 126 | 오늘 해낸 것 127 | 오늘 해낸 것 128 | 오늘 해낸 것 129 | 오늘 해낸 것 130 | 오늘 해낸 것 131 | 오늘 해낸 것 132 | 오늘 해낸 것 133 | 오늘 해낸 것 134 | 오늘 해낸 것 135 | 오늘 해낸 것 136 | 오늘 해낸 것 137 | 오늘 해낸 것 138 | 오늘 해낸 것 139 | 오늘 해낸 것 140 | 오늘 해낸 것 141 | 오늘 해낸 것 142 | 오늘 해낸 것 143 | 오늘 해낸 것 144 | 오늘 해낸 것 145 | 오늘 해낸 것 146 | 오늘 해낸 것 147 | 오늘 해낸 것 148 | 오늘 해낸 것 149 | 오늘 해낸 것 150 | 오늘 해낸 것 151 | 오늘 해낸 것 152 | 오늘 해낸 것 153 | 오늘 해낸 것 154 | 오늘 해낸 것 155 | 오늘 해낸 것