0Pricing
Scala for Backend Engineering & Functional Programming · 강의

실전 매크로

사용 사례를 알아봅니다

실전 매크로은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

실제 세계의 매크로

간단한 예제를 넘어 매크로는 소스 문맥 캡처, 타입 클래스 파생, 리터럴 검증, 반복 코드 없는 코드 생성과 같은 구체적인 문제를 해결합니다.

사용 사례: 메시지를 포함한 assert

매크로는 실패한 조건의 소스 텍스트를 캡처하여 유용한 assertion 메시지를 자동으로 생성할 수 있습니다.

import scala.quoted.*

inline def myAssert(inline cond: Boolean): Unit =
  ${ assertImpl('cond) }

소스 코드 캡처

매크로 내부에서 cond.show(reflect API를 통해 사용)는 표현식의 소스 원문을 반환하며, 이를 오류 메시지에 스플라이스합니다.

import scala.quoted.*

def assertImpl(cond: Expr[Boolean])(using q: Quotes): Expr[Unit] = {
  import q.reflect.*
  val src = Expr(cond.asTerm.show)
  '{ if (!${ cond }) throw new AssertionError("failed: " + ${ src }) }
}

사용 사례: 컴파일 시점 검증

리터럴(예: 정규 표현식이나 포트 번호)을 컴파일 시점에 검증하여 잘못된 값이 실행 시점에 도달하지 않게 합니다.

import scala.quoted.*

inline def port(inline n: Int): Int = ${ portImpl('n) }

잘못된 입력 중단

리터럴을 추출하고 검사한 뒤, 잘못된 값에 대해 report.errorAndAbort를 호출하여 실행 시점의 버그를 컴파일 오류로 바꿉니다.

import scala.quoted.*

def portImpl(n: Expr[Int])(using q: Quotes): Expr[Int] = {
  import q.reflect.*
  val v = n.valueOrAbort
  if (v < 1 || v > 65535) report.errorAndAbort("invalid port")
  n
}

사용 사례: 타입 클래스 파생

매크로는 (대개 inline + scala.deriving.Mirror를 통해) 반복 코드 없이 모든 케이스 클래스에 사용할 JSON 인코더 같은 타입 클래스 인스턴스를 생성할 수 있습니다.

import scala.deriving.Mirror

trait Show[T] { def show(t: T): String }

inline def derived[T](using Mirror.Of[T]): Show[T] = ???

Mirror 사용

Mirror는 컴파일 시점에 product의 필드 타입과 레이블을 노출합니다. inline과 함께 사용하면 필드를 순회하며 인스턴스를 만들 수 있습니다.

import scala.deriving.*
import scala.compiletime.*

inline def labels[T](using m: Mirror.ProductOf[T]): List[String] =
  constValueTuple[m.MirroredElemLabels].toList.map(_.toString)

사용 사례: 위치 정보를 포함한 로깅

매크로는 reflect API에서 Position을 읽어 실행 시점 비용 없이 로그 메시지에 파일과 줄 번호를 추가할 수 있습니다.

import scala.quoted.*

def posImpl(using q: Quotes): Expr[String] = {
  import q.reflect.*
  val p = Position.ofMacroExpansion
  Expr(s"${p.sourceFile.name}:${p.startLine + 1}")
}

매크로를 사용하지 말아야 할 때

매크로는 강력하지만 유지 관리와 디버깅에 비용이 많이 듭니다. 먼저 일반 함수, inline 메서드 또는 given 파생을 사용하세요. 이러한 방법으로 요구 사항을 표현할 수 없을 때만 매크로를 고려하세요.

매크로 테스트

생성된 동작은 일반 코드처럼 테스트하고, 컴파일 시점 테스트 도구의 typeCheckErrors 같은 기능을 사용하여 잘못된 입력이 컴파일에 실패하는지도 테스트하세요.

실행 시점의 대응 예시

컴파일 시점 검증 매크로는 이 독립 실행 가능한 실행 시점 검사와 같은 효과를 내지만, 실패가 실행 시점이 아니라 컴파일 중에 발생합니다.

object Main {
  def port(n: Int): Int = {
    require(n >= 1 && n <= 65535, "invalid port")
    n
  }
  def main(args: Array[String]): Unit = {
    println(port(8080)) // 8080
  }
}

빠른 확인

리터럴을 실행 시점이 아닌 매크로로 검증할 때의 가장 큰 장점은 무엇인가요?

복습

실용적인 매크로 사용 사례를 살펴보았습니다.

  • 소스를 캡처하는 assert
  • errorAndAbort를 사용한 컴파일 시점 검증
  • Mirror를 통한 타입 클래스 파생
  • 위치 정보를 고려한 로깅
  • 매크로를 피해야 할 때와 매크로를 테스트하는 방법

메타프로그래밍 및 매크로 과정을 모두 마쳤습니다.

자주 묻는 질문

“실전 매크로” 강의는 무료인가요?

네 — “실전 매크로” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

“실전 매크로”에서 뭘 배우나요?

사용 사례를 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“실전 매크로” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 인라인 메서드
  2. 매크로 기초
  3. 인용과 스플라이스
  4. 실전 매크로
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기