함수를 어떻게 만들어야할까?

2023년 12월 30일 작성

Function재사용성

사람마다, 팀마다 함수를 추출하는 기준이 다르다. 좋은 함수라고 여겨지는 것도 다 다르다. 하지만 그와 상관없이 함수가 가져야하는 미덕도 있다고 생각하게되었는데, 바로 재사용성이다.

견습생에게 함수란

  • 함수는 한가지 일만 해야한다.
  • 함수는 10줄을 넘어가면 안된다.
  • 함수는 파라미터를 3개 이상 받으면 안된다.
  • 함수 이름은 동사로 시작해야한다.

이것들은 내가 좋은 함수를 만드는데 도움이 되기 위해 열심히 훈련한 일들이다. 기본적인 일이지만 체화시켜놓으면 대부분의 경우 도움이 된다고 생각한다. (알아도 안 쓰면 그만이긴 해서)

생각없는 습관은 용납되지 않는다.

하지만 앞서 나열한 견습생이 함수를 만드는 방법은 조금 극단적이다. 근데 업무에서 훈련하듯 함수를 짜니까 지적을 받을 수 있었다. 내가 함수 만들자는 의견을 냈을 땐 흔쾌히 OK 하셔서 기쁘게 작업했는데, 리뷰받으며 다시 생각해볼 수 있었다.

혼자일 때 가장 소홀했던 것: 재사용성

(실제 상황과 비슷하게 가정)

나는 어떤 게시글을 작성한 유저의 핸드폰 번호를 사용하는 유저가 몇명인지 세서, 5명 이상이면 슬랙 알림을 보내는 로직을 외부 함수로 분리하고, 다른 곳에서도 함수를 사용할 수 있도록 팀내 라이브러리성 디렉터리인 libraries에 넣었다.

그런데 가장 처음 받은 리뷰가, 이 함수 자체가 그저 분리에 의의를 둔 것 같아 아쉽다는 것이었다.

분리만을 위한 함수?

처음에는 무슨말인지 몰랐으나, 예시를 보니 바로 납득할 수 있었다.

// as-is
export const alertTooManyDuplicatedPhoneNumber = async (post: PostDocument) => {
  // DB 조회 후 5명 이상이면 슬랙 채널에 알림 전송
  return;
}

위의 함수를 사용하기 위해서는 다음을 만족해야한다.

  1. post 를 인자로 넣을 수 있어야하고
  2. 슬랙을 보낼 필요가 있어야한다. (게다가 정해진 슬랙채널에 정해진 메세지 규격으로만 보낼 수 있다)

내가 생각해도 이럴 상황이 지금말고 또 생기지 않을 것 같았다. ㅎㅎ 이 말도안되는 함수에 대한 (아주 친절한) suggestion은 다음과 같았다.

// to-be: 같은
export const countUserSamePhoneNumber = (
  phoneNumber: string
) => {
  // DB 조회 후 반환
  return User.countDocuments({ phoneNumber }).exec()
}

사실 얼핏보면, 한 줄을 왜 굳이 함수로 추출하냐 싶을 수도 있는데 나는 그렇게 생각하지 않는다. countDocuments라는 DB 연산을 비즈니스 언어로 풀어놨기 때문이다. 누군가 나중에 같은 번호의 유저를 찾을 일이 있을 때, 이 함수를 먼저 검색해서 써볼 수 있음을 상상하기는 쉽다. 그리고 비즈니스 언어로 쓰여있다는 점은 가독성이 좋아진다는 말과 같다.

해결하기

사실 리뷰받을 당시에는 왜 이런 것도 생각 못했지 하고 자괴감 들뻔 했는데, 생각해보니 난 이 부분에 대해 연습이나 노력이 부족했다. 그걸 깨닫고 나니 괜찮아짐.

문제: 왜 나는 이렇게 했을까?

원인을 찾아보면, 나는 메서드가 그냥 길어지면 대충 내가 아는 의미 단위로 cmd+option+m 으로 추출하던 습관이 몸에 베어있었던 것 같다. 우테코에서 참고하라고 알려준 객체지향생활체조만 따라 10줄이 넘어가는 메서드가 있으면 private 메서드로 추출하는 때가 많았는데 그 때 처럼 이번에도 큰 고민 없이 함수를 추출했다. (사실 이 때도 신중해야하는 건 사실이다.) 함수는 메서드(객체)와 달리 혼자 어디에서고 쓰일 수 있는 일급 시민이므로, 분리를 하는 것에 더 큰 책임이 따르는데 그걸 간과했던 것이다.

우테코 미션들, 사이드 프로젝트와 같은 경험 상 대부분 내가 작성한 코드의 수명이 길지 않았어서 나는 재사용성에 피드백을 간과하기 쉬웠던 것 같다. 하지만 오래 지속될 수 있는 프로젝트라면 이런 재사용성을 높은 우선순위에 두고 고민해야함을 알게됐다.

연습하기: 고민을 피하지 않기

10줄 이내로 술술 잘 읽히는 메서드라도, 내가 분리한 곳에서만 쓰이고 있다면 재사용성이 안좋은 것이다. 가독성이라는 기초를 다졌으니 이제는 의미 단위를 가장 우선으로 고민해봅시당.