Type Providers

Type Providers (타입 프로바이더)

F# 코드를 짜다 보면 외부 데이터의 모양을 코드가 미리 알 수 없어서 곤란할 때가 있어요. 예를 들어 데이터베이스에 어떤 테이블과 컬럼이 있는지, 그 타입이 무엇인지가 컴파일 시점에 드러나지 않으면 문자열 이름과 변환 코드로 우회하게 되죠. 이 문제를 정말 멋지게 해결해 주는 게 바로 타입 프로바이더(Type Provider) 랍니다.

간단히 말해 F# 타입 프로바이더는 프로그램에서 쓸 수 있는 타입·속성·메서드를 제공해 주는 컴포넌트예요. 타입 프로바이더는 이른바 제공 타입(Provided Types) 을 만들어 내는데, 이 타입은 F# 컴파일러가 외부 데이터 소스에 기반해 생성해 줘요. 예를 들어 SQL용 F# 타입 프로바이더를 쓰면 관계형 데이터베이스의 테이블과 컬럼을 나타내는 타입을 생성할 수 있고, 실제로 SQLProvider 가 바로 그렇게 동작해요.

제공 타입은 타입 프로바이더의 입력 파라미터에 의존해요. 그 입력이 될 수 있는 건 JSON 스키마 파일 같은 샘플 데이터 소스, 외부 서비스로 바로 연결되는 URL, 또는 데이터 소스의 연결 문자열이에요. 또 타입 프로바이더는 타입 묶음이 요청 시에만(on demand) 확장되도록 보장할 수 있는데, 다시 말해 프로그램이 실제로 그 타입을 참조할 때 비로소 확장된다는 뜻이에요. 덕분에 온라인 데이터 마켓처럼 아주 큰 정보 공간도 강타입(strongly typed) 방식으로 직접·즉시 통합할 수 있어요.

출처: Type Providers - F# | Microsoft Learn

본문

생성형 vs 지워지는 타입 프로바이더 (Generative vs Erased)

타입 프로바이더는 두 가지 형태로 나뉘어요. Generative(생성형) 프로바이더와 Erased(지워지는) 프로바이더예요.

Generative 타입 프로바이더는 만들어 낸 타입을 .NET 타입으로서 그 타입이 만들어진 어셈블리에 기록할 수 있어요. 그 덕분에 다른 어셈블리의 코드에서도 그 타입을 사용할 수 있죠. 단, 이 경우 데이터 소스의 타입 표현은 .NET 타입으로 나타낼 수 있어야 하므로, 주로 현실적으로 표현 가능한 범위의 데이터에 적합해요.

반면 Erased 타입 프로바이더는 만든 타입을 그 타입이 만들어진 어셈블리나 프로젝트 안에서만 사용할 수 있어요. 이 타입은 일시적(ephemeral)이라 어셈블리에 기록되지 않고 다른 어셈블리의 코드가 사용할 수도 없어요. 대신 지연 멤버(delayed members) 를 담을 수 있어서, 잠재적으로 무한한 정보 공간에서도 제공 타입을 쓸 수 있게 해 줘요. 크고 서로 얽혀 있는 데이터 소스의 작은 일부만 쓰고 싶을 때 특히 유용해요.

자주 쓰이는 타입 프로바이더

용도별로 널리 쓰이는 라이브러리를 잠깐 훑어볼게요.

  • FSharp.DataJSON, XML, CSV, HTML 문서 형식과 리소스를 위한 타입 프로바이더가 들어 있어요.
  • SQLProvider — 객체 매핑과 F# LINQ 쿼리를 통해 관계형 데이터베이스에 강타입으로 접근하게 해 줘요.
  • FSharp.Data.SqlClient — F# 안에서 컴파일 시점에 검사되는 T-SQL 임베딩을 위한 타입 프로바이더 묶음이에요.
  • Azure Storage 타입 프로바이더 — Azure Blobs, Tables, Queues용 타입을 제공해서, 프로그램 곳곳에서 리소스 이름을 문자열로 지정하지 않고도 접근할 수 있게 해 줘요.
  • FSharp.Data.GraphQL — URL로 지정한 GraphQL 서버에 기반해 타입을 제공하는 GraphQLProvider 가 들어 있어요.

물론 필요하다면 직접 커스텀 타입 프로바이더를 만들거나, 다른 사람이 만들어 둔 타입 프로바이더를 참조할 수도 있어요. 가령 조직에 스키마가 안정적으로 유지되는 이름 붙은 데이터 세트를 아주 많이 제공하는 데이터 서비스가 있다고 해 볼게요. 그런 상황이라면 스키마를 읽어서 최신 데이터 세트를 강타입으로 프로그래머에게 보여 주는 타입 프로바이더를 만들어 쓰는 걸 선택할 수 있어요.

더 알아보기