window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster가 이미 존재합니다') } else { w.LeadBooster = { q: [], on: 함수 (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: 함수 (n) { this.q.push({ t: 't', n: n }) }, } } })() 루비 도메인별 언어 - The Codest
The Codest
  • 회사 소개
  • 서비스
    • 소프트웨어 개발
      • 프론트엔드 개발
      • 백엔드 개발
    • Staff Augmentation
      • 프론트엔드 개발자
      • 백엔드 개발자
      • 데이터 엔지니어
      • 클라우드 엔지니어
      • QA 엔지니어
      • 기타
    • IT 자문
      • 감사 및 컨설팅
  • 산업 분야
    • 핀테크 및 뱅킹
    • E-commerce
    • 애드테크
    • 헬스 테크
    • 제조
    • 물류
    • 자동차
    • IOT
  • 가치
    • CEO
    • CTO
    • 배달 관리자
  • 우리 팀
  • Case Studies
  • 방법 알아보기
    • 블로그
    • 모임
    • 웹 세미나
    • 리소스
채용 정보 연락하기
  • 회사 소개
  • 서비스
    • 소프트웨어 개발
      • 프론트엔드 개발
      • 백엔드 개발
    • Staff Augmentation
      • 프론트엔드 개발자
      • 백엔드 개발자
      • 데이터 엔지니어
      • 클라우드 엔지니어
      • QA 엔지니어
      • 기타
    • IT 자문
      • 감사 및 컨설팅
  • 가치
    • CEO
    • CTO
    • 배달 관리자
  • 우리 팀
  • Case Studies
  • 방법 알아보기
    • 블로그
    • 모임
    • 웹 세미나
    • 리소스
채용 정보 연락하기
뒤로 화살표 뒤로 가기
2018-12-14
소프트웨어 개발

루비 도메인별 언어

바르틀로미예 마지아르즈

정의를 참조하면 DSL(도메인 특정 언어)은 특정 애플리케이션 도메인에 특화된 컴퓨터 언어입니다. 즉, 특정 요구 사항을 충족하기 위해 개발되었습니다.

이 글을 읽으면 DSL이 무엇이며 루비와 어떤 공통점이 있는지 알게 될 것입니다.

DSL, 환영합니다!

정의를 참조하면 DSL(도메인 특정 언어)은 특정 애플리케이션 도메인에 특화된 컴퓨터 언어입니다. 즉, 특정 요구 사항을 충족하기 위해 개발되었습니다. DSL에는 두 가지 유형이 있습니다:

  • An 외부 자체 구문 분석기가 필요한 DSL. 잘 알려진 예로 SQL 언어를 들 수 있는데, 이 언어를 사용하면 데이터베이스가 생성되지 않은 언어로 데이터베이스와 상호 작용할 수 있습니다.

  • An 내부 자체 구문이 없는 대신 특정 프로그래밍 언어의 구문을 사용하는 DSL입니다.

짐작할 수 있듯이 두 번째 DSL 유형에 계속 집중할 것입니다.

어떤 기능을 하나요?

기본적으로 루비 메타프로그래밍을 활용하면 자신만의 미니 언어를 만들 수 있습니다. 메타프로그래밍은 프로그래밍 기법입니다. 코드 런타임에 동적으로(즉석에서) 설정할 수 있습니다. 잘 모르실 수도 있지만, 여러분은 매일 다양한 DSL을 사용하고 있을 것입니다. DSL의 기능을 이해하기 위해 아래의 몇 가지 예를 살펴보겠습니다. 이 모든 예에는 공통된 요소가 하나씩 있는데, 이를 가리킬 수 있을까요?

레일 라우팅

Rails.application.routes.draw do
루트로 'home#index'

resources :users do
get :search, on: :collection
end
end
```

Rails를 사용해 본 사람이라면 누구나 알고 있습니다. config/routes.rb 파일에서 애플리케이션 경로를 정의합니다(HTTP 동사와 URL을 컨트롤러 동작에 매핑). 하지만 어떻게 작동하는지 궁금한 적이 있으신가요? 사실 루비 코드일 뿐입니다.

팩토리 봇

 FactoryBot.define do
   factory :사용자 do
     company
     sequence(:email) { |i| "user_#{i}@test.com" }
     sequence(:first_name) { |i| "사용자 #{i}" }
     last_name 'Test'
     role 'manager'
   end
 end

테스트를 작성하려면 종종 객체를 제작해야 합니다. 따라서 시간 낭비를 피하려면 프로세스를 최대한 단순화하는 것이 좋습니다. 이것이 바로 FactoryBot 는 기억하기 쉬운 키워드와 사물을 설명하는 방법을 제공합니다.

시나트라

'sinatra/base' 필요

클래스 WebApplication < Sinatra::Base
get '/' do
'Hello world'
end
end
```

