Skip to content

🐛 이슈 #365, #364, #358, #303, #302 수정 - #414

Merged
manNomi merged 7 commits into
mainfrom
fix/issues-365-364-358-303-302
Feb 14, 2026
Merged

🐛 이슈 #365, #364, #358, #303, #302 수정#414
manNomi merged 7 commits into
mainfrom
fix/issues-365-364-358-303-302

Conversation

@manNomi

Copy link
Copy Markdown
Contributor

📋 요약

이 PR은 다음 5개 이슈를 해결합니다:

🔧 주요 변경사항

1. 타입 안전성 개선 (#358)

  • verificationFile 필드를 nullable로 변경하여 UX 개선
  • as any 타입 단언 제거
  • Biome 설정에서 noExplicitAny 규칙 활성화

2. 아키텍처 문서 (#303)

  • ARCHITECTURE.md 생성
  • Clean FSD와 CQRS 패턴 가이드
  • 레이어별 역할 및 참조 규칙 정의

3. Safe Area 지원 (#365)

  • iOS Safe Area 대응을 위한 viewport-fit 설정
  • CSS 환경 변수를 통한 Safe Area inset 적용

4. 컴포넌트 표준화 문서 (#364)

  • apps/web/COMPONENTS.md 생성
  • 컴포넌트 패턴 및 스타일 가이드라인
  • AI 친화적 개발을 위한 명명 규칙 정의

5. 인증 흐름 문서화 (#302)

  • apps/web/AUTHENTICATION.md 생성
  • 로그인 리디렉션 메커니즘 설명
  • 기존 구현 확인 및 문서화

⚠️ 참고사항

  • TypeCheck: @vercel/speed-insights/next 모듈 누락 오류는 기존 이슈이며, 이 PR과 무관합니다.
  • 모든 변경사항은 기존 기능에 영향을 주지 않도록 설계되었습니다.

📚 관련 문서

Closes#358
Closes#303
Closes#365
Closes#364
Closes#302

manNomiand others added 6 commits February 3, 2026 02:12
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-Claude)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-Claude)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-Claude)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-Claude)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-Claude)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-Claude)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@vercel

vercelBot commented Feb 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
solid-connect-web-adminErrorErrorFeb 8, 2026 3:38pm
solid-connection-webErrorErrorFeb 8, 2026 3:38pm

@coderabbitai

coderabbitaiBot commented Feb 3, 2026

Copy link
Copy Markdown

