더북(TheBook)
describe('verifier', () => {
    test('class constructor: on weekends, throws exception', () => {
        const verifier = new PasswordVerifier([], new FakeTimeProvider(SUNDAY));
        expect(() => verifier.verify('anything'))
            .toThrow("It's the weekend!");
    });
});

이 코드는 자바스크립트가 기본적으로 매우 관대한 언어라서 돌아간다. 자바스크립트는 너무나도 관대하여 루비나 파이썬처럼 덕 타이핑(duck typing)이 가능하다. 덕 타이핑이란 ‘어떤 새가 오리처럼 걷고 헤엄치고 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다’는 아이디어로, 동적 타이핑의 한 종류다.12 이 경우 RealTimeProvider가 반환하는 실제 객체와 FakeTimeProvider가 반환하는 가짜 객체는 완전히 다른 객체지만 동일한 함수를 구현한다. 그래서 하나를 다른 것 대신 사용할 수 있으며, 프로덕션 코드도 이를 문제없이 처리할 수 있다.

하지만 함수의 입력과 출력 타입이 올바른지 확인하는 것은 코드를 실행해야만 알 수 있다. 더 확실하게 하려면 정적 타입 검사를 지원하는 도구나 언어를 사용하는 것이 좋다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.