# Maguyva의 Scala 지원: JVM 서비스와 Spark를 위한 코드 그래프

Canonical source: https://maguyva.ai/ko/languages/scala

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Maguyva는 AST, 심볼, 그래프로 Scala를 지원하여, AI 에이전트가 JVM과 Spark 코드 전반에서 트레이트, 객체, 케이스 클래스, 타입이 있는 호출을 따라갈 수 있게 합니다.

## 지원 현황 요약

- 등급: AST 및 심볼 지원
- 프로그래밍
- 확장자: .sc, .scala
- 구문 인식 검색과 구조적 컨텍스트를 위한 실제 AST 파싱을 제공합니다.
- 이름이 지정된 심볼은 시맨틱 조회와 상호 참조에 활용됩니다. 관계 추출이 활성화된 경우 그래프 내비게이션을 사용할 수 있습니다.
- 이 언어는 그래프 인식 검색에 심볼과 관계를 제공합니다. 지원되는 에지 유형은 언어 고유의 구문 구조에 따라 다릅니다.
- AST 파싱과 심볼 추출을 모두 지원합니다.

## 가장 적합한 경우

- 트레이트, 동반 객체, 케이스 클래스가 하나의 개념을 여러 파일에 나누어 담는, Scala로 작성된 JVM 서비스.
- 에이전트가 호출하는 공유 라이브러리와 함께 읽어야 하는 Spark 및 데이터 엔지니어링 작업.
- 에이전트가 하나의 코드베이스로 검색해야 하는 Scala와 Java 혼합 저장소.

## 에이전트 워크플로

- 서비스 메서드의 시그니처를 바꾸기 전에 모든 호출자를 찾습니다.
- 추상 멤버를 추가하기 전에 트레이트를 확장하는 클래스와 객체를 나열합니다.
- 요청이 HTTP 라우트에서 서비스를 거쳐 데이터 계층까지 이동하는 과정을 추적합니다.

## Scala가 얕은 AI 도구를 넘어뜨리는 지점

Scala에서는 이름 하나가 많은 것을 담습니다. 트레이트, 그 동반 객체, 케이스 클래스가 하나의 개념을 공유할 수 있습니다. 패턴 매칭은 `case` 절 안에서 새 이름을 바인딩하고, 클래스 안에서 리시버 없이 호출된 메서드는 `this`에 대한 호출입니다. 한 번에 파일 하나씩 읽는 에이전트는 이름은 봐도 그것이 무엇으로 해석되는지는 보지 못합니다.

Maguyva는 인덱싱 시점에 그중 더 많은 부분을 해석하므로, 에이전트가 메서드의 호출자를 물으면 바로 행동으로 옮길 수 있는 답을 얻습니다.

## Maguyva가 Scala에서 추출하는 것

Maguyva는 `.scala`와 `.sc` 파일을 지원합니다. 클래스, 객체, 트레이트는 타입으로 추출되고, `structural_search`의 `functions` 프리셋은 `def` 선언과 정의, 그리고 람다를 다룹니다. 시그니처에는 반복(`*`) 매개변수가 기록되고, 임포트에서는 `_root_` 접두사가 제거됩니다.

호출 관계는 클래스로 한정된 이름을 유지하며, 클래스 안에서 리시버 없이 호출하면 그 클래스 자신의 메서드로 해석됩니다. 리시버 타입 추론은 매개변수, 클래스 매개변수, `val`와 `var` 정의, `case` 절 안의 타입 패턴과 케이스 클래스 패턴, 클래스, 객체, 트레이트에 있는 메서드의 반환 타입, 타입 별칭, 그리고 `extends` 절을 따라갑니다. 대문자로 시작하는 타입에 대한 `new`는 인스턴스화로 계산됩니다.

Scala에서는 적용 대상 아님으로 표시된 관계 유형이 없으므로, 그래프에는 상속, 오버라이드, 타입 참조, 읽기와 쓰기, 제어 흐름, 예외 엣지도 기록됩니다.

## 에이전트 프롬프트 예시

- "`PaymentService.capture`를 누가 호출하고, 어떤 라우트에서 호출하나요?" (`find_symbol`, 그다음 `dependency_search` incoming)
- "`EventHandler`를 확장하는 클래스와 객체는 무엇인가요?" (`dependency_search`)
- "주문 이벤트가 원장 기록기까지 어떻게 이어지는지 추적해 줘." (`get_task_context`)

## 알려진 한계

- 약 320개의 표준 라이브러리 이름이 관계에서 걸러집니다. `map`, `flatMap`, `foldLeft` 같은 컬렉션 연산과 `Option`, `Either`, `Try`, `Future`, `Predef` 헬퍼입니다. `this`에 대한 호출이나, 타입이 여러분의 클래스로 해석되는 값에 대한 호출은 이름이 목록에 있어도 유지됩니다. 그래도 호출자가 빠진 것처럼 보이면 `text_pattern_search`를 사용하세요.
- `A`, `F`, `CC` 같은 짧은 타입 매개변수와 `Any`, `Unit`, `Nothing` 같은 루트 타입은 타입 참조에서 걸러집니다.

## 다음 단계

[빠른 시작](/ko/docs/quickstart)으로 저장소를 연결한 다음, [호환성 페이지](/ko/docs/compatibility)에서 지원 매트릭스를 확인하세요. JVM 혼합 코드베이스라면 [Java 가이드](/ko/languages/java)와 [Kotlin 가이드](/ko/languages/kotlin)도 읽어 보세요.

## 엔진 세부 정보

- Scala 지원은 `.scala`와 `.sc`를 다룹니다. 클래스, 객체, 트레이트는 타입이며, 클래스 안에서 리시버 없이 호출하면 그 클래스 자신의 메서드로 해석됩니다.
- 리시버 타입 추론은 매개변수, 클래스 매개변수, `val`과 `var` 정의, `case` 패턴, 메서드 반환 타입, `extends` 절을 따라갑니다.
- 호출은 클래스로 한정된 이름을 유지하고, `new`는 인스턴스화로 계산되며, 약 320개의 표준 라이브러리 이름은 관계에서 걸러집니다.

## 유용한 MCP 진입점

- `find_symbol`: 트레이트, 객체, 서비스 메서드의 정의와 참조가 필요할 때 사용하세요.
- `dependency_search`: 시그니처를 바꾸기 전에 트레이트나 메서드에 incoming 탐색을 사용해 구현체와 호출자를 확인하세요.
- `get_task_context`: "주문 이벤트가 원장 기록기까지 어떻게 이어지는지 추적해 줘" 같은 프롬프트에 사용하세요.
