함수형사고 실용적사고

17
함수형 사고 7실용적 사고

Upload: sung-gon-song

Post on 15-Apr-2017

61 views

Category:

Software


0 download

TRANSCRIPT

Page 1: 함수형사고 실용적사고

함수형 사고7장 실용적 사고

Page 2: 함수형사고 실용적사고

실용적 사고

함수형 사고가 적용된 실례

❏ 자바 8❏ 함수형 구조❏ 웹 프레임워크

Page 3: 함수형사고 실용적사고

자바 8

filterPredicate<String> p = (name) -> name.length() > 1;names.stream().filter(p)

mapcapitalize() 메서드를 컬렉션의 각 요소에 적용한다.

collectreduce()보다 StringBuilder와 같은 가변구조에 collect가 효율적

ArrayList나 StringBuilder를 위해, 매번 새로운 결과를 내지 않고 기존의 요소를 업데이트하는, 가변 리듀스 작업을 하는 메서드가 포함되어 reduce로도 가능하겠지만 collect가 효율적

Page 4: 함수형사고 실용적사고

자바 8 - 함수형 인터페이스

함수형 인터페이스는 람다 블록이 자연스럽게 녹아들 수 있게 해준다.

● 하나의 함수형 인터페이스는 하나의 SAM을 포함하며, 여러 개의 디폴트 메서드도 함께 포함할 수 있다.

● SAM(Single Abstract Method) interfaces : Runnable이나 Callable같이 메서드를 하나만 가지는 인터페이스

new Thread (() -> System.out.println("Inside thread")).start();

Page 5: 함수형사고 실용적사고

자바 8 - 함수형 인터페이스

람다 블록을 감싸는 Comparator 인스턴스를 생성하고,

역 비교자는 reversed() 디폴트 메서드를 호출하면 만들 수 있음

Page 6: 함수형사고 실용적사고

자바 8 - 0ptional

자바 8에서 min()과 같은 내장 메서드는 값 대신 0ptional을 리턴

0ptional은 오류로서의 null과 리턴 값으로서의 null을 혼용하는 것을 방지

Page 7: 함수형사고 실용적사고

자바 8 - 스트림

자바 8의 스트림은 많은 함수형 기능을 가능하게 한다.

❏ 종결 작업을 통해 입력에서 종착점까지 흐르는 파이프라인처럼 사용❏ 스트림은 상태를 유지하지 않는 함수형으로 설계❏ 스트림 작업은 최대한 게으르게 한다.❏ 무한한 스트림은 가능하다.❏ Iterator인터페이스처럼 스트림은 사용과 동시에 소멸되고, 재사용 전에 다

시 생성해야 한 다.

Page 8: 함수형사고 실용적사고

함수형 인프라스트럭처

소프트웨어 아키텍처나 데이터를 다루는 근본적인 방법을 함수형으로 변경

Page 9: 함수형사고 실용적사고

함수형 인프라스트럭처 - 아키텍처

❏ 함수형 아키텍처의 중심에 불변성이 있고 최대한 사용해야 함 ❏ 변이가 많을수록 오류 가능성이 높고 테스트가 많이 필요하다.

❏ 불변 클래스는 생성 시에만 변이가 있기 때문에 테스트가 간단

❏ 불변 객체는 쓰레드에 안전하기 때문에 동기화의 문제가 없음

Page 10: 함수형사고 실용적사고

함수형 인프라스트럭처 - 아키텍처

불변형 클래스 만들기

❏ 모든 필드를 final로 선언하라.

❏ 클래스를 final로 선언하여 오버라이드 방지해야 함❏ 인수가 없는 생성자를 제공하지 말라.

❏ 생성자외에는 변이 메서드를 제공하지 말라❏ 적어도 하나의 생성자를 제공하라.

Page 11: 함수형사고 실용적사고

함수형 인프라스트럭처 - CQRS

❏ CQRS는 기존의 인프라 스트럭처를 활용하여 함수형개념을 구현

❏ 쿼리와 명령부분을 분리함으로써 아키텍처의 일부를 단순화함

❏ 불변성을 가정할수 있는 쿼리쪽의 논리는 훨씬 단순

CQRS를 사용한다면 트랜잭션 모델보다는

분산처리를 위해 최종 일관성 모델로 전환 필요

Page 12: 함수형사고 실용적사고

함수형 인프라스트럭처 - CQRS

❏ 분산 컴퓨팅 모델은 모델을 업데이트하는 데 latency를 희생하고, 최종적으로 모델의 일관성을 갖추면 된다.❏ 트랜잭션 모델이 ACID(Atomic, Consistent, Isolated, Durable)에 의존한다.

❏ 최종 일관성 모델은 BASE(Basically Available, Soft state, Eventual consistency)를 중요하게 여긴다.

❏ CQRS는 모든 상태변화를 이벤트 스트림으로 보존해야 하는 이벤트 소싱과 같은 아키텍처 패턴에 아주 적합

Page 13: 함수형사고 실용적사고

함수형 인프라스트럭처 - 웹 프레임워크

웹의 요청(Request)을 응답(Response)으로 바꾸는 일련의 변형으로 볼수 있음

❏ 경로 설정 프레임웍 - 경로 설정을 애플리케이션 기능으로 부터 분리 시킴❏ 함수를 목적지로 사용 - 웹상의 요청을 받아서 응답을 리턴하는 함수❏ DSL(Domain Specific Language) - 좁은 문제 도메인에 적용되는 표현으로

제한된 프로그래밍 언어로 정의❏ 빌드도구와 밀접한 연동 - IDE뿐 아니라 커맨드라인 빌드 도구와 밀접하게

연결

Page 14: 함수형사고 실용적사고

함수형 인프라스트럭처 - 데이터베이스

관계형 데이터베이스는 업데이트를 할때마다 예전값은 없어지고 새 값으로 대체된다.

-> 데이터 증가를 억제하고 저장장소 활용을 극대화하는 아키텍처 제한이 존재

Page 15: 함수형사고 실용적사고

함수형 인프라스트럭처 - 데이터베이스

데이토믹(http://www.datomic.com/)

❏ 기존 관계형 DB의 이러한 아키텍처 제한을 뒤집고 함수형 개념을 적용한 NoSQL 데이터베이스

❏ 모든 facts에 시간을 붙여서 저장하는 불변형 데이터 베이스❏ 데이터 대신에 값을 저장함으로써 저장소를 효율적으로 사용

❏ 애플리케이션에 보이는 값을 업데이트하려면 다른값을 가리키게 하면 된다.

❏ 시간이라는 개념을 정보에 덧대어 facts이 항상 적절한 문맥에 연결되게 함

http://docs.datomic.com/architecture.html

Page 16: 함수형사고 실용적사고

함수형 인프라스트럭처 - 데이토믹

❏ 모든 스키마와 데이터의 변화를 영원히 기록하기❏ 읽기와 쓰기의 분리

❏ 데이토믹의 아키텍처는 CQRS 아키텍처

❏ 이벤트 주도 아키텍처를 위한 불변성과 타임스탬프❏ 이벤트 주도 아키텍처는 애플리케이션 상태 변화를 이벤트 스트림으로 저장한다. 모든

정보를 타임스탬프와 함께 저장하는 데이터베이스

Page 17: 함수형사고 실용적사고

함수형 인프라스트럭처

❏ 함수형 프로그래밍을 향한 패러다임의 깊은 변화를 이용하여 도구와 프레임워크를 만들기