[210728] 업무일지

이승연·2021년 7월 28일
0

업무일지들

목록 보기
11/49
post-thumbnail

오늘 원래 리뉴얼 인프라 구상하고 drf 적용해봤어야 했는데 디버깅만 하다가 끝나버렸다.

1. 카카오 회원가입 안되는 문제

  • 거의 서비스 시작하자마자 카카오 회원가입에 문제가 있다는 것을 깨달았다. 리뷰로도 남겨주셨고 친구들도 가입하려고 할 때 안됐다. 모든 유저가 그런 것은 아니고 특정할 수 없는 몇몇 유저?
  • 백엔드: 해당 가입행위에 대한 에러로그는 없으나 가입 후 진행하는 유저체크에 대한 에러로그가 남아있음
  • 프론트: 카카오 회원가입 시 카카오측에서 보내오는 토큰이 없다는 에러로그 남아있음(?)
  • 결론: 어떠한 이유로 가입시도는 되지만 카카오에서 보내오는 토큰이나 정보에 문제가 있는 상황.
  • 해결방법:
    • 처음에는 카카오에서 보내오는 에러메세지를 잡아서 백엔드 로그에 남기는 api를 만들어달라고 요청이 왔었는데 아무리 생각해도 올바른 방법이 아닌 것 같았다. 클라이언트 단에서 콜백을 하며 받아오는 정보에 문제가 있는 건데 그 response를 받아서 백단에 넘긴 다음에 로그로 박는게.. 이상한 것 같았다. 서버 사이드 에러가 아니지 않나?
    • 조금 찾아보니 프론트는 다음과 같이 에러를 파악한다고 한다:

      프론트엔드 개발자의 입장에서 클라이언트 단의 오류를 파악하는 가장 확실한 방법은 해당 브라우저의 개발자 도구 콘솔을 통해 오류 내용을 파악하는 것.

      • 오류가 발생한 클라이언트 장비에 원격 접속해 직접 웹 브라우저를 확인
      • 서비스를 이용중인 고객에게 직접 ‘웹 브라우저의 개발자 도구를 열고 > 콘솔에 찍힌 오류 내용을 캡쳐해주세요.’ 라는 요구를 한다.
    • 이런 이유 때문에 자바스크립트 오류 remote logging이 필요한 것인데 이유는 다음과 같다:

      자바스크립트의 자유로운 문법 특성상 런타임 오류가 발생하기 쉽다.
      브라우저 콘솔에 찍히는 로그를 확인해야함 오류발생을 확인할 수 있다.
      모바일, 웹뷰 테스트 시 콘솔을 확인하기 어렵다.
      로그를 한 눈에 빠르게 파악할 수 있기 때문에 빠른 대응을 할 수 있다.

    • 따라서 프론트에게 sentry (어플리케이션 단에서 오류가 발생하는 알려주는 에러 트래킹 서비스)를 붙여달라고 요청했다. 다음에 비슷한 문제가 생기면 이 툴로 카카오에서 보내오는 에러 메세지를 해석하고 디버깅할 것이다.
    • https://ddd05.github.io/integration/2021/03/16/frontend-err-log-system-sentry/

2. '기한초과' 태깅 잘못 붙는 문제

  • 유저가 당일 8시 이전에 상담 메세지를 보내오면 상담사는 당일 23:59:59까지, 8시 이후면 익일 23:59:59까지 답신을 보내와야 한다.
  • 상담사가 이 기한을 넘기면 어드민 페이지와 상담가의 유저 페이지에 다음과 같이 '상담사 답변상태'가 조절된다. 해당 패치는 이 링크에 정리되어있다.
  • '상담사 답변상태' 패치가 적용된 이후 며칠 괜찮다가 문제가 생겼다...!:
  • 서둘러 데이터베이스를 확인해보니 데이터베이스 제출일시와 어드민에 보이는 제출일시가 다르더라. 그 이유는 데이터베이스에 utc + timezone 형태로 저장되고 장고 orm으로 데이터를 꺼내올 때 마다 한국시간으로 변환해주기 때문이다. 여기서는 이렇게 당연한 것처럼 말하지만 이거 알아내느라고 머리가 좀 아팠다...

    PostgreSQL
    The PostgreSQL backend stores datetimes as timestamp with time zone. In practice, this means it converts datetimes from the connection’s time zone to UTC on storage, and from UTC to the connection’s time zone on retrieval.
    As a consequence, if you’re using PostgreSQL, you can switch between USE_TZ = False and USE_TZ = True freely. The database connection’s time zone will be set to TIME_ZONE or UTC respectively, so that Django obtains correct datetimes in all cases. You don’t need to perform any data conversions.

  • 사실 프로젝트 settings.py에 들어가면 로컬 타임이랑 시간 객체 설정하는 방법이 있는데 이건 나중에..
  • 알고보니 그냥 코드에 오타가 두개나 있었던 거다. hour=11이 아니라 hour=23이고... now를 기준으로 잡는게 아니라 matchtime을 기준으로 잡아야된다ㅠㅜ 이거 하는 김에 날짜 객체 모듈 import하는 것도 바꿔서 timedelta도 datetime에서 바로 데려오도록 바꿨다. 이유는... 통일성을 위해.
def voiceletter_status_converter(process_status, matchtime):
    now = datetime.now()
    due = matchtime.replace(hour=23, minute=59, second=59) if matchtime.hour <= 8 else matchtime.replace(hour=23, minute=59, second=59) + datetime.timedelta(days=1)

    if process_status < 2:
        return '제출대기'
    elif process_status < 3 and now - due > datetime.timedelta(0):
        return '답신필요(기한초과)'
    elif process_status < 3:
        return '답신필요'
    elif process_status <=5 and now - due > datetime.timedelta(0):
        return '답신완료(기한초과)'
    elif process_status <= 5:
        return '답신완료'
    else:
        return False

3. 로컬호스트로 나에게 접속 안되는 오류

0개의 댓글