# 회원 가입 부분
users = User.objects.filter(
Q(email=email) |
Q(phone=phone) |
Q(user_name=user_name)
)
# if len(users) > 0:
# raise AlreadyExistException
# 위의 코드를 아래와 같이 수정
if users:
raise AlreadyExistException
def is_blank(*args):
for value in args:
if value == "" or value is None:
return True
else:
return False
# 위 코드를 아래와 같이 수정. all 메서드를 활용하여 boolean 으로 리턴되게 하였다.
def is_blank(*args):
return not all([value for value in args])
에러 핸들링의 의미는, 해당 에러를 고치는 것이 목표이기 때문에 명확한 솔루션을 제공해야 한다.
대상이 명확하지 않는 에러 핸들링은 오히려 아무 솔루션을 제공하지 않기 때문에 오히려 디버깅이 어려워질 수 있다. Exception 을 선언할 때는, 로직에서 발생할 수 있는 모든 에러를 처리한 후, 혹시 발생할지 모르는 에러를 처리할 때 사용한다.
except KeyError:
return JsonResponse({"message": "KEY_ERROR"}, status=400)
except BlankFieldException as e:
return JsonResponse({"message": e.__str__()}, status=400)
except User.DoesNotExist:
return JsonResponse({"message": "INVALID_USER"}, status=400)
except Exception as e:
return JsonResponse({"message": "UNKNOWN_ERROR"}, status=400)
# except Exception 문 삭제 후, AttributeError 에러가 발견되어 AttributeError 추가.
view 는 View 돌림으로.
class PostListAll(View):
~~~
# 아래와 같이 수정
class PostListAllView(VIew):
~~~
Pull Request 를 할 때는 나의 코드가 아무 문제 없이 돌아가고, 팀원들에게 배포되어도 좋다는 뜻이다. 즉, Production 코드가 완성되었다는 의미이다.
따라서 주석, 불필요한 코드, 불필요한 임포트 등은 전부 깔끔하게 정리가 된 상태이어야 한다.
만약 리뷰를 거친 후에 PR을 해야하는 상황이 있다면, Draft PR 을 할 수 있다.
Draft PR 에는 주석 등을 넣어도 무방하다.
리뷰하는 문화를 위해서, 짧게 짧게 커밋하는 것이 좋다.
또한 팀원들과의 코드 공유를 위해서 코드 컨벤션을 잘 지키는 것이 도움이 된다.
리뷰어의 눈에 코드가 빨리 들어와야 빨리 진행이 되기 때문이다.
에러 메세지는 프론트 앤드 개발자가 보기 때문에, 한글로 하지 않아도 된다.
공통의 메세지를 만드는 것이 도움이 된다.
name = dict.get(“name”, None)
위와 같은 코드는 KeyError 를 절대로 발생시키지 않는다.
활용하기에 따라서 좋은 코드가 될 수 있다.
python 은 말하듯이 짜여진 프로그램 언어이다.
따라서 자신이 짠 코드를 잘 설명할 줄 알아야 한다.
자신이 짠 코드를 잘 설명할 수 있도록 연습하도록 하자.
디버그가 필요한 경우 import pdb 를 활용해보세요..!
좀 더 파이써닉한 코드를 어떻게 짤 것인가를 고려하게 되었다는 것이 첫번 째이고, 두번째는 무의식적으로 넣었던 예외 처리 코드는, 반드시 명확한 솔루션을 제공해야 한다는 점을 얻을 수 있었다.
시간이 좀 지나서 보게 됐습니다. 그동안 많이 성장하셨겠죠. 그러나 저처럼 보게될 사람들을 위해 댓글을 남깁니다. 다른 내용은 다 좋지만 리뷰2의 is_blank 함수는 args에 0과 False가 들어와도 True를 리턴합니다. is_blank(0, 1, 2, 3)의 경우죠. 그러니 의도에 맞춰 0과 False는 따로 감지하도록 바꾸는게 좋습니다. 추가로 비어있는 리스트, 튜플 등도 감지하기에 상황에 따라 예외가 더 생길 수 있습니다.
return not all(x if x not in {0, False} else True for x in args)