• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

DSL 만들기

24.04.04 15:12 작성 조회수 98

0

안녕하세요 강사님. 내용을 몇번 더 봐야 더 잘 알겠지만

막히는 부분이 있어서 질문올립니다.

 

18강 내용중에서

service(name = "db") {
image { "mysql" }
env("USER").`is`("myuser")
env("PASSWORD").`is`("mypassword")
port(host = 9999, container = 3306)
}

 

env("USER").`is`("myuser") 이 DSL은 어떻게 만들수 있을지 감이 오지 않습니다. ㅜㅜ

답변 1

답변을 작성해보세요.

2

안녕하세요 혜민님! 🙂 좋은 질문 감사드려요!!!

하나씩 설명 드려볼게요! 👍

 

먼저 env().`is`() 를 뜯어보면, env() 라는 함수를 호출한 이후, 곧 바로 is() 라는 함수를 연이어 호출한 모양입니다! 간단하죠?! 그럼 다음과 같이 코드를 작성할 수 있을거에요!

data class Environment(
  val key: String,
  val value: String?
) {
  fun `is`(value: String): Environment {
    this.value = value
    return this
  }
}

fun env(key: String): Environment() {
  return Environment(key, null)
}

여기서 is 라는 함수를 쓸 때 백틱 ` 을 붙이는 이유는, 코틀린에서 is 라는 별도의 예약어가 있기 때문입니다! 👍

 

위의 코드를 사용해보면요!

env("USER")

까지 했을 때 Environment 클래스가 USER 라는 문자열이 key에 들어가 생성되고

 

env("USER").`is`("PASSWORD")

is 라는 함수를 호출까지 하면, value에 "PASSWORD"라는 문자열이 들어간 후 최종적으로 Environment 클래스가 완성되게 됩니다!

 

물론 is 함수를 클래스 안에 넣으셔도 되고, 코틀린의 확장 함수를 사용하셔도 될 것 같아요~ 👍

 

이 DSL 이란 부분 자체가 코틀린의 문법을 요렇게 저렇게 막 돌려 활용하다 보니, 완성된 DSL만 봤을 때는 어렵게 느껴질 수 있어요! 🥺 이럴 때는 정말 단계별로 하나씩! 문법적인 내용과 코드를 함께 보시면 이해가 훨씬 쉬위실 겁니다~~~

 

답변이 도움이 되었으면 좋겠습니다. 감사합니다!! 🙏