쏙쏙 들어오는 함수형 코딩 CH1

Yunes·2023년 8월 29일
0
post-thumbnail

서론

이 책은 1~2 장에서 함수형 프로그래밍의 주요 개념과 사고에 대해 간단히 소개한다.

이후 3장부터 9장까지 저자가 독자적으로 명명한 개념인 액션, 계산, 데이터에 대한 내용과

10장부터 19장까지 일급 추상에 관한 내용으로 이루어져있다.

먼저 CH1 에 관해 읽고 내용을 정리하여 이번 포스트에 기록하였다.

사실 이 책은 우아한 스터디에서 진행한 스터디중 하나에서 고른 도서이다. 참여해보고 싶었으나 인연이 닿지 않아서... 기록만 해두었다가 진짜 읽고 함수형 프로그래밍이 무엇인지 알아보려 한다.

본 북스터디 시리즈는 책을 읽고 떠오른 생각과 책의 내용을 소개하는 주관적인 내용들로 작성할 예정이다. 자세한 내용은 책을 직접 읽어보시는 것을 추천한다.

함수형 프로그래밍은 무엇일까?

함수형 프로그래밍

  • 수학 함수를 사용하고 부수효과 side effect 를 피하는 것이 특징인 프로그래밍 패러다임
  • 부수 효과 없이 순수 함수 pure function 만 사용하는 프로그래밍 스타일

부수 효과 side effect

  • 함수에서 결괏값을 주는 것 외에 하는 모든 행동
  • 이메일 보내기 / 파일 읽기 / 불빛 깜빡이기 / 웹 요청하기 / 자동차에 브레이크 밟기

순수 함수 pure function

  • 인자에만 의존하고 부수 효과가 없는 함수
  • 입력이 같으면 출력이 항상 같다.

함수형 프로그래밍 정의의 문제점

함수형 프로그래밍은 순수함수를 지향하나 실제로는 순수하지 않은 함수를 사용한다. 전적인 예로 이메일 인증같은 경우 이메일을 보내는 것은 실행할 때마다 외부적으로 다른 시간대에 메일을 전송하는 행위가 이루어지니 부수효과에 해당한다.

그런데 메일을 전송하는 행위가 필요할 수 있다. 즉, 부수효과를 완전히 배제할수는 없다는 의미다.

여기서 함수형 프로그래밍의 의미와 현실에 차이가 조금 느껴졌다. 그러나 책에서는 바로 의문을 해소해줬다.

함수형 프로그래밍을 잘 알지 못했던 나같은 경우도 마찬가지였는데 함수형 프로그래밍이 순수함수를 지향한다면 부수 효과를 사용하게 되는 서비스에서는 도입하기 어려운게 아닌가라는 생각이 들었다.

함수형 프로그래밍의 핵심 개념

함수형 프로그래밍에서는 호출하는 횟수, 호출하는 시점이 중요한 함수는 위로 올려 액션 으로 분류한다.

부르는 시점에 의존하는 경우

액션 action

호출 시점, 횟수에 의존적인 경우

  • 호출하는 횟수외 시점에 의존한다.

필요한 것

  • 시간이 지남에 따라 안전하게 상태를 변경할 수 있는 방법
  • 순서 보장하는 방법
  • 액션이 한번만 실행되게 보장하는 방법

부르는 시점, 횟수가 중요하지 않는 경우

계산 calculation

실행 가능한 경우

  • 입력값을 계산해 출력한다.
  • 실행 전까지 어떻게 동작할지 알 수 없다.
  • 계산은 외부에 영향을 주지 않는다.
  • 테스트하기 쉽고 몇번을 실행해도 안전하다.

필요한 것

  • 정확성을 위한 정적 분석
  • 소프트웨어에서 쓸 수 있는 수학적 지식
  • 테스트 전략

데이터 data

실행할 수 없고 정적인 경우

  • 이벤트에 대한 사실을 기록한 것이다.
  • 데이터 자체로 의미가 있다.
  • 같은 데이터도 여러 형태로 해석 가능하다.

필요한 것

  • 효율적으로 접근하기 위해 데이터를 구성하는 방법
  • 데이터를 보관하기 위한 기술
  • 데이터를 이용해 중요한 것을 발견하는 원칙

의존성이 낮아질수록 활용하기 용이하기에 액션 < 계산 < 데이터 의 추세로 선호하는 경향이 있다.

액션, 계산, 데이터로 나눌때의 장점

분산 시스템에 잘 어울린다.

특히 계산과 데이터는 실행 시점과 횟수에 의존하지 않으므로 코드를 계산과 데이터로 바꿀수록 분산 시스템에서 발생할 수 있는 여러 문제들을 해결할 수 있다고 한다.

또한 많은 코드를 계산과 데이터로 옮기면 액션을 다루기 용이해진다.

함수형 사고란?

함수형 사고

  • 함수형 프로그래머가 소프트웨어 문제를 해결시 사용하는 기술과 생각

일급 추상 first-class abstraction

  • 함수에 함수를 넘겨 함수를 재사용하는 것

결론

함수형 프로그래밍은 순수함수를 지향하며 부수효과를 피하려는 것이 특징인 프로그래밍 패러다임이다. 그러나 현실적으로 소프트웨어를 사용하며 부수효과를 완전히 사용하지 않는다는 것은 말이 되지 않는다.

이 책에서는 함수형 프로그래밍을 코드를 액션 / 계산 / 데이터로 나누는 것으로부터 시작한다. 호출 시점과 횟수에 의존적인지 / 실행할 수 있는지 / 정적이며 그 자체로 의미가 있는지 등으로 코드를 분리하자는 생각이 매우 흥미롭다.

즉, 코드를 그냥 기능만 돌아가도록 하는게 아니라 코드의 특징에 따라 분리하여 의존성을 낮추고 함수형 프로그래밍을 할 수 있도록 하는 새로운 관점을 제시해주는 것 같았다.

특히 공감이 갔던게 액션에 필요한 것으로 순서를 어떻게 보장할 것인지에 대한 것과 한번만 실행되게 보장하는 방법이라는 내용이었다.

최근에 spring boot 프로젝트에 코드를 작업하다 보니 PK 에 @GeneratedValue 어노테이션을 붙여 사용하게 된 적이 있었다.

이는 기본키를 직접 할당하지 않고 데이터베이스가 생성해주는 값을 사용하기 위해서였다. 또한 @GeneratedValue 는 기본 키를 자동으로 생성되도록 전략을 지정해줄 수 있다. 그런데 JUnit 으로 테스트코드를 처음 돌릴때는 성공해도 다음에 실행하면 duplicate entry '' for PK ... 이런 식으로 PK 에 중복키가 들어가려하는 문제가 발생했었다.

그래서 액션에 관한 내용중 한번만 실행되도록 보장하는 방법에 대한 내용이 소개되어 있지는 않았지만 함수형 프로그래밍을 자세히 알게되면 내가 겪었던 문제들을 함수형 사고를 갖는다면 어떻게 해결할 수 있었을지 알고 싶어 책의 내용이 더 눈에 들어왔다.

profile
미래의 나를 만들어나가는 한 개발자의 블로그입니다.

0개의 댓글