...loading
2025-03-05
나와 같이 개발자를 꿈꾸는 사람들,, 카페 이곳저곳을 들리며 개발을 하고는 한다. 그런데 이런 공용 와이파이를 사용하면서 개발하다보면 종종 문제가 발생한다. 오늘은 오랜만에 스타벅스에 들렸다가 이 문제로 2시간 가까이를 소모했고, 결국에는 너무 간단하게 해결할 수 있었다.
오랜만에 블로그를 리팩토링 하려다가 문제를 발견했다. 배포 환경에서는 블로그가 분명히 잘 돌아가는데, 로컬 환경에서 먹통이 되어버린다. 뭐가 문제인지 알 수가 없다.. 여러가지 문제들이 떠올랐지만, 코드를 둘러봐도 크게 문제는 없었다. 환경변수도, 서버 코드의 문제도 바뀐게 없고 문제가 없었다. 터미널에서는 계속 500코드만 뱉어내고 있다..
이때쯤은 그냥 공용와이파이 문제라 생각했다. 핫스팟을 켜도 문제 상항은 계속 같았지만, 집으로 가면 해결될 것 같았다. 그래도 문제를 해결하고 싶어 터미널을 쭉 읽어봤다. 그런데 여러줄의 500에러에 가려 제대로 확인하지 못한 부분이 있었다.
해당 에러로그를 보고 ENODATA와 querySrv키워드를 검색하여 쉽게 문제를 해결할 수 있었다. 방법은 아주 간단했다. 노트북의 네트워크 상세 설정으로 들어가 DNS 서버를 8.8.8.8(구글 DNS)로 설정해준다.
허무하게도 DNS 서버를 바꿔주는 것만으로 간단하게 해결되었다
이제 왜 이런 에러가 발생했는지 알아보자. 우선 MongoAtlas의 ENODATA는 DNS 조회 결과가 없을 때 발생하는 오류다. 즉, DNS로부터 응답을 못받았다는 것이다. 원인을 차근차근 알아보자.
MongoAtlas의 클라우드 서비스를 사용하게 될 때, 클라이언트는 데이터 조회를 위해 설정해둔 클러스터의 주소로 요청을 보낸다. 그리고 주소의 접두어로 mongodb+srv://
를 붙여 요청을 보낸다.
// env DB_URI=mongodb+srv://Taki:**********************************=MyCluster
위의 코드는 MongoAtlas를 한번이라도 사용해봤으면 익숙한 코드일 것이다. 이처럼 보통 설정해둔 클러스터의 URI를 env파일에 설정해두는데, MongoAtlas의 지침에 따라mongodb+srv://
라는 접두어와 함께 설정하여 저장해둔다.
그리고 이는 DNS로부터 해당 클러스터 주소에 대한 SRV레코드를 반환받겠다는 것이다.
이 접두어를 사용하면, 클라이언트는 DNS로부터 SRV레코드를 조회하게 된다. 그렇다며 SRV 레코드는 무엇일까? SRV 레코드는 서버가 클라이언트에게 연결할 수 있는 여러 주소와 포트를 제공하는 DNS 레코드다. 즉, 대형 클라우드나 분산 서비스에서 서버가 사용자에게 원할한 접속을 돕기 위해 접속 가능한 여러가지 주소를 제공하는 것이다.
따라서 클라이언트가 mongo+srv://
의 접두어와 함께 클러스터 주소에 대한 요청을 실행하면, DNS 서버로부터 아래와 같은 유형의 SRV레코드를 반환받는다.
_mongodb._tcp.example.com. 3600 IN SRV 10 50 27017 server1.example.com. _mongodb._tcp.example.com. 3600 IN SRV 10 50 27017 server2.example.com.
반환 내용은 접속 가능한 서버의 목록이고 27017
은 포트 번호를 serverN.example.com
은 도메인 주소를 의미한다. 클라이언트는 하나의 서버를 선택하여 다시 DNS에 쿼리를 보내 IP를 반환받아 연결을 진행한다.
그렇다면 왜 핫스팟이나 스타벅스 와이파이에서 왜 ENODATA 오류가 발생했을까? 즉, 왜 DNS로부터 SRV 레코드를 반환받지 못한걸까? 이는 핫스팟이나 스타벅스와 같은 공공 네트워크가 사용하는 DNS의 문제일 수 있다. 자체 DNS가 SRV 레코드를 지원하지 않거나, 차단하고 있을 가능성이 있다.
따라서, 공공 네트워크를 사용할 때 ENODATA와 같은 에러가 발생한 것이다. 그리고 간단하게 네트워크 설정에서 DNS 서버를 바꿔줌으로써 문제가 쉽게 해결할 수 있었다. 구글(8.8.8.8) 혹은 클라우드플레어(1.1.1.1)와 같은 범용적인 DNS 서버를 사용한다면, SRV 레코드 또한 문제없이 반환받을 수 있기 때문이다.
문제를 해결해 로컬호스트로 이렇게 포스팅을 쓴다. 이러한 문제가 mongoAtlas에만 국한되는 문제는 아니라고 생각한다. SRV레코드를 지원하지 않는 DNS를 사용하게 될 경우 다른 클라우드 서비스에서도 비슷한 문제들을 겪지 않을까하며, 이러한 오류를 겪고 왜 발생했는지 궁금한 사람들에게 도움이 되길 바란다. 그리고 나도 이 문제에 대해서는 더 이상 시간을 쏟지 않길 바라며.. 포스팅을 마무리한다.
Comments