ݺߣ

ݺߣShare a Scribd company logo
함수형 사고
7장 실용적 사고
실용적 사고
함수형 사고가 적용된 실례
❏ 자바 8
❏ 함수형 구조
❏ 웹 프레임워크
자바 8
filter
Predicate<String> p = (name) -> name.length() > 1;
names.stream()
.filter(p)
map
capitalize() 메서드를 컬렉션의 각 요소에 적용한다.
collect
reduce()보다 StringBuilder와 같은 가변구조에 collect가
효율적
ArrayList나 StringBuilder를 위해, 매번 새로운 결과를 내지 않고
기존의 요소를 업데이트하는, 가변 리듀스 작업을 하는 메서드가
포함되어 reduce로도 가능하겠지만 collect가 효율적
자바 8 - 함수형 인터페이스
함수형 인터페이스는 람다 블록이 자연스럽게 녹아들 수 있게 해준다.
● 하나의 함수형 인터페이스는 하나의 SAM을 포함하며, 여러 개의 디폴트
메서드도 함께 포함할 수 있다.
● SAM(Single Abstract Method) interfaces : Runnable이나 Callable같이 메서드를
하나만 가지는 인터페이스
new Thread (() -> System.out.println("Inside thread")).start();
자바 8 - 함수형 인터페이스
람다 블록을 감싸는
Comparator
인스턴스를 생성하고,
역 비교자는 reversed()
디폴트 메서드를
호출하면 만들 수 있음
자바 8 - 0ptional
자바 8에서 min()과 같은 내장 메서드는 값 대신 0ptional을 리턴
0ptional은 오류로서의 null과 리턴 값으로서의 null을 혼용하는 것을 방지
자바 8 - 스트림
자바 8의 스트림은 많은 함수형 기능을 가능하게 한다.
❏ 종결 작업을 통해 입력에서 종착점까지 흐르는 파이프라인처럼 사용
❏ 스트림은 상태를 유지하지 않는 함수형으로 설계
❏ 스트림 작업은 최대한 게으르게 한다.
❏ 무한한 스트림은 가능하다.
❏ Iterator인터페이스처럼 스트림은 사용과 동시에 소멸되고, 재사용 전에 다
시 생성해야 한 다.
함수형 인프라스트럭처
소프트웨어 아키텍처나 데이터를 다루는 근본적인 방법을
함수형으로 변경
함수형 인프라스트럭처 - 아키텍처
❏ 함수형 아키텍처의 중심에 불변성이 있고 최대한 사용해야 함
❏ 변이가 많을수록 오류 가능성이 높고 테스트가 많이 필요하다.
❏ 불변 클래스는 생성 시에만 변이가 있기 때문에 테스트가 간단
❏ 불변 객체는 쓰레드에 안전하기 때문에 동기화의 문제가 없음
함수형 인프라스트럭처 - 아키텍처
불변형 클래스 만들기
❏ 모든 필드를 final로 선언하라.
❏ 클래스를 final로 선언하여 오버라이드 방지해야 함
❏ 인수가 없는 생성자를 제공하지 말라.
❏ 생성자외에는 변이 메서드를 제공하지 말라
❏ 적어도 하나의 생성자를 제공하라.
함수형 인프라스트럭처 - CQRS
❏ CQRS는 기존의 인프라 스트럭처를 활용하여 함수형개념을 구현
❏ 쿼리와 명령부분을 분리함으로써 아키텍처의 일부를 단순화함
❏ 불변성을 가정할수 있는 쿼리쪽의 논리는 훨씬 단순
CQRS를 사용한다면 트랜잭션 모델보다는
분산처리를 위해 최종 일관성 모델로 전환 필요
함수형 인프라스트럭처 - CQRS
❏ 분산 컴퓨팅 모델은 모델을 업데이트하는 데 latency를 희생하고,
최종적으로 모델의 일관성을 갖추면 된다.
❏ 트랜잭션 모델이 ACID(Atomic, Consistent, Isolated, Durable)에 의존한다.
❏ 최종 일관성 모델은 BASE(Basically Available, Soft state, Eventual consistency)를
중요하게 여긴다.
❏ CQRS는 모든 상태변화를 이벤트 스트림으로 보존해야 하는 이벤트 소싱과
같은 아키텍처 패턴에 아주 적합
함수형 인프라스트럭처 - 웹 프레임워크
웹의 요청(Request)을 응답(Response)으로 바꾸는 일련의 변형으로 볼수 있음
❏ 경로 설정 프레임웍 - 경로 설정을 애플리케이션 기능으로 부터 분리 시킴
❏ 함수를 목적지로 사용 - 웹상의 요청을 받아서 응답을 리턴하는 함수
❏ DSL(Domain Specific Language) - 좁은 문제 도메인에 적용되는 표현으로
제한된 프로그래밍 언어로 정의
❏ 빌드도구와 밀접한 연동 - IDE뿐 아니라 커맨드라인 빌드 도구와 밀접하게
연결
함수형 인프라스트럭처 - 데이터베이스
관계형 데이터베이스는 업데이트를 할때마다 예전값은 없어지고 새 값으로
대체된다.
-> 데이터 증가를 억제하고 저장장소 활용을 극대화하는 아키텍처 제한이 존재
함수형 인프라스트럭처 - 데이터베이스
데이토믹(http://www.datomic.com/)
❏ 기존 관계형 DB의 이러한 아키텍처 제한을 뒤집고 함수형 개념을 적용한
NoSQL 데이터베이스
❏ 모든 facts에 시간을 붙여서 저장하는 불변형 데이터 베이스
❏ 데이터 대신에 값을 저장함으로써 저장소를 효율적으로 사용
❏ 애플리케이션에 보이는 값을 업데이트하려면 다른값을 가리키게 하면 된다.
❏ 시간이라는 개념을 정보에 덧대어 facts이 항상 적절한 문맥에 연결되게 함
http://docs.datomic.com/architecture.html
함수형 인프라스트럭처 - 데이토믹
❏ 모든 스키마와 데이터의 변화를 영원히 기록하기
❏ 읽기와 쓰기의 분리
❏ 데이토믹의 아키텍처는 CQRS 아키텍처
❏ 이벤트 주도 아키텍처를 위한 불변성과 타임스탬프
❏ 이벤트 주도 아키텍처는 애플리케이션 상태 변화를 이벤트 스트림으로 저장한다. 모든
정보를 타임스탬프와 함께 저장하는 데이터베이스
함수형 인프라스트럭처
❏ 함수형 프로그래밍을 향한 패러다임의 깊은 변화를 이용하여 도구와
프레임워크를 만들기

More Related Content

함수형사고 실용적사고

  • 2. 실용적 사고 함수형 사고가 적용된 실례 ❏ 자바 8 ❏ 함수형 구조 ❏ 웹 프레임워크
  • 3. 자바 8 filter Predicate<String> p = (name) -> name.length() > 1; names.stream() .filter(p) map capitalize() 메서드를 컬렉션의 각 요소에 적용한다. collect reduce()보다 StringBuilder와 같은 가변구조에 collect가 효율적 ArrayList나 StringBuilder를 위해, 매번 새로운 결과를 내지 않고 기존의 요소를 업데이트하는, 가변 리듀스 작업을 하는 메서드가 포함되어 reduce로도 가능하겠지만 collect가 효율적
  • 4. 자바 8 - 함수형 인터페이스 함수형 인터페이스는 람다 블록이 자연스럽게 녹아들 수 있게 해준다. ● 하나의 함수형 인터페이스는 하나의 SAM을 포함하며, 여러 개의 디폴트 메서드도 함께 포함할 수 있다. ● SAM(Single Abstract Method) interfaces : Runnable이나 Callable같이 메서드를 하나만 가지는 인터페이스 new Thread (() -> System.out.println("Inside thread")).start();
  • 5. 자바 8 - 함수형 인터페이스 람다 블록을 감싸는 Comparator 인스턴스를 생성하고, 역 비교자는 reversed() 디폴트 메서드를 호출하면 만들 수 있음
  • 6. 자바 8 - 0ptional 자바 8에서 min()과 같은 내장 메서드는 값 대신 0ptional을 리턴 0ptional은 오류로서의 null과 리턴 값으로서의 null을 혼용하는 것을 방지
  • 7. 자바 8 - 스트림 자바 8의 스트림은 많은 함수형 기능을 가능하게 한다. ❏ 종결 작업을 통해 입력에서 종착점까지 흐르는 파이프라인처럼 사용 ❏ 스트림은 상태를 유지하지 않는 함수형으로 설계 ❏ 스트림 작업은 최대한 게으르게 한다. ❏ 무한한 스트림은 가능하다. ❏ Iterator인터페이스처럼 스트림은 사용과 동시에 소멸되고, 재사용 전에 다 시 생성해야 한 다.
  • 8. 함수형 인프라스트럭처 소프트웨어 아키텍처나 데이터를 다루는 근본적인 방법을 함수형으로 변경
  • 9. 함수형 인프라스트럭처 - 아키텍처 ❏ 함수형 아키텍처의 중심에 불변성이 있고 최대한 사용해야 함 ❏ 변이가 많을수록 오류 가능성이 높고 테스트가 많이 필요하다. ❏ 불변 클래스는 생성 시에만 변이가 있기 때문에 테스트가 간단 ❏ 불변 객체는 쓰레드에 안전하기 때문에 동기화의 문제가 없음
  • 10. 함수형 인프라스트럭처 - 아키텍처 불변형 클래스 만들기 ❏ 모든 필드를 final로 선언하라. ❏ 클래스를 final로 선언하여 오버라이드 방지해야 함 ❏ 인수가 없는 생성자를 제공하지 말라. ❏ 생성자외에는 변이 메서드를 제공하지 말라 ❏ 적어도 하나의 생성자를 제공하라.
  • 11. 함수형 인프라스트럭처 - CQRS ❏ CQRS는 기존의 인프라 스트럭처를 활용하여 함수형개념을 구현 ❏ 쿼리와 명령부분을 분리함으로써 아키텍처의 일부를 단순화함 ❏ 불변성을 가정할수 있는 쿼리쪽의 논리는 훨씬 단순 CQRS를 사용한다면 트랜잭션 모델보다는 분산처리를 위해 최종 일관성 모델로 전환 필요
  • 12. 함수형 인프라스트럭처 - CQRS ❏ 분산 컴퓨팅 모델은 모델을 업데이트하는 데 latency를 희생하고, 최종적으로 모델의 일관성을 갖추면 된다. ❏ 트랜잭션 모델이 ACID(Atomic, Consistent, Isolated, Durable)에 의존한다. ❏ 최종 일관성 모델은 BASE(Basically Available, Soft state, Eventual consistency)를 중요하게 여긴다. ❏ CQRS는 모든 상태변화를 이벤트 스트림으로 보존해야 하는 이벤트 소싱과 같은 아키텍처 패턴에 아주 적합
  • 13. 함수형 인프라스트럭처 - 웹 프레임워크 웹의 요청(Request)을 응답(Response)으로 바꾸는 일련의 변형으로 볼수 있음 ❏ 경로 설정 프레임웍 - 경로 설정을 애플리케이션 기능으로 부터 분리 시킴 ❏ 함수를 목적지로 사용 - 웹상의 요청을 받아서 응답을 리턴하는 함수 ❏ DSL(Domain Specific Language) - 좁은 문제 도메인에 적용되는 표현으로 제한된 프로그래밍 언어로 정의 ❏ 빌드도구와 밀접한 연동 - IDE뿐 아니라 커맨드라인 빌드 도구와 밀접하게 연결
  • 14. 함수형 인프라스트럭처 - 데이터베이스 관계형 데이터베이스는 업데이트를 할때마다 예전값은 없어지고 새 값으로 대체된다. -> 데이터 증가를 억제하고 저장장소 활용을 극대화하는 아키텍처 제한이 존재
  • 15. 함수형 인프라스트럭처 - 데이터베이스 데이토믹(http://www.datomic.com/) ❏ 기존 관계형 DB의 이러한 아키텍처 제한을 뒤집고 함수형 개념을 적용한 NoSQL 데이터베이스 ❏ 모든 facts에 시간을 붙여서 저장하는 불변형 데이터 베이스 ❏ 데이터 대신에 값을 저장함으로써 저장소를 효율적으로 사용 ❏ 애플리케이션에 보이는 값을 업데이트하려면 다른값을 가리키게 하면 된다. ❏ 시간이라는 개념을 정보에 덧대어 facts이 항상 적절한 문맥에 연결되게 함 http://docs.datomic.com/architecture.html
  • 16. 함수형 인프라스트럭처 - 데이토믹 ❏ 모든 스키마와 데이터의 변화를 영원히 기록하기 ❏ 읽기와 쓰기의 분리 ❏ 데이토믹의 아키텍처는 CQRS 아키텍처 ❏ 이벤트 주도 아키텍처를 위한 불변성과 타임스탬프 ❏ 이벤트 주도 아키텍처는 애플리케이션 상태 변화를 이벤트 스트림으로 저장한다. 모든 정보를 타임스탬프와 함께 저장하는 데이터베이스
  • 17. 함수형 인프라스트럭처 ❏ 함수형 프로그래밍을 향한 패러다임의 깊은 변화를 이용하여 도구와 프레임워크를 만들기