코드 작성 가이드 - 현직 LINE 개발자가 알려주는 읽기 쉽고 코드 리뷰하기 좋은
이시가와 무네토시 지음, 정기욱 옮김 / 길벗 / 2024년 4월
평점 :
장바구니담기


네이버 블로그 리뷰: https://blog.naver.com/rock1192/223486405235



서평에서 소개한 가독성 높은 코드를 작성하기 위한 요건, 대표적인 프로그래밍 원칙 다섯가지, 단어 선택, 주석, 불변성, 멱등성, 함수외에도 현직 LINE 개발자 주옥같은 코드 작성 가이드와 꿀팁들을 대방출 한다


어느정도 코드 작성 경험이 있던 사람들이면 고민하고 있었거나 애매한 부분들을 확실하게 정리해줄뿐만 아니라 더 좋은 방법을 예를 들어 제시해주고 앞으로 나아가야될 방향성 까지 짚어주는 점도 매우 좋았다

크게 고민하지 않았던 부분들도 알고보니 문제가 될 여지가 많았던 코드들이 있다는 사실도 새롭게 알게 되었고 어설프게 알고 있던 부분들을 이 책을 읽으면서 다시한번 정리하고 확실하게 알고 넘어갈 수 있게 해준다는 점이 이 책의 최대의 장점인 것 같다


너무 장황하게 설명하고 있는 책들에 비해 현직 개발자의 시선으로 깔끔하고 간단명료하게 필수적으로 짚고 넘어가야될 부분들만 핵심적으로 다루고 있어 책의 두께가 너무 두껍지 않고 얇은 것도 너무 좋은 것 같다


많지 않은 내용이지만 정말 필수적으로 숙지하고 넘어가야되는 내용들이라 여러번 읽고 참조하면서 확실히 몸에 체득해놓으면 앞으로의 개발자 생활이 정말 행복해질 것만 같은 생각이 든다


댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
스프링 교과서 - 기초부터 탄탄하게 배워서 바로 쓰는 스프링 입문
라우렌치우 스필커 지음, 정성권 옮김 / 길벗 / 2024년 5월
평점 :
장바구니담기


네이버 블로그 리뷰: https://blog.naver.com/rock1192/223482516204



이 책은 단순히 스프링의 기능에 대한 설명만을 늘어놓은 책이 아니다 

스프링을 적절히 활용하여 올바른 방법으로 개발할 수 있도록 스프링의 기초부터 가장 많이 사용하는 스프링의 핵심적인 기능들에 대해 깊이있게 다루고 있다

직접 예제를 실습해보면서 단계별로 스프링 프레임워크를 사용하여 개발하는 방법을 익혀나갈 수 있다

단순히 예제만 따라치는 것이 아니라 책에 있는 설명을 꼭 잘 읽어보고 이해하고 넘어가기를 바란다


특히 스프링을 사용할때 가장 중요한 부분이자 가장 기초가 되는 부분이 @Bean 에 대한 내용이다 스프링은 DI 방식으로 의존성을 주입하여 스프링이 의존성을 관리하고 주입받은 의존성을 @Autowired 어노테이션을 사용하여 아주 쉽게 사용할 수 있다

이 부분이 스프링 기초에서 가장 중요한 부분이기 때문에 반드시 이해하고 넘어가기 바란다


그 외에도 추상화와 싱글톤, AOP, 스프링 MVC, 테스트 등 꼭 알고 넘어가면 실무에서 정말 많은 도움이되는 설명들이 매우 잘 정리 되어있다


오랫동안 스프링을 사용해온 사람이지만 까먹고 있었던 부분이라던가 잘 사용하지 않는 기능들은 이 책의 내용이 정말 많은 도움이 되었고 기능을 사용해 보면서 잘 사용하지 않던 기능들도 실무에서 활용해볼 수 있겠다는 자신감도 생겼고 어설프게 알고 있던 부분들도 확실하게 알 수 있게 되어서 매우 좋았던 것 같다


스프링은 현재 자바 개발환경에서 과반이상의 점유율을 차지하고 있고 자바와 함께 그 생태계가 어마어마하게 발전해왔기 때문에 자바를 사용하는데 스프링을 사용하지 않고 개발한다는 것은 이제 무모하다고 생각되기도 한다


