File-based App에서 Maven/JAR 가져와서 사용하기

코드 샘플 보기: awesome-dotnet-fba/015-ikvm-mvn-korean-nlp/Program.cs at main · rkttu/awesome-dotnet-fba · GitHub

이전에 IKVM을 이용하여 Maven 패키지와 JAR 패키지를 불러다 쓰는 방법을 설명했던 아티클이 있었습니다.

이것도 File-based App으로 옮길 수 있다면 효과적이면서도 멋질 것이라고 생각해서 옮겨봤는데 당연하게도 잘 작동합니다. :smiley:

일단 IKVM.Maven.Sdk nuget 패키지를 참조하고, 아래처럼 코드를 작성합니다.

#!/usr/bin/env dotnet

#:property PublishAot=False

// IKVM Maven SDK integration - allows direct usage of Maven packages in .NET
#:package IKVM.Maven.Sdk@1.9.4

// Import Korean text processing utilities from different Java libraries
using KkmaHangul = org.snu.ids.ha.util.Hangul;  // KKMA (Korean Knowledge Morpheme Analyzer)
using OktHangul = org.openkoreantext.processor.util.Hangul;  // Open Korean Text processor

// Example 1: Using KKMA to decompose Korean character
var kkma = new KkmaHangulUtil();

// Split the Korean character '한' (han) into its constituent parts
kkma.Split('\uD55C', out var initial, out var medial, out var final);

Console.WriteLine($"Initial: {initial}, Medial: {medial}, Final: {final}");

// Example 2: Using Open Korean Text to compose Korean character
var okt = new OktHangulUtil();

// Combine Korean jamo characters to form a complete syllable
Console.WriteLine($"{okt.Combine('\u3131', '\u3161', '\u3139')}");

// Interface defining common operations for Korean text processing
public interface IHangulUtil
{
    // Split a Korean syllable into its constituent jamo (consonant/vowel) parts
    void Split(char c, out char onset, out char vowel, out char coda);
    
    // Combine individual jamo characters into a complete Korean syllable
    char Combine(char onset, char vowel, char coda);
}

// Implementation using KKMA (Korean Knowledge Morpheme Analyzer) library
public sealed class KkmaHangulUtil : IHangulUtil
{
    public void Split(char c, out char onset, out char vowel, out char coda)
    {
        // Use KKMA's split method to decompose Korean character
        var result = KkmaHangul.split(c);
        onset = result.cho;   // Initial consonant (초성)
        vowel = result.jung;  // Medial vowel (중성)
        coda = result.jong;   // Final consonant (종성)
    }

    public char Combine(char onset, char vowel, char coda)
        // Use KKMA's combine method to create Korean syllable from jamo parts
        => KkmaHangul.combine(onset, vowel, coda);
}

// Implementation using Open Korean Text processor library
public sealed class OktHangulUtil : IHangulUtil
{
    public void Split(char c, out char onset, out char vowel, out char coda)
    {
        // Use OKT's decomposeHangul method to break down Korean character
        var result = OktHangul.decomposeHangul(c);
        onset = result.onset();  // Initial consonant
        vowel = result.vowel();  // Medial vowel
        coda = result.coda();    // Final consonant
    }

    public char Combine(char onset, char vowel, char coda)
        // Use OKT's composeHangul method to build Korean syllable from components
        => OktHangul.composeHangul(onset, vowel, coda);
}

그리고 실제로 참조하려는 JAR 패키지와 Maven 패키지 정보는 Directory.Build.props 파일에 아래처럼 작성합니다.

<Project>
    <ItemGroup>
        <IkvmReference Include="kkma-2.0.jar" />
        <MavenReference Include="org.openkoreantext:open-korean-text" Version="2.3.1" />
    </ItemGroup>
</Project>

JAR 파일의 경우, Program.cs 파일이 있는 위치에 나란히 가져다 놓으면 자동으로 인식되는 점은 동일합니다.

이 접근 방법이 정말 멋진 점은, 당연하게도 JAR와 Maven 패키지 인텔리센스가 아래 그림처럼 바로 작동한다는 점입니다. :+1:

IKVM이 타겟팅하는 JVM 버전은 아주 최신 버전은 아니고 Java SE 8 수준이지만, 한글 형태소 분석기 같은 컴포넌트를 .NET에서 가져다 쓰는데에는 큰 무리가 없는 수준이라고 볼 수 있을 것 같습니다.

4개의 좋아요