[독서] 쏙쏙 들어오는 함수형 코딩

2022-05-312022-05-31
  • Javascript
  • Book

아직 읽는 중!

내가 함수형에 대해 제대로 알고 있긴 한걸까 의문이 들던 차에 알게 된 책이다. 책 제목처럼 이해가 정말 잘 된다고 칭찬이 자자하길래 회사책으로 신청해서 읽어보고 있는데, 평소 아리송하던 개념들에 대해 알기 쉽게 설명해주는 부분이 맘에 든다.

부수효과

함수형 프로그래밍은 부수효과 없는 순수 함수를 짜는 패러다임이다, 라고 많이 알려져있는데 이 책에선 정말 그럴까? 에 대해 이야기한다.

먼저 생소할 수 있는 부수효과의 뜻을 리턴 외의 모든 것으로 책에서 정의하고 있다. 그렇기 때문에 부수 효과를 피하고 싶긴 하지만, 전혀 사용하지 않을 수는 없다고 책에서는 이야기 한다. 대신 부수 효과를 잘 다룰 수 있게 도와주는 것이 함수형이라는 것이다.

부수효과는,

  • 기능이나 동작만을 의미하지 않는다.
  • 암묵적인 입력과 출력 (함수의 입출력으로 명시되지 않은 것)도 해당한다.

코드의 구분

부수 효과를 잘 다루기 위해서, 부를 때 조심해야 하는 코드를 구분해야 한다고 말한다. 함수형 코딩에서 코드는 크게 세 가지로 분류된다. 액션, 계산, 데이터.

액션, 계산, 데이터의 구분에 대해 3장에서 예제와 연습문제를 통해 자세히 소개하고 있다.

책에서 함수형 프로그래머들은 액션보다 계산을, 계산보다 데이터를 더 좋아한다고 이야기하는데 이 말은 액션에서 데이터로 갈수록 순수함수라는 말이다. 즉, 부수 효과를 최소화하고 가능한 많은 순수함수를 짜야 한다는 말과도 같다.

코드를 구분할 때 특히 호출하는 시점이 중요하다고 말한다. 호출하는 시점에 의존한다는 것은 언제 호출하냐에 따라 결과가 달라질 수 있다는 것을 의미한다. 이런 코드를 액션이라고 분류한다.

분류에서 얻는 이득?

  • 재사용성
  • 가독성 향상 : 복잡도를 낮춘다
  • 더 작게 만들어 테스트하기 쉬워진다.

액션

  • 기능, 동작만이 액션이 아니다. 변경 가능한 것들을 액션이라고 한다.
  • 액션은 사용시 동시에 실행되는 것이 있는지, 과거에 실행되었거나 미래에 실행할 것이 있는지, 실행 횟수 등등을 고려해야 하기 때문에 번거롭다.
  • 가능한 작게 만들어야 한다. 작게 만든다는 것은 액션 안에서 계산이나 데이터로 뺄 것이 있는지 확인하고 있으면 뺀다는 말이다.

계층화 설계

그렇게 코드를 구분하고 분류하다보면 자연스럽게 계층이 생긴다. 그리고 각 계층은 하위 계층에 의존한다. 가장 자주 바뀌는 비즈니스 레이어는 도메인 레이어에 의존하고, 도메인 레이어는 자주 바뀌지 않는 기술 스택 레이어에 의존한다.

  • 함수 이름은 함수가 어느 계층에 위치할지 결정하기 위한 정보로 쓸 수 있다.
  • 같은 계층에 있는 함수는 같은 목적을 가져야 한다.

절차적인 코드란?

  • 비즈니스 규칙을 테스트하기 어렵다.
    • 절차적인 코드를 지양해야 하는 이유 : 비즈니스 규칙을 계산으로 분리하여 이것만 빠르게 테스트해야 하기 때문

불변성

  • 불변성을 지키는 것과 초기화를 구분해야 한다.

비즈니스 규칙과 도메인 규칙은 어떤 차이가 있나요?

장바구니에 대한 코드를 짜고 있다고 가정해보자. 장바구니 기능은 전자상거래를 만드는 곳이라면 어디에나 있으므로 일반적이고, 대부분 비슷하다. 이걸 도메인 규칙이라고 한다.

장바구니에 관한 것은 또한 모두 비즈니스 규칙이라고 생각하기 쉽지만, 사실은 아니다. 비즈니스 규칙(로직)이란 그 회사만의 특별한 규칙을 의미한다. 빠르게 바뀐다. 예를 들어 A 라는 회사의 장바구니 도메인에는 3개 이상 구매시 무료배송이라는 비즈니스 로직이 있지만 B 회사에는 1개만 구매해도 무료배송이라는 비즈니스 로직이 있을 수 있는 것이다.

비즈니스와 도메인에 모두 속하는 함수도 있을 수 있나요?

있을 수 있지만, 계층 관점에서 보면 smell code이다.

비즈니스 규칙에서 장바구니가 배열인지 알아야 한다면 문제가 될 수 있습니다.

Profile picture

emewjin

Frontend Developer

잘못된 내용 혹은 더 좋은 방법이 있으면 언제든지 알려주세요 XD