Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[모던 자바 인 액션] 5주차 #7

Open
so3500 opened this issue Jul 21, 2023 · 1 comment
Open

[모던 자바 인 액션] 5주차 #7

so3500 opened this issue Jul 21, 2023 · 1 comment
Assignees
Labels
SummerCoding 땅울림 여름코딩 스터디 모던 자바 인 액션

Comments

@so3500
Copy link
Contributor

so3500 commented Jul 21, 2023

스터디 날짜

2023.07.28 금 9:00-10:00

내용

챕터9. 리팩터링, 테스팅, 디버깅
챕터10. 람다를 이용한 도메인 전용 언어

공유

최승위

이성온

정민교

@so3500 so3500 added SummerCoding 땅울림 여름코딩 스터디 모던 자바 인 액션 labels Jul 21, 2023
@jeongminkyo
Copy link

jeongminkyo commented Jul 27, 2023

DSL(Domain-specific Languages, 도메인 전용 언어)

DSL(Domain-specific Languages, 도메인 전용 언어)란?

DSL은 특정 비즈니스 도메인의 문제를 해결하려고 만든, 작은, 범용이 아닌 특정 도메인을 대상으로 만들어진 특수 프로그래밍 언어다.

DSL에서 동작과 용어는 특정 도메인에 국한되므로 다른 문제는 걱정할 필요가 없어서 특정 도메인의 복잡성을 더 잘 다룰 수 있고, 저수준 구현 메서드는 클래스의 비공개로 만들어서 저수준 구현 세부 내용은 숨길 수 있어서 가독성이 좋아진다.

DSL을 개발할 때는 아래 내용을 항상 생각해야 한다.

  1. 코드의 의도가 명확히 전달되어야 하며, 개발자가 아닌 사람도 이해할 수 있어야 하고, 비지니스 요구사항에 부합하는지 확인한다.
  2. 가독성은 유지보수의 핵심이다. 즉 항상 동료가 쉽게 이해할 수 있도록 코드를 구현해야 한다.

DSL의 장점과 단점

장점

간결함

API는 비지니스 로직을 간편하게 캡슐화하므로 반복을 피할 수 있고 코드를 간결하게 만들 수 있다.

가독성

도메인 영역의 용어를 사용하므로 비 도메인 전문가도 코드를 쉽게 이해할 수 있다.

결과적으로 다양한 조직 구성원 간에 코드와 도메인 영역이 공유될 수 있다.

유지보수

잘 설계된 DSL로 구현한 코드는 쉽게 유지 보수할 수 있다.

유지보수는 비지니스 관련 코드 즉 가장 빈번히 바뀌는 애플리케이션 부분에 특히 중요하다.

높은 수준의 추상화

DSL은 도메인과 같은 추상화 수준에서 동작하므로 도메인의 문제와 직접적으로 관련되지 않은 세부 사항을 숨긴다.

집중

비지니스 도메인의 규칙을 표현할 목적으로 설계된 언어이므로 프로그래머가 특정 코드에 집중할 수 있어 결과적으로 생산성이 좋아진다.

관심사 분리

애플리케이션의 인프라구조와 관련된 문제와 독립적으로 비지니스 관련된 코드에서 집중하기가 용이해 결과적으로 유지보수가 쉬운 코드를 구현한다.

단점

DSL 설계의 어려움

간결하게 제한적인 언어에 도메인 지식을 담는 것이 쉬운 작업은 아니다.

개발 비용

코드에 DSL을 추가하는 작업은 초기 프로젝트에 많은 비용과 시간이 소모되는 작업이다.

또한 DSL 유지보수와 변경은 프로젝트에 부담을 주는 요소다.

추가 우회 계층

DSL은 추가적인 계층으로 도메인 모델을 감싸며 이때 계층을 최대한 작게 만들어 성능 문제를 회피한다.

새로 배워야 하는 언어

요즘에는 한 프로젝트에 여러 언어를 사용하는 추세다.

하지만 DSL을 프로젝트에 추가하면서 배워야 하는 언어가 한 개 더 늘어난다는 부담이 있다.

여러 비지니스 도메인을 다루는 개별 DSL을 사용하는 상황이라면 개별 DSL이 독립적으로 진화할 수 있기 때문에 유기적으로 동작하도록 합치는 일은 쉬운 일이 아니다. 

호스팅 언어 한계

일부 자바 같은 범용 프로그래밍 언어는 장황하고 엄격한 문법을 가졌다.

이런 언어로는 사용자 친화적 DSL을 만들기 힘들다. 사실 장황한 프로그래밍 언어를 기반으로 만든 DSL은 성가진 문법의 제약을 받고 읽기가 어려워진다. Java8의 람다 표현식은 이 문제를 해결할 강력한 새 도구다.

내부 DSL

  • 호스트 언어( 현재 사용할 프로그래밍 언어 )로 DSL을 구성한다는 의미. 호스트 언어 구문을 이용하여 자체적으로 의존하는 무언가를 만드는 경우에 해당된다.

장점

  1. 기존 자바 언어를 이용하면 외부 DSL에 비해 새로운 패턴과 기술을 배워 DSL을 구현하는 노력이 현저하게 줄어든다.

  2. 순수 자바로 DSL을 구현하면 나머지 코드와 함께 DSL을 컴파일할 수 있다. 따라서 다른 언어의 컴파일러를 이용할 필요없음(비용절감)

  3. 다른 언어가 필요없음

  4. DSL 사용자는 기존의 자바 IDE를 이용해 자동완성 자동 리팩터링 같은 기능을 그대로 사용하며 사용할 수 있음.

  5. 한개의 언어로 한개의 도메인 또는 여러 도메인을 대응하지 못할때 java를 이용하여 DSL 설계할 경우 DSL 합치기가 쉬움

외부 DSL

  • 호스트 언어와는 독립적인으로 자체적인 문법을 가짐. 자신만의 문법과 구문으로 새 언어를 설계해야 함.

장점

  1. 무한한 유연성. 제대로 언어를 설계하면 비지니스 문제를 묘사하고 해결하는 가독성 좋은 언어를 얻을 수 있다. 자바로 개발된 인프라구조 코드와 외부 DSL로 구현한 비즈니스 코드를 명확하게 분리할 수 있음.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
SummerCoding 땅울림 여름코딩 스터디 모던 자바 인 액션
Projects
None yet
Development

No branches or pull requests

3 participants