API 문서는 API의 사용 방법을 알려줍니다. 하지만 문제가 생겼을 때는 대부분 혼자 해결해야 합니다. 에러 메시지는 불완전하거나, 오해를 불러일으키거나, 아무런 도움이 되지 않는 경우가 많죠. NoMethodError: undefined method '[]' for nil:NilClass 같은 메시지를 보고 도대체 무엇부터 해야 할지 막막하기만 합니다.
API, 프레임워크, 라이브러리를 배울 때는 모든 것이 순조롭게 흘러갈 때의 사용법만 익혀서는 안 됩니다. 에러가 반환되었을 때 어떻게 대응해야 하는지도 함께 파악해야 합니다.
어떻게 코드를 망가뜨릴까?
사용 중인 API에 문제가 생겼을 때 무엇을 해야 하는지 배우는 가장 쉬운 방법이 있습니다. 바로 직접 망가뜨려 보는 것입니다!
예를 들어 다음과 같은 시도를 해볼 수 있습니다:
잘못된 타입의 데이터 전달하기. String 대신 심볼(Symbol)을 넘기거나, Array 대신 String이나 Hash를 넘기는 식으로 말입니다.
불완전한 데이터 전달하기.
nil, 일부 필드가 비어 있는 해시, 방금 초기화만 한 객체 등을 넘겨보세요.네트워크 접근이 필요한 API라면 WiFi를 끄거나 네트워크 케이블을 뽑아보세요. 단순히 타임아웃이 걸리는지, 아니면 접속하지 못한 서비스를 명확히 알려주는지 확인할 수 있습니다.
블록을 전달할 수 있는 API라면 블록 안에서 예외를 던지거나 잘못된 타입의 데이터를 반환해 보세요.
훌륭한 API는 무엇이 잘못되었는지 알려줍니다. 더 뛰어난 API는 그것을 어떻게 고칠지까지 알려주죠. 하지만 대부분의 경우 마주하게 되는 것은 Ruby의 NoMethodError, 예상치 못한 nil, 혹은 그보다 더 나쁜, 완전히 기괴한 반환값들입니다.
왜 굳이 코드를 망가뜨릴까?
이 연습은 결코 나쁘지 않습니다. 오픈소스 젬(gem)을 다룬다면, 예상치 못한 동작이 어디에서 비롯되었고 왜 발생했는지 충분한 시간을 들여 이해할 수 있습니다. 디버깅과 약간의 코드 리딩만으로도 라이브러리나 API가 내부적으로 어떻게 작동하는지 많은 것을 배울 수 있습니다.
NoMethodError의 발생 지점을 찾았다면 한 단계 더 나아갈 수 있습니다. 다음에 실제로 같은 문제를 겪을 사람을 위해 에러 메시지 자체를 고쳐보는 것입니다! 사소한 에러 메시지 수정은 훌륭한 오픈소스 기여이자 부담 없는 풀 리퀘스트가 됩니다. 그리고 Ruby 생태계 전체를 모두에게 조금 더 좋은 곳으로 만듭니다.
클로즈드 소스 REST API라 해도 이 연습에서 얻는 것이 분명히 있습니다. API에서 발생할 수 있는 다양한 에러를 미리 확인해 두면, 실제 운영 환경에서 에러를 만났을 때 문제를 훨씬 빠르고 쉽게 해결할 수 있습니다.
주변 코드의 에러를 보고 수정하는 데 익숙해지면, 깨진 코드를 하나의 풀어낼 퍼즐로 인식하게 됩니다. 화면에 예외와 백트레이스가 쏟아져도 자동으로 움츠러들지 않고, 대신 작업 중인 시스템을 더 깊이 이해할 기회로 받아들이게 됩니다.
마지막으로, 코드가 깨져도 언제든 다시 조립할 수 있다는 확신이 생깁니다. 새로운 라이브러리와 API를 시도하는 자신감이 높아지고, 그 과감함은 새로운 것을 배우는 속도마저 끌어올려 줍니다.