// 삼각형 둘레(Triangle circumference) 계산functioncalcTriangleCirc(x, y, z) {return x + y + z}// 전달 인자(type)의 유형이 올바른 경우calcTriangleCirc(10,5,8) // 23// 전달 인자의 유형이 잘못된 경우, 오류 출력하지 않음calcTriangleCirc('10','5','8') // '1058'
JavaScript가 런타임 중에 오류를 알려주지 않기 때문에, 이러한 문제 해결하려면 함수를 제작할 때 전달 인자의 유효성을 직접 검사해야 합니다. 반복되는 유형 검사는 불필요하므로 타입 검사 유티릴티 함수를 만들어 활용할 수 있습니다.
// 데이터 타입 검사 유틸리티 함수functionvalidType(dataType, typeString) {returnObject.prototype.toString.call(dataType).slice(8,-1).toLowerCase() === typeString}functioncalcTriangleCirc(x, y, z) {// 데이터 타입 검사if ( !validType(x,'number') ||!validType(y,'number') ||!validType(z,'number') ) {thrownewError('전달되는 인자의 유형은 오직 숫자(number)여야 합니다.') }return x + y + z}// 전달 인자의 유형이 잘못된 경우, 오류 출력!// 'Uncaught Error: 전달되는 인자의 유형은 오직 숫자(number)여야 합니다.'calcTriangleCirc('10','5','8')
React 속성 타입 검사
애플리케이션 규모가 커지면 수 많은 컴포넌트가 프로젝트에 사용되고, 팀원도 많아집니다. 규모가 커짐에 따라 오류(버그)가 발생할 확률도 높아집니다. 이런 문제를 사전에 차단하기 위해서는 컴포넌트에 전달되는 속성(props)이 올바른지 사전에 검사할 수 있어야 합니다. 그렇다면 React 컴포넌트에 전달 된 속성 유형은 어떻게 검사해야 할까요?
React 컴포넌트(함수 또는 클래스)는 propTypes 속성을 통해 컴포넌트에 전달 된 속성을 검사할 수 있는 기능을 제공합니다. 검사 할 항목을 검사 객체 멤버 메서드로 전달하면 속성 객체, 속성 이름, 컴포넌트 이름을 순서대로 전달 받습니다.
이를 활용하여 속성 검사를 수행한 뒤, 기대되는 속성 유형과 일치하지 않을 경우 오류 메시지를 출력하도록 설정해 사용자에게 안내할 수 있습니다. 다음은 속성을 직접 검사하는 방법입니다.
// React 컴포넌트 전달 속성 검사EmotionCard.propTypes = {// 전달 속성 객체, 속성 이름, 컴포넌트 이름emotion(props, propName, componentName) {// 전달 속성 유형constpropType=typeof props[propName]// 전달 속성 검사 (문자 값인지 확인)if (propType !=='string') {// 문자 값이 아닌 경우 오류 발생returnnewError(// 오류 메시지 출력`${componentName} 컴포넌트에 전달 된 속성 ${propName}의 데이터 유형은 String이 요구되나, 실제 전달된 속성 유형은 ${propType}이니 확인 바랍니다.` ) } }}
요구 된 속성 유형과 다른 유형의 속성이 컴포넌트에 전달되면 Console 패널에 아래와 같은 오류 메시지가 출력됩니다.
Warning
Failed prop type: EmotionCard 컴포넌트에 전달 된 속성 emotion의 데이터 유형은 String이 요구되나, 실제 전달된 속성 유형은 number이니 확인 바랍니다.
at EmotionCard (https://3hxii.csb.app/src/components/EmotionCard.js:81:22)
at App
라이브 예제
커스텀 전달 속성 검사 모듈
emotion 전달 속성 검사는 String 유형을 검사합니다. 컴포넌트에 전달 받는 속성 중 String 유형은 빈번하므로 재사용 할 수 있도록 함수로 만들면 좋을 것 같습니다. 그리고 다른 유형도 검사하는 함수를 만들어 사용하는 것이 효율적입니다. 이런 경우 검사 함수를 묶어 관리 할 모듈(네임스페이스)을 만들어 관리하면 효과적일 것입니다.
PropType.js
constPropTypes= {// String 유형 검사 함수string(props, propName, componentName) {constpropType=typeof props[propName]if (propType !=='string') {returnnewError(`${componentName} 컴포넌트에 전달 된 속성 ${propName}의 데이터 유형은 String이 요구되나, 실제 전달된 속성 유형은 ${propType}이니 확인 바랍니다.` ) } },// Array 유형 검사 함수array(props, propName, componentName) {constpropValue= props[propName]constpropType=Object.prototype.toString.call(propValue).slice(8,-1)if (!Array.isArray(propValue)) {returnnewError(`${componentName} 컴포넌트에 전달 된 속성 ${propName}의 데이터 유형은 Array가 요구되나, 실제 전달된 속성 유형은 ${propType}이니 확인 바랍니다.` ) } },// ...}exportdefault PropTypes
PropTypes 모듈을 불러와 다음과 같이 검사 할 컴포넌트 속성에 연결하면 간단하게 속성을 검사할 수 있습니다.
컴포넌트에 전달할 속성을 모두 필수로 만들 필요는 없습니다. 사용자에 의해 커스터마이징 될 수 있지만, 그렇지 않을 경우 기본으로 사용(Default Props)되는 값을 설정할 수도 있습니다. JavaScript와 React에서 각각 전달 속성 기본 값을 설정하는 방법을 살펴봅시다.
JavaScript 매개변수 기본 값
JavaScript 프로그래밍(ES 6+)에서 매개변수 기본 값 설정은 다음과 같이 합니다.
functiongreetingMessage(message='안녕하세요') {return`${message} 여러분!`}// 기본 값 사용greetingMessage() // '안녕하세요 여러분!'// 사용자 정의greetingMessage('Hello') // 'Hello 여러분!'
React 전달 속성 기본 값
컴포넌트에 전달될 속성의 기본 값을 설정하는 방법은 defaultProps 속성을 설정하는 것입니다.