svelt kit test
Some checks failed
Deploy to Production / Deploy (push) Failing after 4s

This commit is contained in:
Lectom C Han
2025-07-25 14:43:32 +09:00
commit dd89e5fc90
31 changed files with 6008 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
# OIDC 인증 구현 트러블슈팅 (svelte-check)
`pnpm run check` 실행 시 발생한 타입 에러들에 대한 요약 및 해결 과정 기록. 모든 문제는 최종적으로 해결되었습니다.
---
## 1-6. `src/lib/server/auth.ts` 관련 타입 오류
- **파일**: `src/lib/server/auth.ts`
- **오류 요약**:
1. `unstorage` 및 관련 어댑터 import 오류
2. Lucia v3 생성자에 `env` 속성 사용 오류
3. `getUserAttributes` 콜백의 `data` 타입 추론 오류 (`{}`)
4. 더미 어댑터의 타입이 `Adapter` 인터페이스와 불일치
- **원인**: Lucia v3의 API와 타입 시스템에 대한 이해 부족. 데이터베이스 의존성을 제거하는 과정에서 `unstorage` 어댑터를 잘못 사용하려고 시도함.
- **해결 상태**: **완료**
- **해결책**:
1. `unstorage` 및 관련 패키지 의존성을 제거했습니다.
2. 데이터베이스 없이 OIDC 흐름을 테스트하기 위해, Lucia v3의 `Adapter` 인터페이스를 직접 구현하는 **더미 인메모리 어댑터**를 `auth.ts` 내에 작성했습니다.
3. 이 더미 어댑터는 `Map` 객체를 사용하여 세션과 사용자 정보를 메모리에 임시 저장합니다.
4. Lucia 생성자에서 v2 방식의 `env` 속성을 제거하고, `Adapter` 인터페이스에 맞게 `setUser`와 같은 불필요한 메서드를 제거했습니다.
5. `declare module 'lucia'`를 사용하여 `DatabaseUserAttributes` 타입을 명시적으로 정의함으로써, `getUserAttributes`의 타입 추론 오류를 해결했습니다.
---
## 7. `hooks.server.ts`의 `handleRequest` 오류
- **파일**: `src/hooks.server.ts`
- **오류 메시지**: `Property 'handleRequest' does not exist on type 'Lucia<...>'`
- **원인**: `lucia.handleRequest()`는 Lucia v2에서 사용하던 방식입니다. v3에서는 세션 유효성 검사와 쿠키 관리를 직접 처리해야 합니다.
- **해결 상태**: **완료**
- **해결책**: Lucia v3의 공식 문서에 따라 `hooks.server.ts``handle` 함수를 수정했습니다. 이제 모든 요청에서 `event.cookies`를 통해 세션 ID를 가져오고, `lucia.validateSession()`으로 유효성을 검증합니다. 검증 결과에 따라 `event.locals.user``event.locals.session`을 설정하고, 필요한 경우 세션 쿠키를 새로 생성하거나 비우는 로직을 추가했습니다.
---
## 8. `arctic` 모듈 선언 오류
- **파일**: `src/routes/login/callback/+page.server.ts`
- **오류 메시지**: `Cannot find module 'arctic' or its corresponding type declarations.`
- **원인**: `arctic` 패키지가 설치되지 않았습니다.
- **해결 상태**: **완료**
- **해결책**: `pnpm install arctic` 명령을 실행하여 의존성을 추가했습니다.
---
## 9. `logout` 라우트의 `redirect` 함수 오류
- **파일**: `src/routes/logout/+page.server.ts`
- **오류 메시지**: `Expected 2 arguments, but got 3.`
- **원인**: SvelteKit의 `redirect` 함수 API가 변경되었습니다. 더 이상 세 번째 인자로 헤더(쿠키 포함)를 전달할 수 없습니다.
- **해결 상태**: **완료**
- **해결책**: `redirect` 함수에서 헤더 인자를 제거하고, 대신 `event.cookies.set()`을 사용하여 로그아웃 시 세션 쿠키를 삭제하도록 로직을 변경했습니다.
---
## 추가 해결: `event.locals` 타입 오류
- **파일**: `src/app.d.ts`, `src/routes/**/+*.server.ts`
- **오류 메시지**: `Property 'user' does not exist on type 'Locals'.`
- **원인**: `hooks.server.ts`에서 `event.locals.user``event.locals.session`을 할당했지만, SvelteKit의 전역 타입 정의 파일(`app.d.ts`)에 해당 속성이 선언되지 않았습니다.
- **해결 상태**: **완료**
- **해결책**: `src/app.d.ts` 파일의 `App.Locals` 인터페이스에 `user: import('lucia').User | null;``session: import('lucia').Session | null;`를 추가하여 전역 타입을 확장했습니다.
---
## 추가 해결: 프론트엔드 컴포넌트 타입 오류
- **파일**: `src/routes/+layout.svelte`, `src/routes/+page.svelte`
- **오류 메시지**: `Property 'session' does not exist on type '{ user: User | null; }'.`
- **원인**: 서버 사이드(`+layout.server.ts`)에서 `data`로 전달하는 객체의 구조를 `{ session }`에서 `{ user }`로 변경했으나, 프론트엔드 컴포넌트에서는 여전히 `data.session`을 참조하고 있었습니다.
- **해결 상태**: **완료**
- **해결책**: `+layout.svelte``+page.svelte` 파일에서 `data.session`을 참조하는 모든 코드를 `data.user`를 참조하도록 수정했습니다.