시나트라 는 웹 애플리케이션을 처음부터 만들 수 있는 프레임워크입니다. 요청 방법, 경로, 응답을 더 쉽게 정의할 수 있을까요?

다른 DSL 예는 다음과 같습니다. 레이크, RSpec 또는 활성 레코드. 각 DSL의 핵심 요소는 블록 사용.

구축 시간

이제 후드 아래에 무엇이 숨어 있는지, 그리고 구현이 어떤 모습일 수 있는지 이해할 차례입니다.

다양한 제품에 대한 데이터를 저장하는 애플리케이션이 있다고 가정해 봅시다. 사용자 정의 파일에서 데이터를 가져올 수 있는 기능을 추가하여 애플리케이션을 확장하고 싶습니다. 또한 필요한 경우 파일에서 값을 동적으로 계산할 수 있어야 합니다. 이를 위해 DSL을 만들기로 결정했습니다.

간단한 제품 표현은 다음과 같은 속성을 가질 수 있습니다(product.rb):

클래스 제품
   attr_accessor :이름, :설명, :가격
 end

실제 데이터베이스를 사용하는 대신 작업을 시뮬레이션할 것입니다(fake_products_database.rb):

 클래스 FakeProductsDatabase
   def self.store(product)
     puts [product.name, product.description, product.price].join(' - ')
   end
 end

이제 제품 데이터가 포함된 파일을 읽고 처리하는 클래스를 만들겠습니다(dsl/data_importer.rb):

모듈 Dsl
데이터 임포터 클래스
모듈 구문
def add_product(&block)
FakeProductsDatabase.store product(&block)
end

  private

  def product(&block)
    ProductBuilder.new.tap { |b| b.instance_eval(&block) }.product
  end
end

포함 구문

def self.import_data(file_path)
  new.instance_eval File.read(file_path)
end

end
end
```

클래스에는 다음과 같은 메서드가 있습니다. import_data 인자로 파일 경로를 기대합니다. 파일이 읽혀지고 그 결과가 인스턴스_평가 메서드가 클래스 인스턴스에서 호출됩니다. 어떤 기능을 하나요? 인스턴스 컨텍스트 내에서 문자열을 루비 코드로 평가합니다. 이는 다음을 의미합니다. self 의 인스턴스가 될 것입니다. 데이터 임포터 클래스. 원하는 구문/키워드를 정의할 수 있기 때문입니다(가독성을 높이기 위해 구문은 모듈로 정의됩니다). 언제 add_product 메서드가 호출되면 메서드에 주어진 블록은 다음과 같이 평가됩니다. 제품 빌더 인스턴스를 빌드하는 제품 인스턴스입니다. 제품 빌더 클래스는 아래에 설명되어 있습니다(dsl/product_builder.rb):

모듈 Dsl
제품 빌더 클래스
속성 = %i[이름 설명 가격].freeze

ATTR_READER :제품

def initialize
  @product = Product.new
end

ATTRIBUTES.each do |attribute|
  define_method(attribute) do |arg = nil, &block|
    value = block.is_a?(Proc) ? block.call : arg
    product.public_send("#{attribute}=", value)
  end
end

end
end
```

이 클래스는 다음과 같이 허용되는 구문을 정의합니다. add_product 블록을 추가합니다. 약간의 메타프로그래밍을 통해 제품 속성에 값을 할당하는 메서드를 추가할 수 있습니다. 이러한 메서드는 직접 값 대신 블록을 전달하는 것도 지원하므로 런타임에 값을 계산할 수 있습니다. 속성 판독기를 사용하면 마지막에 빌드된 제품을 얻을 수 있습니다.

이제 가져오기 스크립트(import_job.rb):

필수 'dsl/데이터임포터' 요구사항
필수 'dsl/productbuilder'
리퀘이러티브 '가짜제품데이터베이스'
필수 '제품'

Dsl::DataImporter.import_data(ARGV[0])
```

마지막으로 DSL을 사용하여 제품 데이터가 포함된 파일(dataset.rb)을 가져옵니다:

```ruby
add_product do
name '충전기'
설명 '생명을 구하는'
가격 19.99
end

add_product do
name '자동차 전복'
description { "#{Time.now.strftime('%F %T')}에서 전복됨" }
price 0.01
end