그만큼 스프링의 의존도가 심해지는 부분이 있지만 AI가 개발도 해주는 시대에 굳이 어렵게 개발해야 될 이유가 있을 까 싶다

정말 오랫동안 잘 만들어지고 발전해온 프레임워크인 만큼 잘 활용하여 빠르고 안정적으로 개발 할 수 있다면 사용하지 않을 이유가 없는 것 같다


스프링 교과서 이 책 정말 좋은 책인 것 같다

스프링 개발을 시작하려는 사람 또는 스프링 개발을 하고 있는 사람들에게 강력히 추천한다


댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
실전 레디스 - 기초, 실전, 고급 단계별로 배우는 레디스 핵심 가이드
하야시 쇼고 지음, 서대원 옮김, 정경석 감수 / 한빛미디어 / 2024년 5월
평점 :
장바구니담기


네이버 블로그 리뷰: https://blog.naver.com/rock1192/223475125507


레디스는 고성능 메모리 DB로 매우 빠른 처리속도를 자랑하며 캐시서버로서의 역할을 톡톡히 해내며 현재의 버전에서는 매우 뛰어난 안정성도 자랑하고 있다


활용도가 다양하며 요즘에는 거의 모든 서비스에서 레디스를 사용하지 않고 있는 서비스를 찾아보기 힘들정도로 널리 사용되고 있는 DB이기도 하다


사용이 매우 간편하고 널리 알려진만큼 구글링을 통해 설치하는 방법과 설정법과 사용법을 쉽게 찾아볼 수 있는 장점도 있다


AWS ElastiCache 를 통해 레디스를 사용한다면 거의 관리가 필요없을 정도로 쉽게 구성하고 사용할 수 도 있다


하지만 비용이 매우 비싸므로 적절히 잘 활용을 해야되며 고성능이므로 알아서 다될거라고 설계를 제대로 하지않고 무턱대고 막 사용하다가는 비싼 비용만 지불하고 오히려 사용하지 않을때보다 성능이 나오지 않고 장애만 계속 발생할 수 도 있다


이 책은 레디스의 A부터 Z까지 매우 친절히 잘 알려주고 있다


레디스의 기초부터 공부하려는 사람과 레디스의 고급 기능을 활용하거나 레디스를 직접 구축하여 사용하려는 사람들 모두에게 도움이 되는 내용들이 가득하다


그냥 일반적인 레디스의 내용만 있는 것이 아니라 레디스를 활용하여 애플리케이션을 작성하거나 레디스의 운용 관리 방법과 트러블 슈팅에 대해서도 도움되는 내용들이 가득하므로 레디스를 운용하는데 어려움을 겪고 있다면 반드시 읽어보기를 권장한다


마지막으로 레디스 책이 많지 않은데 최신 버전의 레디스를 다루고 있는 레디스 책이고 국내 레디스 저서 저자가 직접 번역 작업한 서적으로 기술의 이해도가 높아 번역 품질이 매우 높아 좋은 내용의 번역서를 불편함 없이 매끄럽게 읽을 수 있다는 것도 이 책의 장점이다


댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
한 권으로 배우는 도커 & 쿠버네티스 - 컨테이너 개념부터 쿠버네티스를 활용한 배포까지
장철원 지음 / 한빛미디어 / 2024년 4월
평점 :
장바구니담기


네이버 블로그 리뷰: https://blog.naver.com/rock1192/223444363075


이 책의 대상 독자

이 책은 혼자 도커와 쿠버네티스를 학습하는 독자를 대상으로 하며 도커와 쿠버네티스를 익히는데 필수적인 내용 위주로 구성되어있다

이 책이 도커와 쿠버네티스의 개념을 정확히 이해하고 수월하게 사용할 수 있게 도움을 줄 것이다



이 책을 읽는 방법

도커와 쿠버네티스를 학습해본 적이 없다면 기초 개념을 익해하는 것이 중요하다

도커와 쿠버네티스의 기본 개념과 역할을 확실히 이해한 후에 실습을 진행하기 바란다

