본문 바로가기

javascript/nodejs

MYSQL & dotenv : errno 1045(Access denied) & dotenv 의 # 인식

 ORM은 Object-Relational Mapping의 준말로, 기존 데이터베이스들에 저장된 데이터들에 대한 객체 매핑을 제공해준다. 따라서 ORM을 이용하면 기존의 SQL 혹은 NOSQL에 대한 쿼리 작업은 ORM 에게 맡기고, 사용자는 데이터베이스 내 각 데이터들을 객체 형태로 간단하게 관리할 수 있게 된다.

 Sequelize는 위에서 언급한 ORM의 일종으로, 각종 데이터베이스에 대한 객체 매핑을 제공한다. 사용법은 추후에 다룰 예정이고, 현재 글에서는 dotenv 내에서 #을 사용했을 때 발생한 문제 위주로 설명한다. 


 현재 프로젝트에서는 dotenv 라이브러리를 이용하여 .env 파일 내에 데이터베이스와 관련된 정보( DB_NAME, DB_ID, DB_PASSWORD ) 을 관리하고 있으며, 해당 환경변수 및 Sequelize을 이용하여 동일 컴퓨터에 존재하는 MYSQL 데이터베이스를 연결하려고 시도하고 있다. 이때 dotenv에 저장된 정보들은 데이터베이스에 대해 유효했다.

sequelize을 이용하여 DB와 연결을 시도한다.
db.sync을 이용해 데이터베이스에 접속을 시도한다.

 데이터베이스에 정상적으로 연동될 것을 기대했지만, 예상과는 달리 Access Denied 에러가 발생했다.

 해당 에러 메시지에서 중요한 점은 1045 : Access denied 에러는 데이터베이스가 존재할 때 발생하는 문제라는 것이다. 현재 프로젝트에서는 데이터베이스의 이름을 DB_NAME 환경 변수로부터 가져오고 있다. 만약 해당 이름에 대응되는 데이터베이스 자체가 존재하지 않는다면 Access denied 에러 대신 1049: Unknown Database 에러가 발생한다.

 1045 에러는 최소한 데이터베이스에는 문제가 없으며, mysql과의 커넥션 자체는 정상임을 알려준다. 따라서 우리는 DB_NAME은 내버려두고, 나머지 환경 변수들에 대해 조사할 수 있다.

 앞서 언급했듯이 환경변수들은 mysql 환경에서 유효했다. 문제는 환경변수에 들어간 # 이었다. dotenv 문서를 살펴보면 #은 해당 라이브러리 내부에서 주석의 시작을 의미한다. 현재 프로젝트에서는 특정 환경변수에 #이 포함되어 있는 상태에서 dotenv는 이를 주석으로 인식했고, 결과적으로 의도한 환경변수가 제대로 동작하지 않았던 것이 문제였다.

 해당 문제는 간단하게 환경 변수를 큰따옴표 또는 작은따옴표로 묶어주면 해결된다.

 큰따옴표로 TEST_ERROR에 대응되는 변수를 묶었더니, 정상적으로 인식하는 모습을 볼 수 있다.


결론 및 요약

 Sequelize을 이용하여 mysql의 특정 데이터베이스에 접근할 때 1045: Access Denied 문제가 발생했다면, 이는 데이터베이스에 대한 접근이 거부된 것이므로, user 혹은 password에 문제가 있는지 검토할 필요가 있다.

 dotenv는 따옴표 내에 없는 # 을 주석의 시작 표지로 인식하므로, #이 포함된 환경변수를 사용해야 할 때는 해당 변수를 큰 따옴표 또는 작은 따옴표로 묶어 표현한다.


 며칠 전에 찬찬히 공식 문서를 읽었음에도 현재 발생한 문제에 대해 처음에는 인식하지 못했는데, 공식 문서를 다시 한번 보고 나서야 해당 내용이 더 확실해졌다. 백문이 불여일견이라고, 백날 들어봤자 내가 한번 겪어보는 것만 못하다는 것이 맞는 말인 것 같다.