인프런 커뮤니티 질문&답변

샘돌이님의 프로필 이미지
샘돌이

작성한 질문수

당신을 함께 일하고 싶은 개발자로 만들어 줄 클린 코드 작성법

안녕하세요. 이해가 안되는 부분이 있습니다.

작성

·

163

1

첫번째로는, 

좋은 함수 작성  방법2 > 만능 API에서

입력 형식에 엄격한 제한을 두어서, 데이터 유효성 검사하는 코드 부분을 최대한 줄여라라고 이해했습니다.

하지만 좋은 함수 작성 방법4 > 인자 유효성 검사 에서

유효성 검사를 철저히 하라고 했습니다.  두개의 의견이 상반되어서 어떤 걸 받아들여야 할 지 모르겠습니다.

그리고 두번쨰로는,

좋은 함수 작성 방법4 > 인자 유효성 검사 에서

내부 함수로 전달될 인자가 유효성을 확실히 만족하는 경우에는 굳이 다시 한 번 검사할 필요는 없다라고 했는데,

바로 다음  문단에서 이 의견에 대한 반증을 제시하셔서 굉장히 혼란스럽습니다.

두가지 의문점에 대해서 해결해주십쇼~

 

답변 1

0

클린 코더님의 프로필 이미지
클린 코더
지식공유자

와 좋은 질문 감사합니다. 이런 질문들을 기다렸습니다. :)


첫번째 질문 :

아 오해에 소지가 있으셨겠어요

유효성 검사를 적당히하라는 것이아니구요. (유효성 검사는 아주 당연하게 무조건 철저히)

메서드의 입력 형식에 엄격한 제한을 두면 유효성 검사할 항목이 줄어든다는 의미입니다.

 인자에 대한 유효성은 무조건 철저히 하셔야 합니다. 

소제목대로, 만능API는 어떤 인자 유형도 받아들여 답을 낼 수 있는 api입니다.

제가 사용해본 적 있는 매장 주문 챗봇에 대해 이야기해볼게요.

그 매장의 챗봇은, 채팅창에 주문 또는 주문취소 라고 검색을 해도 동일한 결과(메뉴화면)를 응답합니다.

제대로 동작하는 것이라고 할 수 없죠? 아마도 입력 문자열이 "주문"이라는 문자열을 포함하면 메뉴화면을 응답하게 만들어져 있는 것 같아요. 그럼 어떻게 바꿔야할까요??

방법이야 많겠지만 가장 초보적인 방법을 예로 들어보자면,  입력이 "주문"인지 "주문"이 포함된 문자열인지를 구분해주면 되겠네요. 아무튼 "주문"이라는 문자열 입력만으로도 여러 고려사항이 있습니다.

또, 아이스 아메리카노, ice americano, 아아, 차가운 아메리카노라고 입력을 하면 아이스 아메리카노가 주문되어야 합니다. 

그 밖에도 여러 고려사항이 많습니다. 좋은 챗봇이 되려면 사용자의 여러 입력에 답장할 수 있어야할테니까요.

이런 챗봇('주문', '아이스 아메리카노' 만으로도 여러가지 고려 사항이 있는)같은

만능 API(함수)는 간단하게 인자 유효성 검사를 할 방법이 없습니다. 받아들일 수 있는 입력의 유형이 너무 많아서요. 

제가 강의 내용에서 드린 말씀은 이런 챗봇같은 만능 api를 피하란 이야기였습니다.

이건 사실 단지 함수 레벨이 아닌 시스템 레벨에서도 동일하게 요구되는 레벨입니다. 

(챗봇이 나쁜 어플리케이션의 예라는 뜻은 아닙니다. 챗봇은 그 시스템 성격상 다양한 입력을 받을 수 밖에 없죠.)

그리고 그러다보면 저절로 api의 코드는 더 단순해 질 것이고 입력에 대한 유효성 검사도 단순해질 것이라는 의미입니다 :)

(극단적인 반대의 예로, "one" 또는 "two"만 입력으로 허용하는 함수가 있다고 할게요 "one" 또는 "two"가 아닌 모든 입력에 대해서는 예외를 던지도록 간단하게 유효성 검사 코드 작성이 가능합니다.)




두 번째 질문:

parent()라는 public 함수가 있다고 할게요. public 스코프를 갖는 이 함수는 이 함수가 정의된 클래스 밖(외부)에서 호출이 가능하겠네요.

그리고 이 클래스에는 childA(), childB()라는 외부에 공개되지 않은 함수가 있고 이 함수들은 parent()라는 함수에서만 호출한다고 해보겠습니다.  즉 같은 클래스 내부에서만 호출되는 함수입니다.

parent() 함수에는 a와 b라는 두 개의 인자가 있습니다. 이 두 인자는 각각 childA(), childB()라는 내부 함수에 전달됩니다.

만약 parent() 함수에서 인자 a와 b에 대한 유효성 검사를 확실하게 했는데 childA(), childB()라는 같은 클래스에서 내부적으로만 호출되는 두 함수에서도 또 한 번 인자 유효성 검사를 할 필요 없다는 의미입니다. parent()에서까지 인자 유효성을 검사하지 않아도 된다는 뜻이 아닙니다 :)

아주 만약에, 

"이 클래스를  나의 옆자리에 앉은 동료와 나눠서 개발하는 중이기 때문에 나의 동료가 parent() 함수에서 인자 유효성 검사를 안했을 경우를 대비해야한다."

라고 생각이 드신다면 동료가 작성한 parent() 함수의 코드를 한 번 읽어보시거나 동료를 믿되 찝찝하면 대화를 나누라고 말씀드리고 싶어요. :)



질문 너무 감사합니다. 샘돌이님의 이런 적극적인 행동(질문)이 같은 의문을 가질지 모를 다른분들에게 큰 도움이 될 거에요 :)

샘돌이님의 프로필 이미지
샘돌이

작성한 질문수

질문하기