Python3/Flask

[Flask] ReferenceError: weakly-referenced object no longer exists

Razelo 2021. 11. 23. 17:53

급하게 이번주까지 완성해야할 프로젝트가 있어서 이것저것 골라보던 중에 Flask를 통해 빠르게 개발하는 것이 좋겠다고 생각했다. 주말에 테이블별로 대충 어떤 속성들이 필요하겠다고 이야기를 했고 일요일밤에 Flask를 빠르게 배우고 코드를 작성해서 지금까지 좀 고쳐나가는 중이다. (워낙 급하게 만들어서 중요한 변수들을 바깥에 그냥 던져놓고 global로 가져다 쓰는 만행을 저지르는중이다.)  대충 기본은 Flask를 통해 api들을 만들어주고 sql 을 직접 날려서 디비의 데이터를 가져오고 view에 보여주는 간단한 코드를 짜는 중이다. 그런데 재밌는 현상을 발견했다. 

 

문제는 다음과 같았다. 

def get_MySQLConnection():
    mydb = mysql.connector.connect( 
            host="127.0.0.1",
            user="root",
            passwd="1234",
            database="flask_test")
    return mydb

위와 같은 함수를 정의해두고 mydb를 필요할때마다 호출해서 리턴받아와서 사용하려 했다. 아래 코드 처럼 말이다. 

mysql_cursor = get_MySQLConnection().cursor(dictionary=True)

그런데 곧 이것이 얼마나 좋지 않은 아이디어인지 알게 되었다. 

곧바로 ReferenceError: weakly-referenced object no longer exists 라는 에러가 발생했다.

이것에 대해 검색해보니 그리 좋은 설명들은 많이 없었는데 그나마 아래 링크에서 가장 좋은 설명을 찾을 수 있었다. 

https://stackoverflow.com/questions/1482141/what-does-it-mean-weakly-referenced-object-no-longer-exists

 

그런데 여기서는 순환참조와 레퍼런스 카운팅에 대해서 장황하게 이야기하고 있어서 당최 핵심을 잡을 수가 없었다. 

 

그런데 다른 곳에서 한마디로 요약할 수 있는 말을 찾았는데 

바로 mysql connection을 사용하려고 할때 다른 scope로 빠져나가는 즉시 cursor 가 break 된다는 것이었다. 그러니 해결과정은 다른 변수에 저장해놓으면 되겠다 싶어서 다음과 같이 작성해주었다. 

mysql_connection = get_MySQLConnection()
    mysql_cursor = mysql_connection.cursor(dictionary=True)

이렇게 작성하면 mysql_connection이 리턴받은 mydb 객체를 새롭게 reference하고 있기 때문에 문제가 발생하지 않는다. 잘 작동하는걸 확인할 수 있었다. (이런 동작을 해야만 하는것. 그냥 파이썬에서는 이러한 동작이 필요한 것이다. 이 역시 매번 느끼는 파이썬의 단점이라는 생각이 든다. 객체를 참조하는 특유의 방식말이다. 조금 헷갈려서 실수할 여지가 생긴다고 생각한다. )

 

Flask 가 경량 프레임워크라는 이야기를 하던데 가볍다는 말이 정확히 어떤 느낌일까 체감이 되지 않았는데 이번에 써보고 나서 느낄 수 있었다. 빠르게 개발하느라 다른 것은 신경쓰지 않고 오직 작동하길 바라는 마음에서 이번주까지 빠르게 만들고 있는데 전혀 신경쓸게 거의 없다는 느낌을 받았다. 진짜 말그대로 뚝딱뚝딱이다. 원하는 대로 만들면 된다. 

 

Spring framework처럼 어떤 구조를 잡고 만들어낸다기보다는 정말 빠르게 만들어볼 수 있다는 느낌을 받았다. 그래서 꽤나 재밌게 만들고 있다. 

 

반응형