이 책의 구성

  • 1장 실습 환경 구축하기

    • 우분투 이미지 다운로드, 버추얼박스 설치, 가상머신 생성 등 실습을 위해 필요한 환경을 구축

1부 도커

  • 2장 도커의 개념

    • 운영체제, 네임스페이스 등 도커 학습을 위해 필요한 기초 사전 지식을 익히고 도커의 기본 개념이 되는 컨테이너에 대해 학습한다

  • 3장 도커 설치

    • 도커 실습을 위해 가상머신에 도커를 설치한다

  • 4장 도커 기초

    • 도커 이미지와 도커 컨테이너와 같은 개념을 익히고 도커 기초 명령어와 도커 운영에 필요한 네트워크, 스토리지 관련 내용을 학습한다

  • 5장 도커를 활용한 django 실행

    • 앞에서 학습한 도커 기초 내용을 응용해 django를 실행한다

  • 6장 도커를 활용한 Flask 실행

    • 앞에서 학습한 도커 기초 내용을 응용해 Flask를 실행한다

2부 쿠버네티스

  • 7장 쿠버네티스의 기본 구조

    • 쿠버네티스의 역할 및 구성 요소를 익히고 쿠버네티스 구조를 배운다

  • 8장 쿠버네티스 실습 환경 구축

    • 쿠버네티스 실습을 위해 가상머신에 쿠버네티스 클러스터를 구축한다

  • 9장 쿠버네티스 기초

    • 쿠버네티스 운영을 위한 디플로이먼트, 서비스, 스토리지 볼륨, 스테이트풀셋, 인그레스, 잡과 크론잡 등과 같은 쿠버네티스 기초 내용을 학습한다

  • 10장 쿠버네티스를 활용한 웹 서비스 배포

    • 앞에서 배운 쿠버네티스 기초 내용을 바탕으로 django 및 Flask 등을 활용하여 웹 서비스를 배포해본다

  • 11장 깃허브 액션과 ArgoCD를 활용한 CI/CD

    • 깃허브 액션과 ArgoCD를 활용하여 CI/CD를 진행한다

  • 12장 쿠버네티스 모니터링

    • 매트릭 서버, 프로메테우스, 그라파나, 로키 등을 활용하여 쿠버네트스 클러스터를 모니터링하는 방법을 학습한다


예제 소스 및 첨부 파일

이 책에서는 버추얼박스를 설치하고 가상머신을 생성해서 각 가상머신에 도커와 쿠버네티스를 설치하면서 실습을 진행한다

챕터1에서 우분투 리눅스 이미지를 다운로드 하고 버추얼 박스 설치와 가상머신을 생성하고 실습을 위해 필요한 환경을 차근 차근 구축 해본다

환경이 구축된 다음에는 우분투 운영체제의 텍스트 편집기인 vim의 기본 사용법과 우분투 기초 명령어를 학습한다




챕터2는 도커를 학습하기 위해 필요한 사전 지식과 도커에 관련된 기본 개념으로 구성되어 있다

도커 학습을 위한 사전 지식에는 운영체제, 프로그램, 프로세스, 스레드, 네임스페이스 등이 있는데 이 개념들을 정확히 이해해야 도커라는 도구를 자유롭게 다룰 수 있다

도커의 정의를 살펴보고 도커의 필수 개념인 컨테이너 및 가상화에 대해 배우고 도커의 구성 요소를 학습한다




챕터 4에서는 도커와 관련된 기초 지식을 배우고 실습한다

먼저 도커의 구성 요소와 작동 방식을 배우고 컨테이너로 실행하는 데 필요한 내용을 학습한다

그다음 이 과정에서 알아야 할 도커의 다양한 명령어를 익히고 도커 네트워크, 스토리지와 관련된 내용을 실습해본다

도커 구성 요소

  • docker-cli: 도커 클라이언트, 명령어 행으로 dockerd API를 활용해 build, pull, run과 같은 명령어를 내림

  • dockerd: 도커 데몬, 백그라운드에서 실행되는 데몬 프로세스에 해당함

  • containerd: 컨테이너 실행과 관리에 필요한 기능을 수행하는 오픈 소스 컨테이너 런타임(컨테이너의 생명주기를 모두 관리)

    • containerd-shim: container와 runc 사이에서 작동하는 중간 프로세스(컨테이너 실행을 조정하는 역할)

    • runc: 컨테이너 실행과 관련된 작업을 수행하는 저수준 컨테이너 런타임




