Justin의 개발 로그

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();
    }

}
profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!