쏙쏙 들어오는 함수형 코딩 - Chapter 02

Haz·2023년 6월 11일
0
post-thumbnail

2장에서는 액션, 계산, 데이터를 피자 가게에 빗대어 설명해서 이해하기 쉽게 도와준다. 여기에 "계층적 설계" 원칙을 덧붙여 새로운 개념도 추가할 수 있게 해주었다. 어디서 봤는데, 새로운 개념을 제일 잘 배우는 방법은 이미 했던 걸 복습하면서 연결짓는 거라던데 저자가 알고 했든, 모르고 했든 효과는 훌륭했다! 이후에 자세하게 다시 배우게 되는 장이 있으니 계층적 설계는 그 때 딥다이브(deep dive)해보도록 하고, 오늘은 함수형 프로그래밍의 3요소를 제대로 머리에 박아보도록 하자.

효과가 굉장했다

함수형 프로그래밍 3요소


3요소 구별하기

3요소의 개념을 피자 가게에서 하는 행동에 비유해 다시 한 번 짚고 넘어가자면, 다음과 같다.

액션이란?
호출 횟수와 시점에 의존하는 것으로 사용할 때 주의가 필요한 함수
예시: 반죽 펴기, 피자 배달, 재료 주문

계산이란?
어떤 것을 결정하거나 계획하는 것. 실행해도 부수 효과를 유도하지 않는다는 점에서 액션과 다름.
예시: 레시피의 생산량을 두 배로 늘리기, 쇼핑 목록 결정

데이터이란?
변경이 불가능하며 유연하기 때문에 저장하거나 네트워크로 전송할 수 있음.
예시: 고객 주문, 영수증, 레시피

늘 그렇지만, 데이터는 아주 쉽게 구별할 수 있지만 계산과 액션은 헷갈리기 쉽다. 꼭 부수효과 여부를 염두에 두고 판단하는 연습을 늘 해야겠다.


계층화 설계

변경 가능성에 따라 코드 나누기

아무리 설계를 하더라도 프로그래밍 초반에는 어떤 코드가 변경되지 않을지, 또 변경이 가능할지 판단하기는 쉽지 않다. 기능이 변경됨에 따라 뒤죽박죽으로 섞이게 되는 코드들도 왕왕 있다. 이럴 때 필요한 게 바로 "계층화 설계" 다.

소프트웨어 설계 단계에서 들어갈 수 있다면 제일 좋겠지만, 아직까지 주니어인 입장에서는 모든 기능 구현을 끝내고 1차 리팩토링을 진행할 때 하는 게 제일 최선이라는 생각이 든다.

그렇다면 계층화 설계의 첫 단계는 무엇일까?

변경 빈도레이어 1레이어 2메인 레이어
잦음메뉴 레시피재료 가격비즈니스 규칙
조리 순서재료 목록도메인 규칙
드묾객체 / 배열문자열 / 숫자기술 스택

상단 표처럼 자주 변경되는 것과 그렇지 않은 것을 구별하는 것이다. React.js를 쓰든, Vue.js를 쓰든, Svelte를 쓰든 자바스크립트를 쓴다는 건 바뀌지 않는다. 이렇듯 기술 스택과 관련된 부분은 쉽게 바뀌지 않는다. 이에 언어와 관련된 기능들은 늘 최하위 계층에 자리한다.

그리고 상위 계층에 차곡차곡 변경 빈도에 따라 무엇이 더 변경되기 쉬운지를 생각하여 블럭을 쌓아준다. 붙어있는 계층은 상위 계층이 바로 아래에 있는 것을 기반으로 구현해야한다. 그러므로 가장 상위 코드는 바로 하위 계층에만 의존하기 때문에 쉽게 바꿀 수 있고, 하단으로 갈수록 바꾸기는 어렵지만 자주 바꿀 일이 없는 코드들이 된다.

계층화 설계

이러한 아키텍처 패턴이 계층을 만들기 때문에 이를 계층화 설계라고 부르고, 일반적으로 3개의 계층으로 나눈다. 바로 비즈니스 규칙, 도메인 규칙, 기술 스택 계층이다. 이와 관련된 자세한 이야기는 8,9장에 나온다고 하니 2장에서는 이 정도만 기억해두면 될 것 같다.