도커를 사용하기 위해서는 도커 명령어를 필수적으로 숙지하고 있어야 한다

책에서 소개하는 도커 이미지 명령어와 도커 컨테이너 명령어를 살펴보고 반복적으로 실습해본다




챕터 5에서는 챕터 4까지 공부한 도커의 기초 명령어와 기능을 활용하여 django를 활용한 웹 서비스를 실행한다

pyenv를 활용해 파이썬 가상 환경을 구축하고 YAML 파일의 개념에 대해 학습해보고 Docker Compose를 활용해 웹 서비스를 실행해본다

챕터 6에서는 Flask를 활용해 웹 서비스를 실행해본다

전체적인 실습 과정은 챕터 5와 비슷하지만 django를 활용할 때와 Flask를 활용할 때의 차이점에 주안점을 두고 실습해본다

동일하게 Flask를 활용할 때도 사용하는 소프트웨어 종류에 따라 사용하는 방법의 차이가 존재한다




챕터 7에서 챕터 12까지는 쿠버네티스에 대한 내용을 다룬다

  • 챕터 7에서는 쿠버네티스의 기본 개념과 구조에 대해서 배운다

  • 챕터8 에서는 쿠버네티스 실습 환경을 구축해본다

    • 쿠버네티스를 설치할 때는 쿠버네티스를 곧바로 설치하는 것이 아니라 사전에 준비해야 하는 사항이 있다

    • 사전 준비 사항을 갖추지 않고 쿠버네티스를 설치한다면 설치에 실패하는 경우가 발생할 수 있으니 미리 실습 환경을 잘 구축해야 한다

  • 챕터 9에서는 쿠버네티스의 기초 개념과 명령어에 대해 학습한다

    • 먼저 쿠버네티스의 전체적인 구성을 살펴보고 디플로이먼트, 서비스, 스토리지 볼륨, 스테이트풀셋, 인그레스, 잡, 크론잡과 같은 다양한 워크플로에 대해서 실습해본다



하나의 애플리케이션을 실행하려면 다수의 yaml 파일을 관리해야 하는데 이때 헬름을 활용하면 유용하다

헬름으로 쿠버네티스 클러스터에 애플리케이션 배포를 위해 필요한 파일들을 하나의 패키지 형태로 관리할 수 있기 때문이다

헬름은 리눅스 환경에서의 apt, yum과 비슷한 개념이다

헬름을 활용하면 yaml 파일을 만들지 않고도 쿠버네티스 환경에서 애플리케이션을 쉽고 편하게 설치할 수 있다

헬름 차트는 쿠버네티스 리소스를 생성하기 위해 필요한 파일을 모아놓은 디렉터리라고 할 수 있다

헬름 템플릿인 values.yaml 파일을 활용하면 설치에 필요한 여러 변수를 한 번에 설정할 수 있고 쿠버네티스 리소스를 최적화하기에도 쉽다

헬름 리포지토리는 다양한 헬름 차트를 저장 및 공유하는 저장소이다

헬름 리포지 토리는 도커 리포지토리와 비슷한 개념이다

책에서는 그림을 통해 헬름의 개념을 쉽게 이해할 수 있도록 도움을 주고 있다




인그레스로 두개의 서비스를 배포하기 위한 인그레스 yml 파일을 작성하는 과정이다



작성된 yml 파일을 통해 인그레스로 두 개의 서비스가 어떻게 배포되는지 구체적인 아키텍처 그림을 통해 잘 설명 해주고 있다




챕터 10에서는 쿠버네티스를 통해 django와 Flask를 실행해본다

  • 쿠버네티스의 기본 개념이 기반이 되므로 앞서 배운 내용을 정확히 이해하는 것이 매우 중요하다

쿠버네티스를 통해 서비스를 배포하고 서비스가 잘 구동되었는 지 확인 해볼 수 있으며 최종적으로 실습 내용을 정리해본다




