DSL(Domain Specific Language) 개요
- 도메인 전용 언어 : 특정 비즈니스 도메인의 문제를 해결하려고 만든 언어
- 특정 비지니스의 문제를 어떻게 해결할지에만 집중
- 특정 비지니스의 복잡성을 더 잘 다룰 수 있다. 저수준 구현의 세부사항을 숨기고 사용자가 비지니스 문제에 집중할 수 있게 한다.
DSL의 필요성
- 의사 소통 : 코드(Language)의 의도가 명확히 전달되어야 하며, 프로그래머가 아닌 사람도 이해할 수 있어야 한다.
- 가독성 : 한 번 코드를 구현하지만, 반복적으로 사용하며, 여러 번 코드를 읽는다. 즉, 코드의 가독성이 중요한 비즈니스 로직이다.
DSL 장점
- 간결함
- 가독성
- 유지보수
- 높은 추상화
- 집중(생산성) : 비즈니스 도메인의 규칙을 표현할 목적으로 설계된 언어라서 프로그래머가 특정 코드에 집중할 수 있다. 생산성이 좋아진다.
- 관심사분리 : 비즈니스 관련된 코드가 복잡한(애플리케이션의 구조와 관련된 코드 등) 코드와 분리가 된다. 결과적으로 쉬운 코드를 구현한다.
DSL 단점
- DSL 설계의 어려움
- 개발 비용
- 추가 계층 발생
- 새로 배워야 하는 언어 : 개발팀의 표준 언어가 아닌 다른 개발 언어로 DSL을 구현하는 경우 새로운 언어를 배워야 한다.
Java의 DSL 적용 예)
ForEach
List<String> numbers = Arrays.asList("one","two","three");
numbers.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
@Test
void ForEachLambda1Test() {
numbers.forEach(s -> System.out.println(s));
}
@Test
void ForEachLambda3Test() {
numbers.forEach(System.out::println);
}
Collection Sort
public record Person(int age, String name) {
@Override
public String toString() {
return this.name + " : " + this.age;
}
}
List<Person> persons = Arrays.asList(new Person(45, "Justin")
, new Person(29, "Herry")
, new Person(17, "Suji")
);
public class CollectionsSortSample {
public record Person(int age, String name) {
@Override
public String toString() {
return this.name + " : " + this.age;
}
}
void CollectionsPrint() {
persons.forEach(System.out::println);
}
@Test
void CollectionsSort1() {
Collections.sort(persons, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.age - p2.age;
}
});
CollectionsPrint();
}
@Test
void CollectionsSort2() {
Collections.sort(persons, (p1, p2) -> p1.age - p2.age);
CollectionsPrint();
}
@Test
void CollectionsSort3() {
Collections.sort(persons, Comparator.comparing(p->p.age));
CollectionsPrint();
}
@Test
void CollectionsSort4() {
Collections.sort(persons, Comparator.comparing(Person::age));
CollectionsPrint();
}
@Test
void CollectionsSortWithReverse() {
Collections.sort(persons, Comparator.comparing(Person::age).reversed());
CollectionsPrint();
}
@Test
void CollectionsSortThenComparing() {
Collections.sort(persons, Comparator.comparing(Person::age).thenComparing(Person::name));
CollectionsPrint();
}
}
'프로그래밍 > OOP_Pattern_TDD' 카테고리의 다른 글
PROJECT REACTOR 소개 (0) | 2024.03.29 |
---|---|
Java로 DSL 개발 #2 (0) | 2023.08.09 |
ThreadPool로 초당 API 호출 건수 제한 - ExecutorService (0) | 2023.08.02 |
Flowable.crete 구조 파악 (0) | 2023.07.17 |
RxJava Single 구조 파해치기 (0) | 2023.04.18 |