9.0 KiB
9.0 KiB
Gemini 마이그레이션 및 개발 요약
날짜: 2025년 7월 7일 작성자: Gemini
1. 목표
기존 Aptabase MAUI SDK를 기반으로, 완전히 독립적이고, 테스트를 통해 검증된 새로운 Aptabase WPF SDK 프로젝트를 생성합니다.
2. 독립 프로젝트 생성
- 디렉토리 구조화: 원본 소스와 분리된
Aptabase.WPF최상위 디렉토리를 생성하고, 내부에src,etc,test폴더를 구성하여 표준적인 프로젝트 구조를 갖추었습니다. - 리소스 복사: NuGet 패키징 및 라이선스에 필요한
README.md,LICENSE,etc/logo.png파일을 독립 프로젝트 내로 복사했습니다. - 소스 코드 이전: MAUI SDK의 핵심 로직
파일(
AptabaseClient.cs,AptabasePersistentClient.cs등)을Aptabase.WPF/src로 모두 복사했습니다.
3. WPF 환경 최적화 및 리팩토링
WPF 환경에 맞게 SDK를 수정하고, 불필요한 종속성을 제거하는 리팩토링을 진행했습니다.
- 네임스페이스 통일: 모든 소스 코드의 네임스페이스를
Aptabase.Maui에서Aptabase.WPF로 일괄 변경했습니다. - MAUI 종속성 제거:
SystemInfo.cs:Microsoft.Maui.Devices.DeviceInfoAPI 대신System.Environment등 표준 .NET API를 사용하도록 전면 재작성했습니다.AptabasePersistentClient.cs: 이벤트 임시 저장 경로를 MAUI의FileSystem.CacheDirectory에서Path.GetTempPath()로 변경하여 플랫폼 독립성을 확보했습니다.
- 로깅 종속성 제거:
- WPF에서는 DI 컨테이너 사용이 일반적이지 않으므로,
Microsoft.Extensions.Logging에 대한 종속성을 완전히 제거했습니다. AptabaseClient,AptabaseClientBase,AptabasePersistentClient클래스에서ILogger관련 코드를 모두 삭제하여 SDK를 경량화했습니다.
- WPF에서는 DI 컨테이너 사용이 일반적이지 않으므로,
- 진입점 클래스 변경:
- 네임스페이스(
Aptabase.WPF)와 클래스(Aptabase) 간의 이름 충돌을 피하기 위해, SDK의 메인 진입점 클래스 이름을AptabaseTracker로 변경하여 API의 명확성을 높였습니다.
- 네임스페이스(
4. 단위 테스트 및 안정성 검증
SDK의 안정성을 보장하기 위해 xUnit 기반의 단위 테스트 프로젝트를 생성하고, 반복적인 테스트와 디버깅을 통해 문제를 해결했습니다.
- 테스트 프로젝트 생성:
Aptabase.WPF/test디렉토리에Aptabase.WPF.Tests.csproj테스트 프로젝트를 추가하고,SystemInfo와AptabaseTracker의 초기화 로직을 검증하는 테스트 케이스를 작성했습니다. - 빌드 오류 해결 과정:
- 패키지 누락:
DotNext.Threading.Channels패키지를 찾지 못하는 오류(NU1101)가 발생. Google 검색을 통해 정확한 패키지명이DotNext.Threading임을 확인하고 수정했습니다. - 프레임워크 호환성:
DotNext.Threadingv5.5.0이net6.0/net7.0과 호환되지 않는 문제(NU1202)가 발생. 프로젝트의 다중 타겟팅(TargetFrameworks)을 포기하고, 최신 버전인net8.0-windows단일 타겟(TargetFramework)으로 변경하여 문제를 해결했습니다. using지시문 및 시그니처 오류:HttpClient,Stream등의 기본 클래스를 찾지 못하거나, 인터페이스 멤버를 구현하지 못하는 다수의 컴파일 오류(CS0246,CS0535)가 발생. 각 파일에 누락된using지시문을 추가하고, 메서드 시그니처(override, 메서드명 변경)를 수정하여 해결했습니다.- 네임스페이스 충돌: 최종적으로
Aptabase클래스 이름과Aptabase.WPF네임스페이스가 충돌하는 문제를AptabaseTracker로 클래스명을 변경하여 해결했습니다.
- 패키지 누락:
- 테스트 성공: 위의 모든 문제를 해결한 후,
dotnet test명령을 실행하여 모든 단위 테스트가 성공적으로 통과하는 것을 확인했습니다.
5. NuGet 패키지 생성
- .csproj 파일 수정: NuGet 패키지
메타데이터(
Version,Authors,PackageProjectUrl등)를 추가하고,pack명령의 경로 문제를 해결하기 위해 리소스 파일 경로를 수정했습니다. - 패키지 생성:
dotnet pack명령을Aptabase.WPF루트에서 실행하여Aptabase.WPF.0.1.0.nupkg파일을 성공적으로 생성했습니다.
6. 최종 상태
- 완전한 독립성:
Aptabase.WPF폴더는 원본 MAUI 프로젝트에 대한 어떠한 파일 시스템 의존성도 갖지 않습니다. - 검증된 안정성: 단위 테스트를 통해 핵심 기능의 정확성과 안정성을 1차적으로 검증했습니다.
- 배포 준비 완료: NuGet.org에 배포할 수 있는
.nupkg패키지 파일이 생성되었습니다.
부록: 주요 명령어 실행 로그
**초기 단위 테스트 실패 (다수의 빌드 오류)**
Command: dotnet test
Directory: Aptabase.WPF/test
Stdout: 복원할 프로젝트를 확인하는 중...
C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\src\Aptabase.WPF.csproj을(를) 5.58초 동안 복원했습니다.
C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\test\Aptabase.WPF.Tests.csproj을(를) 6.46초 동안 복원했습니다.
C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\src\AptabaseClient.cs(1,17): error CS0234: 'Microsoft' 네임스페이스에 'Extensions' 형식 또는 네임스페이스 이름이 없습니다. 어셈블리 참조가 있는지 확인하세요. [C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\src\Aptabase.WPF.csproj::TargetFramework=net8.0-windows]
... (수많은 CS0246, CS0535 오류) ...
**NuGet 패키지 호환성 오류 해결**
Command: dotnet test
Directory: Aptabase.WPF/test
Stdout: 복원할 프로젝트를 확인하는 중...
C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\src\Aptabase.WPF.csproj : error NU1202: DotNext.Threading 5.5.0 패키지가 net6.0-windows7.0(.NETCoreApp,Version=v6.0)과(와) 호환되지 않습니다. DotNext.Threading 5.5.0 패키지는 다음을 지원합니다. net8.0(.NETCoreApp,Version=v8.0)
...
해결: .csproj 파일의
<TargetFrameworks>net6.0-windows;net7.0-windows;net8.0-windows</TargetFrameworks>를
<TargetFramework>net8.0-windows</TargetFramework>로
변경하여 net8.0 단일 타겟으로 수정.
**네임스페이스 충돌 오류 해결**
Command: dotnet test
Directory: Aptabase.WPF/test
Stdout: 복원할 프로젝트를 확인하는 중...
...
C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\test\AptabaseTests.cs(14,20): error CS0118: 'Aptabase'은(는) 네임스페이스이지만 형식처럼 사용됩니다. [C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\test\Aptabase.WPF.Tests.csproj]
...
해결: 진입점 클래스 Aptabase의 이름을
AptabaseTracker로 변경하여 네임스페이스와의 충돌을
회피.
**단위 테스트 최종 성공**
Command: dotnet test
Directory: Aptabase.WPF/test
Stdout: 복원할 프로젝트를 확인하는 중...
복원할 모든 프로젝트가 최신 상태입니다.
Aptabase.WPF -> C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\src\bin\Debug\net8.0-windows\Aptabase.WPF.dll
Aptabase.WPF.Tests -> C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\test\bin\Debug\net8.0-windows\Aptabase.WPF.Tests.dll
C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\test\bin\Debug\net8.0-windows\Aptabase.WPF.Tests.dll(.NETCoreApp,Version=v8.0)
테스트 실행을 시작하는 중입니다. 잠시 기다려 주세요...
지정된 패턴과 일치한 총 테스트 파일 수는 1개입니다.
통과! - 실패: 0, 통과: 3, 건너뜀: 0, 전체: 3, 기간: 20 ms - Aptabase.WPF.Tests.dll (net8.0)
**NuGet 패키징 경로 오류 해결**
Command: dotnet pack src/Aptabase.WPF.csproj -c Release -o nupkgs
Directory: Aptabase.WPF/src
Stdout: 복원할 프로젝트를 확인하는 중...
...
C:\Program Files\dotnet\sdk\9.0.301\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(221,5): error NU5019: 찾을 수 없는 파일: 'C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\etc\logo.png'
해결: pack 명령을 src
디렉토리가 아닌, 솔루션 파일이 있는 Aptabase.WPF 루트
디렉토리에서 실행하여 .csproj 내의 상대
경로(..\)가 올바르게 해석되도록 함.
**NuGet 패키징 최종 성공**
Command: dotnet pack src/Aptabase.WPF.csproj -c Release -o nupkgs
Directory: Aptabase.WPF
Stdout: 복원할 프로젝트를 확인하는 중...
복원할 모든 프로젝트가 최신 상태입니다.
Aptabase.WPF -> C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\src\bin\Release\net8.0-windows\Aptabase.WPF.dll
'C:\Users\cyhan\repo\aptabase-maui\Aptabase.WPF\nupkgs\Aptabase.WPF.0.1.0.nupkg' 패키지를 만들었습니다.