챕터 11에서는 CI/CD에 대해 학습한다

  • 챕터 10에서는 단순히 내가 만든 서비스를 실행하는 데 집중했다면 챕터 11에서는 작성한 소스코드를 지속적으로 통합하고 전달하는 과정에 대해 배운다

  • GitHub ActionsArgoCD를 활용한다

GitHub Actions를 통해서 도커 테스트는 가능하지만 쿠버네티스를 활용한 애플리케이션 배포는 다소 어려운 측면이 있다

이를 해결하기 위해 나온 것이 ArgoCD이다

ArgoCD는 쿠버네티스 애플리케이션의 자동 배포를 가능하게 해주는 오픈소스 소프트웨어이다

ArgoCD를 활용하면 쿠버네티스 클러스터의 애플리케이션을 지속적으로 관리하고 배포할 수 있다



챕터 12에서는 모든 노드를 관리할 수 있는 쿠버네티스 모니터링에 대해 학습한다

  • 쿠버네티스 클러스터가 커질수록 쿠버네티스 클러스터를 구성하는 모든 노드를 관리하는 것은 쉬운 일이 아니다

  • 쿠버네티스 클러스터 전체를 모니터링할 수 있는 방법을 고안

    • 매트릭 서버를 활용해 리소스 사용량을 확인하는 방법

    • 프로메테우스를 통해 모니터링 데이터를 수집하는 방법

    • 그라파나를 통해 모니터링 데이터를 시각화하는 방법

    • 로키를 활용해 쿠버네티스 로그를 확인하는 방법



기존 리눅스 서버에 수동으로 구성해서 운영하고 관리하던 방식에서 이제 점점 도커와 쿠버네티스와 같은 컨테이너 환경의 대규모 운영/배포가 가능한 방식이 점점 표준으로 자리잡아 나가고 있다

서비스는 매우 빠르게 발전하고 그에 맞춰서 서비스를 운영하는 방식은 발전해나가야 하므로 어찌보면 당연한 일이다

수십 수백명의 사용자가 사용하는 서비스에서 수천만명을 넘어 수억명의 사용자가 사용하는 글로벌 서비스로 발전해나가는 서비스를 뒷받침하기 위해서는 엔지니어가 일일히 수동으로 서버를 셋팅하고 운영하는 방식으로는 한계점이 명확하다


도커 컨테이너 환경과 쿠버네티스가 표준 서비스 운영환경으로 자리잡아 가는 이유는 명확하다 인적 리스크를 줄이고 서비스 운영/배포의 효율성을 극대화 한다

클라우드를 활용해 스크립트 구성을 잘만한다면 단 한명의 엔지니어의 손으로 수천만명이 사용하는 서비스를 앉은 자리에서 뚝딱 생성해낼 수 있게 하는 것이 바로 컨테이너 환경의 장점이다

또한 CI/CD 구성으로 수천 수만개의 서버를 동시에 배포할 수도 있고 단지 명령어와 스크립트 하나만으로 서비스를 뚝딱 생성해낼 수도 있다

또한 컨테이너 환경의 서버구성은 스크립트를 살펴보는 것만으로도 모든 서버 구성을 한번에 파악할 수 있는 장점도 있다

쿠버네티스 배포 스크립트가 바로 서버와 서비스 명세서나 다름 없기 때문이다


도커와 쿠버네티스의 기초가 없는 사람이라도 이 책을 통해 도커와 쿠버네티스로 서비스를 올려보면서 컨테이너 환경에 대해 이해할 수 있다

이 책은 도커와 쿠버네티스의 입문자를 대상으로 하기 때문에 다양한 아키텍처 그림과 스크립트를 통해 매우 직관적으로 이해하기 쉽게 설명을 한다

또한 실습을 진행하는 동시에 명확설명을 통해 스탭별로 부분 부분 모두 이해하고 넘어 갈 수 있도록 도와주는 것이 이 책의 가장 큰 특징이다

때문에 이 책을 보면서 단계별로 실습을 하고 내용을 정확하게 이해한다면 도커와 쿠버네티스 환경에 대해 완벽하게 이해할 수 있을 것이다


※ 한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.


댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
함수형 프로그래밍 with 자바 - 함수형 프로그래밍을 적용하여 객체 지향 자바 코드 향상시키기
벤 바이디히 지음, 허귀영 옮김 / 한빛미디어 / 2024년 3월
평점 :
장바구니담기


네이버 블로그 리뷰: https://blog.naver.com/rock1192/223415211558



함수형 프로그래밍은 주로 복잡한 애플리케이션과 시스템 개발에 있어 고수준의 추상화와 불변성, 효율적인 병렬 처리 등의 많은 장점을 제공한다

2014년 자바 8에서 람다 표현식과 스트림 API가 소개되었는데, 이는 자바에서 함수형 프로그래밍의 출발점이 되었다

함수형 프로그래밍은 대규모 데이터 처리, 분산 시스템, 클라우드 컴퓨팅 등 현대 개발 환경의 복잡한 요구 사항에 효과적이다

이 책에서는 함수형 프로그래밍이 무엇인지와 자바에서 함수형 프로그래밍을 채택한 구체적인 이유와 기존 자바 코드를 함수형 스타일로 전환하는 방법에 대해 설명한다

또한 함수형 프로그래밍에 익숙하지 않은 개발자들이 쉽게 이해할 수 있도록 다양한 예제와 그림 자료를 제공한다

이 책에 대하여

소프트웨어 개발은 매우 복잡한 작업이라서 많은 자바 개발자가 복잡성을 극복하기 위해 객체 지향 프로그래밍(OOP)을 이용한다

객체 지향 프로그래밍에서는 개발하고자 하는 대상을 자료 구조로 표현하며, 주로 명령형 코딩 스타일을 통해 프로그래밍의 상태를 관리한다

객체 지향 프로그래밍은 가장 유명하고 검증된 프로그래밍 패러다임 중 하나이지만 항상 최적의 해결책이 되지는 않는다

오히려 모든 문제에 이 원칙을 적용하다 보면 프로그램이 더 복잡해질 수도 있다

따라서 상황에 적합한 도구와 패러다임을 선택해야 한다

이러한 맥락에서 함수형 프로그래밍(FP) 패러다임은 문제 해결에 대한 새로운 접근 방식을 제안한다

이 책에서는 함수형 프로그래밍의 장점을 활용해 기존의 프로그래밍 방식과 소프트웨어 개발 도구를 보완하는 방법을 소개한다

이 책에서 배울 수 있는 것

  • 합성(composition): 모듈식으로 쉽게 합성할 수 있는 블록을 구축

  • 표현식(expressiveness): 의도를 명확하게 표현하는 간결한 코드를 작성

  • 코드 안정성(safer code): 오류를 발생시키지 않고 경합 조건(race condition)이나 락(lock)을 처리할 필요가 없는 더 안전한 자료 구조를 만들 수 있다

  • 모듈성(modularity): 큰 프로젝트를 더 쉽게 관리할 수 있는 모듈로 분할한다

  • 유지보수성(maintainability): 연관성이 적은 함수형 블록들을 사용하여 코드의 다른 부분을 손상시키지 않으면서 코드 변경이나 리팩터링을 더 안전하게 수행할 수 있다

  • 데이터 조작(data manipulation): 더 적은 복잡성으로 효율적인 데이터 조작 파이프라인을 구축한다

  • 성능(performance): 불변성과 예측 가능성을 통해 큰 고민 없이 병렬로 수평 확장이 가능하다

책의 구성

  • Part 1

    • 1부에서는 함수형 프로그래밍의 핵심 개념과 역사를 소개하고, 자바에서 이러한 개념을 구현하는 방법과 사용 가능한 기능에 대해 소개한다

  • Part 2

    • 2부에서는 일반적인 프로그래밍 개념을 포함하여 함수형 원칙과 새로 도입된 기능들을 어떻게 활용할 수 있는 지에 대해 소개한다

    • 레코드와 스트림처럼 주요 기능들은 예제와 사용 사례를 통해 배워본다

소스 코드

https://github.com/benweidig/a-functional-approach-to-java




함수형 프로그래밍은 주로 추상 함수에 기반을 두고 있으며 이 패러다임을 구성하는 많은 개념은 선언적 스타일로 '무엇을 해결할 것인가'에 초점을 맞추고 있다




