이 글은 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 갱신.
      • 결과: 발생 횟수, 최초/최근 발생 시각 컬럼 생성 및 최근 발생 역순 정렬해서 몇 번 발생되었고 가장 마지막에 언제였는지 확인하도록 구현
  • 습관만들기 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 → 각각 따로 접근할 것
  • 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 오늘 해낸 것