도서 18

[책] 객체에서 함수로 - 3장 도메인 정의 및 테스트

@Testfun `List owners can see their lists`() { val listName = "shopping" startTheApplication("frank", listName, emptyList()) getToDoList("bob", listName)} 2장에서 ToDoList를 HTML 형식으로 반환하는 간단한 WebApplication을 만들었다. ToDoList에 접근하는 동작에는 List의 주인만이 접근할 수 있는 검증 로직이 존재하고 이 내용을 확인하는 간단한 테스트가 위에 작성되어 있다. 이번 장에서는 이 테스트에서 아쉬운 점들을 보완해나가며 더 나은 구조를 만들고 또 DDT에 대해 학습한다.   시나리오 액터 추가하기interface ScenarioAc..

도서/기술 2025.03.02

[책] 객체에서 함수로 - 2장 함수로 HTTP 다루기

함수로서의 웹 서비스 함수는 입력값을 바탕으로 결과값을 만들어낸다. 함수라고 하면 메서드만을 생각할 수 있지만 범위를 확장해보면 서비스 또한 Request라는 인자를 바탕으로 Response라는 결과를 만들어내는 거대한 함수로 생각할 수 있다. 결국 함수라는 관점에서 웹 서비스는 거대한 함수이고, 이 거대한 함수는 작은 함수들의 결합하여 완성된다.   간단한 요청 만들어보기data class ToDoList( val listName: ListName, val items: List)data class ListName( val name: String)data class User( val name: String)data class ToDoItem( val description: St..

도서/기술 2025.02.23

[책] 객체에서 함수로 - 1장 애플리케이션 준비하기

책에서는 함수형 프로그래밍의 본질이 참조 투명성이라 말한다. 참조 투명성을 가졌다는 건 쉽게 말해 동일한 입력값에 대해 항상 동일한 결과를 보장한다는 뜻이다. 참조 투명성을 검증하는 법 즉, 코드가 함수형인지를 검증하는 방법은 간단한데, 식을 그 값으로 바꿀 수 있다면 함수형이라 말할 수 있다. fun add(x: Int, y: Int): Int { return x + y}// 식으로 표현fun main() { val sum = add(3, 4) println("sum: $sum")}// 값으로 표현fun main() { val sum = 7 println("sum: $sum")} 간단한 예를 들면 위 add 함수를 식으로 봤을 때 이를 결과 값으로 대체해도 결과는 동일..

도서/기술 2025.02.16

[책] 데이터 지향 프로그래밍 - 15장 디버깅

로직을 작성했다면 내가 원하는대로 동작하는지 확인해보는 과정은 필수적이다. 이는 OOP이든 DOP이든 그 어떤 프로그래밍 패러다임에서도 마찬가지일 것이다. 하지만 DOP는 이 과정에서 누릴 수 있는 이점이 있다. DOP의 데이터는 불변이기 때문에 메서드의 인자가 결과값의 유일한 원인이라는 점이다. 즉, DOP에서는 메서드 인자와 그 결과값에 대한 확인으로 동작을 확인할 수 있게 된다.   컨텍스트 포착 메서드 인자는 로깅을 통해서 확인이 가능하다. 메서드 도입부에 console.log()를 활용해 인자들을 출력하면 그만이다. 하지만 console에 출력되는 과정에서 데이터를 그대로 복붙해서 사용하기 어려운 형태로 바뀌는 경우가 있다. 예를 들면 문자열의 경우 상용을 위해서는 "string" 형태가 필요..

도서/기술 2025.02.09

[책] 데이터 지향 프로그래밍 - 14장 고급 데이터 유효성 확인

지금까지 다룬 로직은 대부분 데이터 조작과 관련된 내용이다. 하지만 시스템 로직은 데이터 조작으로만 이루어지지 않고 비즈니스 로직이 포함되어 있기 마련이다. 결국 로직은 비즈니스와 데이터 조작으로 복잡해지기 마련인데 이번 장에서는 복잡한 로직에서 가독성을 챙기는 여러 방법들을 제안한다.  범용 함수 활용하기// AS-ISfunction removeAuthorDuplicates(book) { var authors = _.get(book, "authors"); var uniqAuthors = _.uniq(authors); return _.set(book, "authors", uniqAuthors);}// 범용 함수function update(map, path, fun) { var cur..

도서/기술 2025.02.09

[책] 데이터 지향 프로그래밍 - 13장 다형성

OOP에서는 다형성을 활용해 여러 구현 클래스를 동일한 형태의 인터페이스로 다룰 수 있다. 반면 DOP에서는 OOP의 객체(클래스)를 데이터와 코드로 분리하고 데이터를 범용 자료 구조로만 다룬다. 때문에 데이터 유형에 따라 다른 클래스를 가지기보다는 필드 값 기반으로 구분하는 방향을 지향한다.   그렇다면 DOP에서는 어떻게 OOP의 다형성이 주는 이점을 누릴 수 있을까?   다형성의 핵심interface IAnimal { public void greet();}class Dog implements IAnimal { private String name; // 생성자 추가 public Dog(String name) { this.name = name; } publi..

도서/기술 2025.02.09

[책] 데이터 지향 프로그래밍 - 12장 고급 데이터 유효성 확인

최근 Ruby, Python으로 개발을 하며 어려웠던 점 중 하나는 메서드로 들어오고 나가는 데이터의 양식을 명확하게 파악하기 어렵다는 점이다. 물론 두 값에 대한 타입을 따로 정의하지 않아도 되기 때문에 편리한 점은 있지만 규모가 커지고 내가 개발하지 않은 메서드를 손봐야 할 때면 조금 어려워진다.  때마침 12장에서는 메서드 인자와 반환값에 대한 유효성 확인. 그리고 이를 바탕으로 데이터 모델 도식과 테스트 자동 생성에 대해 다룬다. 함수 인자 유효성 확인  7장 데이터 유효성 확인에서 JSON 스키마를 활용해 외부와의 경계에서 데이터를 검증하는 방법에 대해 이야기 했다. 이번 장에서 조금 다른 점은 데이터를 확인하는 시점이 시스템의 내부이자 메서드의 시작과 끝이라는 점이다.  이전보다 조금 더 나아..

도서/기술 2025.02.01

[책] 데이터 지향 프로그래밍 - 10, 11장 데이터 베이스 작업과 웹 서비스

DOP에서 DB 데이터를 다루는 방식[ { "title": "7 Habits of Highly Effective People", "isbn": "978-1982137274", "publication _year": 1989 }, { "title": "The Power of Habit", "isbn": "978-0812981605", "publication_year": 2012 }]  DOP에서 DB 데이터는 이전까지 다뤄온 메모리 데이터와 차이가 없다. 기본적으로 데이터는 맵으로 관리되고 배열로 각 데이터를 담아둔다. 이처럼 기존과 동일한 방식으로 DB 데이터를 다루기 때문에 JSON 스키마와 같이 기존에 데이터 관리를 위해 적용하던 모든 것들..

도서/기술 2025.01.25

[책] 데이터 지향 프로그래밍 - 9장 영속 자료구조

DOP에서 데이터는 불변이다. 데이터를 직접 변경할 수 없고 필요하다면 새로운 버전의 데이터를 만들어야 한다. 이런 방식에서 우려되는 점은 크게 2가지, 안정성과 효율성이다. 어디서도 데이터를 변경할 수 없음을 보장할 수 있을까? 매번 새로운 버전의 데이터를 만들어야 한다면 성능적인 문제는 없는 걸까? 이번 장에서는 이 2가지에 대한 해답을 제시한다.   영속 자료구조로 안정성을 보장하는 방식 안정성을 보장하는 방식은 사실 간단하다. 수정 메서드를 사용할 경우 예외를 발생시키면 된다. 예를 들어 Java에서 불변 Collection에 데이터를 수정하려 하면 UnsupportedOperationException을 발생시킨다. Javascript의 경우 Object.freeze를 사용하면 동일한 효과를 얻을..

도서/기술 2024.12.22

[책] 데이터 지향 프로그래밍 - 8장 고급 동시성 제어

DOP의 동시성 관리 일반적으로 다중 스레드 환경에서 동시성을 관리하기 위해 임계 영역(Critical Section) 접근 작업을 뮤텍스와 같은 잠금 장치로 보호한다. 보호 대상에는 읽기 영역도 포함되는데 그 이유는 읽기 도중에 다른 스레드에 의해 값이 변경되어 일관성을 잃을 수 있기 때문이다.  하지만 DOP에서 읽기 작업은 다중 스레드를 고려하지 않아도 된다. 그 이유는 DOP에서 데이터는 불변이기 때문이다. 즉, 다른 작업에 의해 값이 변해도 문제가 없다. 그렇다면 쓰기 작업의 경우 어떨까?    DOP에서는 쓰기 작업에서도 잠금을 사용하는 대신 더 원자라는 단순한 구조를 사용한다. DOP의 쓰기는 사진과 같은 단계를 거치는데 상태가 변경됐는가? 부분에서 원자적으로 비교 후 상태를 반영한다. 이..

도서/기술 2024.12.21