함수형 프로그래밍의 장점

  • 간결성(simplicity)

  • 일관성(consistency)

  • (수학적) 정확성(mathematical) correctness

  • 안전한 동시성(safer concurrency)

  • 모듈성(modularity)

  • 테스트 용이성(testability)



함수형 프로그래밍의 단점

  • 학습 곡선(learning curve)

  • 고수준 추상화(higher level of abstraction)

  • 상태 처리(dealing with state)

  • 성능 영향도(performance implication)

  • 최적의 문제 상황(optimal probelm context)




  • 함수형 프로그래밍은 '람다 대수'라는 수학적 원리를 기반으로 한다

  • 함수형 프로그래밍에는 문장보다 표현식을 기반으로 하는 선언적 코딩 스타일이 필수이다

  • 많은 프로그래밍 개념은 본질적으로 함수형인 것처럼 느껴지지만, 언어나 코드를 완전히 '함수형'으로 만들 필요는 없다

  • 순수성, 일관성, 간결성은 함수형 접근 방식을 취대한 활용하기 위해 코드에 작용해야 하는 필수적인 속성이다

  • 함수형 개념과 실제 적용 사이에는 타협이 필요하다

    • 함수형 개념의 장점은 단점을 능가하거나 어떠한 형태로든 완화할 수 있다



  • 람다 표현식은 자바 코드가 한 줄 또는 블록 단위로 이루어져 있으며 0개 이상의 매개변수를 갖고 값을 반환할 수 있다

    람다는 어떠한 객체에도 속하지 않는 익명 메서드와 비슷하다

    람다 문법은 매개변수, 화살표, 바디 세가지 부분으로 구성된다




    자바 인터페이스 선언은 인터페이스 이름과 선택적으로 사용되는 제네릭 바운드(generic bound), 상속 인터페이스(inherited interface)와 인터페이스의 바디로 구성된다

    메서드 시그니처(method signature), 기본 메서드(default method), 정적 메서드(static method), 상수




    스트림은 다른 데이터 처리 방식처럼 작업을 수행하지만 내부 반복자라는 장점이 있다

    주요 장점

    • 선언적 접근법(declarative approach)

    • 조합성(composability)

    • 지연 처리(laziness)

    • 성능 최적화(performance optimization)

    • 병렬 데이터 처리(parallel data processing)




    스트림의 특성

    • 느긋한 계산법

    • (대부분) 상태 및 간섭 없음

    • 최적화(성능 향상을 위한 여러 전략 활용)

      • (무상태의) 연산 융합

      • 불필요한 연산 제거

      • 단축 파이프라인 경로

    • 보일러 플레이트 최소화

    • 재사용 불가능

    • 원시 스트림

    • 쉬운 병렬화

    • 예외 처리의 한계




    람다 표현식은 지연 평가를 위해 표현식을 캡슐화하는 간단한 저 수준의 방법이다

    한 가지 부족한 점은 평가 후 결과를 저장하는 것, 즉 두 번 호출되어도 표현식을 다시 평가하지 않도록 하는 메모이제이션(memoization)이다


    이 부족한 점을 해결하는 방법이 바로 썽크(Thunk) 이다

    썽크는 연산을 감싸는 래퍼로, 결과가 필요할 때까지 연산을 지연시키기 위해 사용한다

    연산을 지연시키지만 여러 번 호출할 수 있는 Supplier와는 달리 썽크는 한 번만 계산되며 이후의 호출에서는 결과를 즉시 반환한다


    썽크는 객체 지향 코드에서 자주 발견되는 디자인 패턴인 지연 로딩(lazy loading)/지연 초기화(lazy initialization)의 일반적인 범주에 속한다

    지연 로딩과 지연 초기화는 비엄격 평가와 결과 캐시라는 동일한 목표를 달성하기 위한 메커니즘이다




    CompletableFutures의 설계 철학은 스트림과 매우 유사하다

    두 방식 모두 작업 기반 파이프라인을 제공하며, 일반적인 함수형 인터페이스를 받아들이는 매개변수화된 메서드를 제공한다

    이 새로운 API는 CompletionStageCompletableFuture의 새 인스턴스를 반환하는 다양한 조정 도구들을 추가로 제공한다

    이러한 비동기 계산을 위한 컨테이너와 조정 도구들을 사용하면, 기존에 부족했던 모든 기능들을 유연하게 구성 가능하며 선언적인 API로 제공한다




    프로미스(promises)는 비동기 파이프라인의 기본 구성 요소로, 오류 처리를 포함하여 여러 작업을 연결하고 결합할 수 있는 내장된 조정 도구를 갖추고 있다

    프로미스는 대기(완료되지 않음), 성공(완료되었으며 정상 상태), 실패(완료되었지만 오류 상태)의 세 가지 상태 중 하나이다

    합성 파이프라인에서 이러한 상태 간의 이동은 데이터와 오류 채널 간의 전환을 통해 이루어진다


    데이터 채널은 모든 것이 잘 진행될 때의 이상적인 경로이다

    프로미스가 실패하면 파이프라인은 오류 채널로 전환된다

    이런 방식으로 실패가 전체 파이프라인을 중단시키지 않고 스트림처럼 우아하게 처리되거나 복구되어 다시 데이터 채널로 전환될 수 있다

    CompletableFuture API는 사실상 다른 이름을 가진 프로미스라고 볼 수 있다




    이 책은 자바 개발자를 위한 함수형 프로그래밍 도서 이다

    총 두개의 파트로 나누어져 있으며 Part 1에서는 함수형 기초에 대해서 다루고 있고 Part 2에서는 함수형 접근 방식을 다루고 있으며 Part 2에서 최신 Java에서 사용할 수 있는 여러가지 함수형 기법들과 비동기 프로그래밍에 대해서도 배울 수 있다


    본인도 자바 개발자로 객체지향적 사고방식을 가지고 있어 함수형 프로그래밍 패러다임을 이해하기는 쉽지 않다

    하지만 가끔 스트림과 Function을 사용한 코드가 객체지향으로 구현하기에 매우 복잡한 로직을 매우 쉽고 간결하게 해결해주는 경험을 해본적이 있어 스트림과 Function, 그리고 CompletableFuture를 활용한 비동기 프로그래밍은 꽤나 자주 사용하여 개발을 하고 있다


    이 책을 잘 읽어보면 내가 느낀대로 함수형 프로그래밍은 객체지향으로 풀기 어려운 문제들을 쉽게 풀어낼 수 있는 패러다임이라는 것을 알 수 있다

    물론 뭐든 남용하면 좋지 않다는 것도 잘 알고 있다

    객체지향도 추상적인 개념을 많이 사용하지만 함수형 프로그래밍에 비해서는 매우 명확하고 로직을 이해하기 쉬운 장점이 있다

    하지만 간혹 특정 문제를 해결하기 위한 로직은 상상이상으로 복잡해지며 수많은 클래스파일을 생성하여 복잡도가 매우 올라가고 그만큼 로직도 매우 복잡해져 이해하기 어려운 코드가 되기도 한다

    이런 복잡한 문제를 해결하기 위해서는 함수형 프로그래밍을 적절히 접목하면 로직을 굉장히 간결하게 구현할 수 있으며 병렬처리와 비동기 처리, 지연처리들을 활용하여 성능적인 이점도 가져갈 수 있게 된다


    함수형 프로그래밍은 깊이 공부해본적이 없어서 모호하게 이해하고 있던 부분들을 이 책을 통해 기초도 단단히 다지고 몇가지 노하우도 얻을 수 있어서 매우 유익했던 것 같다

    그동안 자바 개발자를 위한 함수형 프로그래밍 서적은 그 수가 많지 않아 궁금하거나 알고 싶은 부분들은 블로그를 통해 파편적으로 정보를 얻고 있었는데 그럼에도 불구하고 내용이 꽤나 어려워 명확히 이해되지 않는 부분들이 많이 있었다

    이 책 덕분에 궁금증이 상당 부분 해소되고 모호한 부분들을 명확하게 이해할 수 있게 되어 매우 만족스러웠다


    ※ 한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.


    댓글(0) 먼댓글(0) 좋아요(0)
    좋아요
    공유하기 북마크하기찜하기 thankstoThanksTo