ifify: 코드의 본질에 집중하는 기술
제목부터 어그로 가득하고 조금은 오만하기까지 한 이 글을 읽으실 때는 진지함을 조금 덜고 가볍게 훑고 지나가 주세요
ifify는 비브로스에서 공개 배포한 node.js 라이브러리입니다. 이 포스트에서는 ifify 개발 동기와 코드에 대한 접근 방식에 대한 의견을 나누어 보고자 합니다. ifify에 대한 자세한 내용 및 사용법은 npm 페이지에서 확인해보시길 바랍니다.
그 전에, 함수형 프로그래밍에 대한 지식이 있다면 조금 더 이해하시기 쉬울 것으로 생각합니다.
잠깐 저의 이야기
개발자 커리어 3년 차부터였을까... 여러 프로그래머의 포스트들을 참고해 패러다임과 패턴들을 경험하면서 문득 든 생각이 있었습니다. “안정적인 서비스 만드는 거 너무 좋지, 디버깅하기 쉬운 패턴을 만드는 거 너무 좋고, 재사용 가능한 코드를 만드는 거 너무 중요해... 그런데 쉽지 않네".
여러 포스트를 보면서 네이밍 철학, 프로그래밍 철학들을 학습하는데 막상 도입하기에는 팀의 개발 역량, 개발 패턴, 점진적 시간 소요 등 오랜 경력자의 굳어진 개발 경험을 단숨에 바꾸기는 쉽지 않고, 주니어 개발자의 미숙한 개발 경험을 단숨에 끌어올리기도 쉽지 않다는 생각이 많이 들었습니다.
그래서 고민했죠. “어떻게 해야 내가 원하는 코드에 집중할 수 있을까?” 그리고 가장 작은 단위부터 시작했습니다. 바로 조건문이죠.
조건문(conditional)은 프로그래밍을 배울 때 가장 기초적인 지식이면서 그와 동시에 수많은 분기를 통해서 우리의 머리를 헤집어 놓는 애증의 친구입니다. 함수를 실행할 때도, 변수를 정의할 때도, 반복문을 실행하더라도 조건문을 피할 수 없죠. 'ifify'는 여기서부터 시작합니다.
User might be User
ifify로 해결한 첫 번째 문제는 “왜 유저가 유저가 아닐 수도 있는가?”입니다. 이게 무슨 말이지? 싶으신 분들도 계실 것 같은데요. 코드로 예시를 좀 들어보겠습니다.
const user: User | null = await db.users.findById(userId);
if (!user) {
throw new Error('Not Found User');
}
// Now user is a real User.
어떻게 보자면, 너무 당연한 코드일 수도 있겠지만 저에게 당연하지 않은 순간이 어느 날 찾아왔습니다. 바로 Rust를 시작할 때였죠. Rust 프로그래밍을 배우고 연습하다가 자바스크립트와는 너무 다른 패턴을 마주했습니다. 바로 Option<T>
였습니다. 뭐.. Result<T>
도 있는데 일단 Option
만 보시죠.
Option
을 마주하면서 Rust는 null
값이 없다는 것을 처음 알게 되었습니다.(물론 enum
을 통해 비슷하게 만들어낼 수 있겠지만, Rust에서는 null
값 대신 Option
구문을 사용합니다. 그 때문에 굳이 필요 없다고 보는 게 정확할지도 모르겠네요.)
Rust는 Option
이라는 enum
을 통해서 값의 유무(Some value or null value가 아니라, Some value의 유무)에 따라 분기하여 개발할 수 있습니다. 물론, 여기서 if 구문을 사용할 수도 있지만 제가 여기서 설명하고 싶은 건 enum Option