TIL Flask 시작

dev.soo·2020년 11월 1일
0

브랜디에서 인턴을 시작해서 Flask 로 로직을 짜는 중이다.

Flask 의 핵심이라고 생각되는 부분은 (장고와 비교한다면)
1. Controller
2. Service
3. Model 로 나누어져 있다는 것이다.

에러 처리 관련해서, 아래와 같은 고민을 하게 되었다.

  1. 에러를 실질적으로 확인하는 곳은 Service 임
  2. 에러를 반환하는 곳은 Controller 임
    -> 에러를 service 에서 상세하게 잡아 내서 바로 jsonify 로 response 를 만들어 주는 경우 :
    controller 에서 json 화 할지 말지, 어떤 결과를 내주게 될지, 특히 status_code 를 만들어 주지 못함.
    -> 그렇다고 controller 에서 상세하게 에러를 잡아주자니, Service 에서 정해둔 에러 값을 controller 에서 변수명을 불러와서(?) 그대로 호출해주게 됨. 결국 일을 두 번 하게 됨

나는 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']
        

0개의 댓글