브랜디에서 인턴을 시작해서 Flask 로 로직을 짜는 중이다.
Flask 의 핵심이라고 생각되는 부분은 (장고와 비교한다면)
1. Controller
2. Service
3. Model 로 나누어져 있다는 것이다.
에러 처리 관련해서, 아래와 같은 고민을 하게 되었다.
나는 service 에서 다양한 에러를 잡아내고, controller 에서 에러에 맞는 status_code 를 호출하고 싶었는데 두 가지가 상충하게 되면서 고민에 빠졌다.
위코드와 브랜디의 답변은 아래와 같다.
1. 위코드 : service 에서 jsonify 까지 해서 다양한 결과를 controller 로 return 해주면, controller 에서는 그대로 전달받은 response 를 front-end로 전달함
2. 브랜디 : service 에서 내부 에러 코드를 정해두고, controller 에서 해당 에러 코드에 맞는 (미리 지정해둔) status_code 와 error_message 를 반환함.
브랜디에서 인턴을 하고 있기 때문에 브랜디의 방법대로 도전해 보기로 했다.
그것도 그렇고, controller-service 의 역할이 명확하게 나누어져 있는데 service 단에서 최종 response (json화)를 만들어 내는 것이 영 마음에 들지 않았다.
결론적으로, utils.py 에 error code 와 error message, client message 를 다 작성해 두고, error 가 발생한 경우 controller 에서는 service 에서 보내준 내부 error 코드를 사용하여 utils.py 에 있는 에러 메세지를 띄우게 된다.
에러를 호출해주는 코드는 다음과 같다.
def error_code(error_dict):
""" 에러코드 및 에러메세지 관리
args:
{'error' : "에러 코드 번호", 'programming_error: exception}
Returns:
Error message & code dictionary
Authors: 김수정 / 홍성은
History:
2020-10-27 : 초기 생성
"""
codes = {
# A (Account)
# 로그인 A1010
'A1011' : {'message': 'INVALID USER',
'client_message': '아이디를 확인하세요', 'code': 401},
'A1012' : {'message': 'WRONG PASSWORD',
'client_message': '비밀번호를 확인하세요', 'code': 401},
'A1013' : {'message': 'KEY_ERROR',
'client_message': '필수정보를 입력하세요', 'code': 401},
'A1014' : {'message': 'NOT VALIDATED YET',
'client_message': '입점 승인 후 이용 가능합니다', 'code': 401},
#----------------중략--------------
# C (공통)
'C0001' : {'message': 'KEY_ERROR',
'client_message': '필수정보를 입력하세요', 'code': 401},
'C0002' : {'message': 'DB_ERROR',
'client_message': 'DB_Connection 실패', 'code': 501},
'C0003' : {'message': 'DB_ERROR',
'client_message': 'DB_Closing 실패', 'code': 501},
}
if 'programming_error' in error_dict:
codes[error_dict['error']]['programming_error'] =
error_dict['programming_error'].args
return jsonify( codes[error_dict['error']] ),
codes[error_dict['error']]['code']