add_product do
name 'Lockpick'
설명 '문은 닫히지 않습니다'
price 7.50
end
```

데이터를 가져오려면 명령어 하나만 실행하면 됩니다:

 ruby import_job.rb dataset.rb

그 결과는...

충전기 - 인명 구조 - 19.99
 자동차 난파 - 2018-12-09 09:47:42에 난파 - 0.01
 자물쇠 따기 - 문이 닫히지 않음 - 7.5

..성공!

결론

위의 모든 예시를 보면 DSL이 제공하는 가능성을 어렵지 않게 알 수 있습니다. DSL을 사용하면 필요한 모든 로직을 숨기고 가장 중요한 키워드만 사용자에게 노출함으로써 일부 일상적인 작업을 단순화할 수 있습니다. 이를 통해 더 높은 수준의 추상화를 달성할 수 있고 유연한 사용 가능성(재사용성 측면에서 특히 가치 있는 기능)을 제공합니다. 반면에 DSL을 추가하면 프로젝트 메타프로그래밍을 사용한 구현은 확실히 이해하고 유지 관리하기가 훨씬 더 어렵습니다. 또한 동적이기 때문에 견고한 테스트 스위트가 필요합니다. DSL을 문서화하면 더 쉽게 이해할 수 있으므로 반드시 문서화할 가치가 있습니다. 자신만의 DSL을 구현하는 것은 보람된 일이지만 반드시 보상을 받아야 한다는 점을 기억하는 것이 좋습니다.

이 주제에 관심이 있으신가요? 그렇다면 알려주세요 - 최근 프로젝트 중 하나에서 요구 사항을 충족하기 위해 만든 DSL에 대해 알려드리겠습니다.

관련 문서

소프트웨어 개발

미래 지향적인 웹 앱 구축: The Codest의 전문가 팀이 제공하는 인사이트

The Codest가 최첨단 기술로 확장 가능한 대화형 웹 애플리케이션을 제작하고 모든 플랫폼에서 원활한 사용자 경험을 제공하는 데 탁월한 성능을 발휘하는 방법을 알아보세요. Adobe의 전문성이 어떻게 디지털 혁신과 비즈니스를 촉진하는지 알아보세요...

최신
소프트웨어 개발

라트비아에 본사를 둔 10대 소프트웨어 개발 기업

최신 기사에서 라트비아 최고의 소프트웨어 개발 기업과 그들의 혁신적인 솔루션에 대해 알아보세요. 이러한 기술 리더들이 어떻게 귀사의 비즈니스를 향상시키는 데 도움을 줄 수 있는지 알아보세요.

thecodest
엔터프라이즈 및 스케일업 솔루션

Java 소프트웨어 개발 필수 사항: 성공적인 아웃소싱을 위한 가이드

The Codest로 효율성을 높이고 전문 지식을 활용하며 프로젝트 성공을 이끌 수 있는 성공적인 outsourcing Java 소프트웨어 개발에 대한 이 필수 가이드를 살펴보세요.

thecodest
소프트웨어 개발

폴란드 아웃소싱을 위한 최고의 가이드

폴란드에서 outsourcing가 급증한 것은 경제, 교육, 기술 발전으로 인한 IT 성장과 비즈니스 친화적인 환경이 조성된 덕분입니다.

더코데스트
엔터프라이즈 및 스케일업 솔루션

IT 감사 도구 및 기술에 대한 완벽한 가이드

IT 감사는 안전하고 효율적이며 규정을 준수하는 시스템을 보장합니다. 전체 기사를 읽고 그 중요성에 대해 자세히 알아보세요.

The Codest
야쿱 야쿠보비치 CTO & 공동 설립자

지식창고를 구독하고 IT 분야의 전문 지식을 최신 상태로 유지하세요.

    회사 소개

    The Codest - 폴란드에 기술 허브를 둔 국제 소프트웨어 개발 회사입니다.

    영국 - 본사

    • 사무실 303B, 182-184 하이 스트리트 노스 E6 2JA
      영국 런던

    폴란드 - 현지 기술 허브

    • 파브리츠나 오피스 파크, 알레야
      포코주 18, 31-564 크라쿠프
    • 뇌 대사관, 콘스트럭터스카
      11, 02-673 바르샤바, 폴란드

      The Codest

    • 홈
    • 회사 소개
    • 서비스
    • Case Studies
    • 방법 알아보기
    • 채용 정보
    • 사전

      서비스

    • IT 자문
    • 소프트웨어 개발
    • 백엔드 개발
    • 프론트엔드 개발
    • Staff Augmentation
    • 백엔드 개발자
    • 클라우드 엔지니어
    • 데이터 엔지니어
    • 기타
    • QA 엔지니어

      리소스

    • 외부 소프트웨어 개발 파트너와의 협력에 대한 사실과 오해
    • 미국에서 유럽으로: 미국 스타트업이 유럽으로 이전을 결정하는 이유
    • 테크 오프쇼어 개발 허브 비교: 테크 오프쇼어 유럽(폴란드), 아세안(필리핀), 유라시아(터키)
    • CTO와 CIO의 주요 과제는 무엇인가요?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • 웹사이트 이용 약관

    저작권 © 2025 by The Codest. 모든 권리 보유.

    ko_KRKorean
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek ko_KRKorean