모던 자바 인 액션 10장 : 람다를 이용한 도메인 전용 언어

Adam·2024년 7월 3일
0

모던 자바 인 액션

목록 보기
10/20
post-thumbnail

도메인 전용 언어

DSL: 비즈니스 도메인의 문제를 해결하려고 만든 언어

다른 문제는 걱정할 필요가 없고 오직 자신 앞에 놓인 문제를 어떻게 해결할지 집중

특정 도메인의 복잡성을 더 잘 다룰 수 있다

개발자와 도메인 전문가 사이의 간격을 좁힌다

DSL 개발 고려 사항

  1. 의사 소통의 왕: 프로그래머가 아닌 사람도 이해할 수 있어야 한다
  2. 한 번 코드를 구현하지만 여러 번 읽는다: 가독성이 뛰어나게 코드를 구현해야 한다

장점

  • 간결함: 캡슐화를 통해 반복을 피하고 코드를 간결하게 만들 수 있다
  • 가독성: 비 도메인 전문가도 코드를 쉽게 이해 가능, 공유하기 쉬워진다
  • 유지보수: 쉽게 유지보수가 가능
  • 높은 수준의 추상화: 추상화 수준에서 동작하기 때문에 도메인의 문제와 직접적으로 관련되지 않은 세부 사항을 숨긴다
  • 집중: 프로그래머가 특정 코드에 집중할 수 있게하여 생산성이 좋아진다
  • 관심사 분리: 애플리케이션의 인프라구조와 관련된 문제와 독립적으로 비즈니스 관련된 코드에 집중하기 용이

단점

  • DSL 설계의 어려움: 제한적인 언어에 도메인 지식을 담는 것은 어렵다
  • 개발 비용: 코드에 DSL을 추가하는 작업은 비용이 크다
  • 추가 우회 계층: DSL은 추가적인 계층으로 도메인 모델을 감싸며 이 때 계층을 최대한 작게 만들어 성능 문제를 회피
  • 새로 배워야 하는 언어: DSL을 프로젝트에 추가하면 팀이 배워야 하는 언어가 한 개 더 늘어난다
  • 호스팅 언어 한계: 프로그래밍 언어가 장황하고 엄격한 문법을 가졌다면 사용자 친화적인 DSL을 만들기 힘들다

내부 DSL

자바로 DSL을 구현하면 다음과 같은 장점이 있다

  • 새로운 패턴과 기술을 배워 DSL을 구현하는 노력이 감소
  • 나머지 코드와 함께 DSL을 컴파일해 비용 감소
  • 새로운 언어를 배울 필요가 없어진다

다중 DSL

Ruby, Kotlin 같이 JVM에서 실행되나 자바보다 더 새로운 언어로 DSL을 구현하는 것

장점

  • 가독성이 자바보다 뛰어날 수 있다

단점

  • 새 언어를 배워야 한다
  • 두 개 이상의 언어가 혼재하므로 여러 컴파일러로 소스를 빌드하도록 빌드 과정을 개선
  • 자바와 호환성이 완벽하지 않을 수 도 있다

외부 DSL

자신만의 문법과 구문으로 새 언어를 설계하는 것

장점

  • 무한한 유연성
  • 자바로 개발된 인프라구조 코드와 외부 DSL로 구현한 비즈니스 코드가 명확하게 분리

최신 자바 API의 작은 DSL

람다와 메소드 참조를 이용한 DSL은 가독성, 재사용성, 결합성이 높다

Stream

리스트를 조작하는 DSL

Collectors

데이터 수집을 수행하는 DSL

자바로 DSL을 만드는 패턴과 기법

매서드 체인

장점: 정적 메서드 사용을 최소화하고 가독성을 개선

단점: 빌더를 구현해야 한다

중첩된 함수 이용

장점: 도메인 객체 계층 구조에 그대로 반영

단점

  • 괄호가 많아진다
  • 인수 목록을 정적 메서드에 넘겨줘야 한다
  • 여러 메서드 오바라이드를 구현해아 한다
  • 인수의 의미가 이름이 아니라 위치에 의해 정의

람다 표현식을 이요한 함수 시퀀싱

람다 표현식을 받아 실행해 도메인 모델을 만들어 내는 여러 빌더를 구현해야 한다

빌더는 체인 패턴을 이용해 만들려는 객체의 중간 상태를 유지해야 한다

장점

  • 메서드 체인 패턴처럼 플루언트 방식으로 정의 가능
  • 중첩 함수 형식처럼 객체의 계층 구조를 유지

단점

  • 많은 설정 코드가 필요
  • 자바8 람다 표현식 문법에 의한 잡음의 영향을 많이 받는다

다양한 DSL 패턴을 조합

장점: 가독성이 높아질 수 있다

단점: DSL을 배우는데 시간이 한개의 패턴을 사용하는 것보다 길 수 있다

DSL에 메서드 참조 사용

장점: 코드의 의도가 명확하다

단점

  • 코드가 장황
  • 확장성 제한적

실생활의 자바8 DSL

  1. jooq: SQL을 조작하는데 가독성 높인다
  2. 큐컴버
  • 동작 주도 개발에서 명령문을 실행할 수 있는 테스트 케이스로 변환
  • Given(전제 조건 정의), When(시험하려는 도메인 객체의 실질 호출), Then(테스트 케이스의 결과를 확인하는 어설션)으로 구분
  1. 스프링 통합
  • 채널, 엔드포인트, 폴러, 채널 인터셉터 등 메세지 기반의 애플리케이션에 필요한 가장 공통 패턴을 모두 구현
  • 가독성이 높아지도록 엔드포인트는 DSL에서 동사로 구현하며 여러 엔드포인트를 한 개 이상의 메세지 흐름으로 조합해서 통합 과정이 구성
  • 메서드 체인 패턴을 자주 사용
profile
Keep going하는 개발자

0개의 댓글