alt
Home 파라미터의 역할
Post
Cancel

파라미터의 역할


문제상황

1
2
3
4
5
6
7
8
9
private foo(data: { id: string }) {
    const { id } = data;
    
    if(typeof id === 'string') {
        // ...
    } else {
        debug('invalid data type');
    }
}
  • 타입스크립트 언어를 사용하는 프로젝트, 위와같은 상황에서 foo()의 매개변수로 전해지는 id는 항상 string 형이어야 하고, 그렇지 않으면 타입이 맞지 않아 컴파일타임에 에러가 발생한다.
  • 따라서, 이 프로젝트에서 개발하는 입장으로 본다면, 조건문 if(typeof id === 'string')의 결과는 어떠한 경우에도 절대 falsy하지 않다고 판단했다.
    • IDE에서도 “Redundant typeof check: ‘owtUserID’ always has type ‘string’ “ 라는 메시지와 함께 해당 줄이 불필요하다는 메시지를 보낸다.



오류

  • 파라미터에서 type을 지정해주는 것은 형식을 명시함으로써 개발자가 적절한 개발을 할 수 있게하는 목적이지, 외부에서 항상 해당 type에 맞는 데이터를 전해줄 것을 보장하지 못한다.

    • 심지어 해당 프로젝트 내부에서도 const data: any = { id: 123 }; 이러한 data를 argument로 전달한다면, 컴파일에러 없이 그냥 통과하게 된다.
  • 해당 부분에서 data라는 데이터는 socket 연결 후 어떠한 소켓 이벤트에 의해 전해지는 데이터이다.

    • 일반적으로 API 호출이라면 ajv와 같은 패키지를 통해 JSON 데이터의 형식 검증을 할 수 있다고 한다.

      1
      2
      3
      4
      5
      6
      
      const schema: JSONSchemaType<Seed> = {
        type: 'object',
        properties: {
            // ...
        }
      }
      
    • 소켓 이벤트로 전해진 하나짜리 데이터(그냥 string)를 이런 방법 보다 그냥 if(typeof id === 'string') 처럼 검증해준 것 뿐.



결론

: 함수 파라미터의 역할을 다시 생각해보자. 형식, 타입을 지정함으로써 개발자가 적절한 데이터를 전달받고, 그걸 통해 의도했던 대로 로직을 작성하기 위한 목적이지, 외부에서 전해지는 데이터까지 막는 역할은 하지 못한다.

This post is licensed under CC BY 4.0 by the author.