중요한 것은 계층화 설계가 비즈니스, 도메인, 기술 문제를 명확하게 분리하여 소프트웨어에서 문제가 되는 부분을 고치기 위해 어느 부분에서, 얼마나 작업이 필요할지 예상할 수 있게 해준다는 것이다.


일급 추상

새로운 개념이 또 등장했다. 바로 "일급 추상"이다. 일급 추상은 확장성과 관련된 개념이다. 특히 시간 효율성과 연관되어 '어떻게 하면 시간적으로 효율적인 작업을 하도록 확장할 수 있을까?'를 다룬다.

함수형 프로그래밍과 분산 시스템

함수형 프로그래밍과 분산 시스템은 떼어놓을래야 떼어놓을 수 없다고들 한다. 왜 그런지 궁금해서 찾아보니 함수형 프로그래밍은 부수 효과를 최소화하기 때문에 병렬 작업에 유리하고, 분산 시스템을 만들기 위해 "Elixir"라는 함수형 언어를 만들 정도였다더라.

분산 시스템을 타임라인 다이어그램으로 시각화해둔 예시를 보면 왜 그런지 쉽게 이해할 수 있다.

작업 병렬화를 위해서 피자 하나를 만들기 위해 로봇 한 대가 하던 일을 세 대가 나누어 하게 됐다.

로봇 한 대가 했을 때 순서

로봇 한 대가 피자를 만든다면 위와 같은 순서로 만들게 된다. 이 과정을 세 대의 로봇이 나누게 되면 아래와 같다.

로봇 세 대가 피자 만들기

주문이 들어오면 한 대는 도우를 만들고, 한 대는 치즈를 갈고, 한 대는 소스를 만들기 시작한다. 하지만 문제는 각 과정의 끝나는 시간이 모두 다르다는 것이다! 그렇기 때문에 일반적으로 시간이 가장 오래 걸리는 도우 만들기가 끝나기도 전에 치즈는 갈리고, 소스는 완성될 것이다. 그럼 소스를 만드는 로봇은 도우가 없는 상태인데도 도우를 펼치는 작업에 들어간다. 도우가 없는데 어떻게 펼치죠…? 부수 효과가 발생하며 작업이 실패하게 된다.

함수형 프로그래밍이 왜 분산 시스템에 적합한지 이 예시로 이해가 가능했다. 함수형 프로그래밍은 위와 같이 예측 불가능한 시점에 발생할 부수 효과를 최소화하는 것이 목표인 프로그래밍 패러다임이기 때문이다.

타임라인 커팅

17장에서 더 자세히 다룰 "타임라인 커팅" 기법(고차 동작 high-order operation)을 쓰면 여러 작업이 동시에 진행될 때 순서를 맞출 수 있다. 이러한 기법을 활용하는 걸 이 책에서 왜 일급 추상이라고 하는지는 모르겠지만, 아마 함수가 완료될 때를 기다려서 결과값을 인자로 받아 이후 함수가 동작하기 때문이 아닐까 싶다. 자바스크립트에서 함수가 일급 객체인 이유와 동일하게 말이다. 이에 대해서 정확히 아는 사람이 있다면 꼭 피드백을 부탁드리고 싶다.



결론

2장까지가 함수형 프로그래밍이 어떤 요소로 구성되는지, 어떻게 설계하는지, 설계를 어떤 기법으로 구현하는지 간략하게 설명해둔 서론이었다.

계층화 설계나, 타임라인 커팅 같은 것들은 이후에 더 자세하게 다뤄지니 지금 궁금한 것들은 잠시 접어두고 책을 더 읽어보려고 한다.

실질적으로 3장부터는 코드와 접목해 어떻게 구현할 수 있을지 심도 있게 생각해볼 수 있을 것 같아 github을 열어놓고 이제까지 짠 코드가 얼마나 엉망이었는지...😂 반성의 시간을 가져보자...

profile
나도 재밌고, 남들도 재밌는 서비스 만들어보고 싶다😎

0개의 댓글