전체 글 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