실전 매크로
사용 사례를 알아봅니다
실전 매크로은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.