Walkthrough

  1. 아키텍처 문서가 추가되었습니다.
  2. 인증 흐름 문서가 추가되었습니다.
  3. 컴포넌트 설계 문서가 추가되었습니다.
  4. 여러 API 훅과 API 메서드의 optional params 타입이 Record<string, any>에서 Record<string, unknown>로 변경되었습니다.
  5. 멘토 지원 폼의 zod 스키마가 리팩토링되어 verificationFile 검증이 별도 스키마로 분리되고 폼 타입이 명시적으로 정의되었습니다.
  6. iOS 안전 영역 지원을 위해 viewportFit: "cover"와 글로벌 CSS에 safe-area 인셋 변수가 추가되었습니다.
  7. 린트 규칙 suspicious.noExplicitAnyerror로 강화되었습니다.
  8. 소소한 타입 정리 및 리팩터(Refactor)가 여러 컴포넌트와 훅에 적용되었습니다.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Suggested reviewers

  • wibaek
  • enunsnv
  • khwww
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedPR 제목이 다섯 개의 관련 이슈(#365, #364, #358, #303, #302)를 명확히 언급하며 주요 변경 내용을 간결하게 요약합니다.
Description check✅ PassedPR 설명이 정의된 템플릿 요구사항을 충족하며, 관련 이슈, 주요 변경사항, 참고사항 등이 상세하고 체계적으로 정리되어 있습니다.
Linked Issues check✅ Passed모든 다섯 개의 연결된 이슈(#358, #303, #365, #364, #302)에 대한 요구사항이 코드 변경사항을 통해 충족되었습니다: 타입 안전성 개선, 아키텍처 문서 작성, Safe Area 지원, 컴포넌트 설계 시스템 문서화, 인증 흐름 문서화.
Out of Scope Changes check✅ Passed모든 변경사항이 다섯 개의 연결된 이슈 범위 내에 있으며, 추가적인 범위 외 변경사항이 발견되지 않았습니다.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/issues-365-364-358-303-302

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
apps/web/src/app/university/application/ScoreSheet.tsx (1)

42-48: 주석 처리된 코드 정리를 고려해 보세요.

  1. 사용하지 않는 코드 블록
    • applicant.isMine 관련 로직이 주석 처리된 채로 남아 있습니다.
    • 이번 PR 범위는 아니지만, 추후 정리하면 코드 가독성에 도움이 됩니다. 필요하다면 git history에서 복원할 수 있으니 삭제해도 무방합니다.
apps/web/src/components/ui/FloatingUpBtn/hooks/useFloatingUpHandler.ts (1)

14-19: handleClickuseCallback으로 감싸면 일관성이 높아집니다.

handleClick은 외부 의존성이 없어 실질적 성능 차이는 미미하지만, 같은 훅 내에서 handleScroll만 메모이제이션하고 handleClick은 그대로 두면 스타일 불일치가 생길 수 있습니다.

♻️ 제안 diff
- const handleClick = () => {+ const handleClick = useCallback(() => {
window.scrollTo({
top: 0,
behavior: "smooth",
});
- };+ }, []);
apps/web/src/app/university/application/ScorePageContent.tsx (1)

139-142: 2. as unknown as React.FormEvent — 타입 안전성 PR 취지에 맞게 개선 여지가 있습니다

이 PR의 목적이 as any 제거와 타입 안전성 강화인 만큼, 여기서 사용되는 as unknown as React.FormEvent 이중 단언도 같은 맥락의 타입 우회입니다. new Event("submit")는 실제 React.FormEvent가 아니므로 preventDefault() 외의 속성에 접근하면 런타임 오류가 발생할 수 있습니다.

검색 키워드를 직접 인자로 받는 방식으로 리팩터하면 가짜 이벤트 생성 자체가 불필요해집니다.

♻️ 제안: 이벤트 생성 없이 키워드를 직접 전달
- const handleSearch = (event: React.FormEvent) => {- event.preventDefault();- const keyword = searchRef.current?.value || "";- setRegionFilter("");- setSearchValue(keyword);- setSearchActive(false);- };+ const handleSearch = (eventOrKeyword?: React.FormEvent | string) => {+ if (typeof eventOrKeyword === "object") {+ eventOrKeyword.preventDefault();+ }+ const keyword =+ typeof eventOrKeyword === "string" ? eventOrKeyword : (searchRef.current?.value || "");+ setRegionFilter("");+ setSearchValue(keyword);+ setSearchActive(false);+ };

그러면 버튼 클릭 핸들러도 간결해집니다:

 onClick={() => {
handleSearchField(word);
- handleSearch(new Event("submit") as unknown as React.FormEvent);+ handleSearch(word);
}}
apps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsx (1)

80-85: null as File | null 타입 단언이 불필요하거나, 다른 곳과 일관성이 맞지 않습니다.

  1. Line 62, 72에서는 setValue("verificationFile", null)로 단언 없이 사용하고 있습니다.
  2. Line 81에서만 null as File | null로 타입 단언을 하고 있어 일관성이 깨집니다.

스키마에서 verificationFile이 nullable이라면 세 곳 모두 null만으로 충분합니다. as any 제거라는 PR 목표에 맞게, 불필요한 단언도 함께 정리하면 더 깔끔해질 것 같습니다.

♻️ 수정 제안
 const handleRemoveFile = () => {
- setValue("verificationFile", null as File | null);+ setValue("verificationFile", null);
if (fileInputRef.current) {
apps/web/src/apis/community/getBoard.ts (1)

9-9: boardCode as string 캐스팅이 남아있네요.

이번 PR 범위는 아니지만, boardCodestring | number를 받으면서 Line 9에서 as string으로 캐스팅하고 있습니다. 향후 API 시그니처를 string으로 통일하거나, String(boardCode)로 명시적 변환하는 것이 더 안전할 수 있습니다.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/web/src/app/my/apply-mentor/_components/UniversityScreen/index.tsx (1)

80-85: ⚠️ Potential issue | 🟡 Minor

as any 캐스팅이 남아있습니다.

  1. 문제점

    • Line 81: setValue("verificationFile", null as any)에 여전히 as any가 남아있습니다.
    • biome.json에서 noExplicitAny: "error"로 설정되어 린트 오류가 발생합니다.
  2. 해결 방법

    • Lines 62, 72와 동일하게 as any를 제거하면 됩니다.
🔧 수정 제안
 const handleRemoveFile = () => {
- setValue("verificationFile", null as any);+ setValue("verificationFile", null);
if (fileInputRef.current) {
fileInputRef.current.value = "";
}
};
🤖 Fix all issues with AI agents
In `@apps/web/src/styles/globals.css`:
- Around line 22-30: Body-level safe-area padding won't affect fixed-position
elements because they use the viewport, so update each bottom-fixed component
(BottomNavigation, UniversityStep, UniversityScreen) to include bottom safe-area
padding; add a padding-bottom using env(safe-area-inset-bottom) or the CSS
variable (e.g., className including pb-[env(safe-area-inset-bottom)] or inline
style paddingBottom: 'env(safe-area-inset-bottom)') so the fixed bottom-0 /
bottom-14 elements account for the iOS home indicator and safe area.
🧹 Nitpick comments (2)
apps/web/COMPONENTS.md (1)

256-272: 코드 블록에 언어 지정자가 누락되었습니다.

  1. 마크다운 린트 경고
    • 정적 분석 도구(markdownlint)가 Line 256의 펜스드 코드 블록에 언어가 지정되지 않았다고 경고합니다.
    • 디렉토리 구조이므로 text 또는 plaintext를 추가하면 경고가 해결됩니다.
🔧 언어 지정자 추가 제안
-```+```text
components/
├── ui/ # Generic UI components
ARCHITECTURE.md (1)

17-17: Markdown 코드 블록에 언어 지정 추가 권장

정적 분석 도구에서 코드 블록에 언어 지정자가 없다고 표시하고 있습니다. 구조도나 디렉토리 트리의 경우 text 지정자를 추가하면 일관성이 향상됩니다:

📝 제안하는 수정 사항

Line 17의 경우:

-```+```text
src/
├── app/ # [Framework Layer] 라우팅, 메타데이터, 레이아웃 (Shell)

Line 115의 경우:

-```+```text
App → Pages → Widgets → Features → Entities → Shared

Line 215의 경우:

-```+```text
entities/post/

Also applies to: 115-115, 215-215

Comment on lines 22 to 30
body {
@apply m-0 bg-white;
font-family: system-ui, -apple-system, sans-serif;
/* Apply safe area padding for iOS devices */
padding-top: var(--safe-area-inset-top);
padding-right: var(--safe-area-inset-right);
padding-bottom: var(--safe-area-inset-bottom);
padding-left: var(--safe-area-inset-left);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash# 고정 위치 지정 요소 검색echo"=== Fixed positioned elements ==="
rg -n "fixed" --type=tsx --type=ts apps/web/src | head -30
echo""echo"=== UniversityScreen component search ==="
find apps/web/src -type f \( -name "*University*" -o -name "*university*"\)echo""echo"=== Search for bottom-0 or similar bottom positioning ==="
rg -n "bottom-0|bottom-\|safe-area" --type=tsx --type=ts apps/web/src | head -40

Repository: solid-connection/solid-connect-web

Length of output: 972


🏁 Script executed:

#!/bin/bash# 고정 위치 지정 요소 검색 (수정된 버전)echo"=== Fixed positioning search ==="
rg "fixed|position.*fixed" apps/web/src --glob="*.tsx" --glob="*.ts" -n
echo""echo"=== UniversityStep component ==="
cat -n apps/web/src/app/university/application/apply/UniversityStep.tsx
echo""echo"=== UniversityBtns component ==="
cat -n apps/web/src/app/university/[id]/_ui/UniversityDetail/_ui/UniversityBtns.tsx
echo""echo"=== Safe-area CSS variables usage ==="
rg "safe-area|inset-top|inset-bottom" apps/web/src --glob="*.tsx" --glob="*.ts" --glob="*.css" -n

Repository: solid-connection/solid-connect-web

Length of output: 17137


🏁 Script executed:

#!/bin/bash# BottomNavigation 전체 내용 확인
cat -n apps/web/src/components/layout/GlobalLayout/ui/BottomNavigation/index.tsx
echo""echo"=== Check for safe-area usage in BottomNavigation ==="
rg "safe-area|pb-|padding-bottom" apps/web/src/components/layout/GlobalLayout/ui/BottomNavigation/ -A 2

Repository: solid-connection/solid-connect-web

Length of output: 2721


고정 위치 지정 요소들이 안전 영역을 적절히 처리하지 못하고 있습니다.

현재 구현에서 body 요소는 safe-area-inset-* 변수를 통해 안전 영역을 처리하고 있으나, 다음과 같은 문제가 있습니다:

  1. 고정 위치 요소는 body 패딩을 상속받지 않습니다

    • fixed 포지셔닝은 뷰포트 기준으로 동작하므로 body의 패딩이 적용되지 않습니다
  2. 확인된 영향을 받는 요소들

    • BottomNavigation (라인 30): fixed bottom-0 - iOS 홈 인디케이터에 가려집니다
    • UniversityStep (라인 108): fixed bottom-14 - 안전 영역 고려 필요
    • UniversityScreen (라인 215): fixed bottom-0 pb-14 - 안전 영역 미적용
  3. 권장 조치

    • 하단 고정 요소들에 pb-[env(safe-area-inset-bottom)] 또는 var(--safe-area-inset-bottom) 패딩을 추가하세요
    • 예: <div className="fixed bottom-0 pb-[env(safe-area-inset-bottom)]">
🤖 Prompt for AI Agents
In `@apps/web/src/styles/globals.css` around lines 22 - 30, Body-level safe-area
padding won't affect fixed-position elements because they use the viewport, so
update each bottom-fixed component (BottomNavigation, UniversityStep,
UniversityScreen) to include bottom safe-area padding; add a padding-bottom
using env(safe-area-inset-bottom) or the CSS variable (e.g., className including
pb-[env(safe-area-inset-bottom)] or inline style paddingBottom:
'env(safe-area-inset-bottom)') so the fixed bottom-0 / bottom-14 elements
account for the iOS home indicator and safe area.

@manNomi
manNomi merged commit 2f492c4 into mainFeb 14, 2026
7 of 10 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

1 participant

@manNomi