이번에도 문제 자체가 어렵진 않았는데 요구 조건이 추가되면서 좀 복잡했다.
Node.js의 순환 의존성 문제
코드를 어느 정도 작성하고 실행했는데 Warning: Accessing non-existent property 'splice' of module exports inside circular dependency
라는 경고가 와르르 발생했다.
해당 경고를 검색해보니 Node.js 14 버전에서 같은 경고가 발생한다는 이슈가 있었다.
그렇지만 문제의 요구사항이 Node.js 14를 요구하기 때문에 버전을 바꿀 수는 없었다. 에러가 아니라 워닝이니까 일단 무시할까 하다가(무시했으면 is not a function
영원해 해결 못할 뻔..) 조금만 더 찾아보니까 Node.js의 순환 의존성의 문제라고 했다. BridgeGame.js
와 InputView.js
가 서로를 계속 참조해서 무한 호출이 벌어지는 듯 했다. 심지어 내부 함수를 this.func
로 호출해서 나온TypeError: this... is not a function
도 이 문제가 원인이었다!
해결을 위해 InputView.js
에서는 BridgeGame.js
를 호출하지 않게 변경했다. 기존에는 InputView.readMoving()
에서 BridgeGame
클래스를 생성하는 코드였는데, App
에서 생성한 뒤에 해당 클래스가 필요한 메서드에 인자로 넘겨주는 방식으로 수정했다.
클래스와 객체
저번주 과제로 클래스에 어느 정도 익숙해졌다고 생각했는데, 주어진 기본 코드에 클래스와 객체가 섞여있다는 모르고 무작정 시작했다가 어디선 되고 어디선 안돼서 당황했다. 일반 객체에 constructor()
를 사용하기도 하고, this
가 global
이 아니라 undefined
로 떠서 내부 함수가 호출이 안되기도 했다. 이건 this
를 bind
하는 방식으로 수정했어야 하는 것 같은데, 잘 모르겠어서 그냥 재귀호출 했다.(InputView.readMoving
에서 InputView.readMoving
을 다시 호출하는 방식)
언제 new
를 쓰고 언제는 field
인데 언제는 프로퍼티인지, 이런걸 검색해가며 했다.
구현 다 하고 시간이 좀 남아서 메서드 설명을 추가할까 테스트코드를 추가할까 고민하다 JSDoc을 써보려고 설명을 추가했는데 10분 남기고 'BridgeGame
클래스에서 InputView
, OutputView
를 사용하지 않는다.' 요구 조건을 봐버렸다ㅜㅜ 그래서 사람들이 자꾸 컨트롤러를 만든거구나... 남은 10분 동안 열심히 리팩토링했지만 결국 못 고치고 냈다. 이거랑 테스크코드 없는게 크리티컬하게 작용했을 것 같아 걱정이다.