Skip to content

배포를 위한 PR#96

Merged
Min9ithub merged 18 commits intomainfrom
dev
Mar 19, 2026
Merged

배포를 위한 PR#96
Min9ithub merged 18 commits intomainfrom
dev

Conversation

@Min9ithub
Copy link
Copy Markdown
Member

🛠️ PR 유형

어떤 변경 사항이 있나요?

  • FEAT: 새로운 기능 추가
  • FIX: 버그 수정
  • DESIGN: CSS 등 사용자 UI 디자인 변경
  • REFACTOR: 코드 리팩토링
  • COMMENT: 주석 추가 및 수정
  • DOCS: 문서 수정
  • BUILD: 빌드 부분 혹은 패키지 매니저 수정
  • DELETE: 파일 혹은 폴더 삭제
  • CHORE: 그 외 자잘한 수정

📝 요약(Summary)

  • 변경 사항 및 관련 이슈에 대해 간단하게 작성해주세요. 어떻게 보다 무엇을 왜 수정했는지 설명해주세요.

📸스크린샷 (선택)

💬 공유사항 to 리뷰어

  • 리뷰어가 중점적으로 봐줬으면 좋겠는 부분이 있으면 적어주세요.
  • 논의해야할 부분이 있다면 적어주세요.
  • ex) 메서드 XXX의 이름을 더 잘 짓고 싶은데 혹시 좋은 명칭이 있을까요?

🔗 Reference

  • 해당 작업을 수행하며 참고한 Link를 모두 작성

✅ PR Checklist

PR이 다음 요구 사항을 충족하는지 확인하세요.

  • 커밋 메시지 컨벤션에 맞게 작성했습니다.
  • 변경 사항에 대한 테스트를 했습니다.(버그 수정/기능에 대한 테스트).

@Min9ithub Min9ithub self-assigned this Mar 19, 2026
@github-actions
Copy link
Copy Markdown

🤖 Gemini AI 코드 리뷰

🐛 잠재적 버그 / 문제점

  • src/api/post.ts - createPosts 함수: postData: object 타입이 너무 일반적입니다. 실제 API 요청에 사용되는 데이터 구조를 반영하는 구체적인 타입을 정의하여 사용하면 타입 안정성을 높이고 개발 중 발생할 수 있는 오류를 줄일 수 있습니다.
  • src/api/team.ts - GetTeamApplications 함수: 함수 이름은 "팀 지원 목록 조회"인데 반환 타입이 PostDetailResponse[]입니다. 만약 PostDetailResponse가 모집글 상세 정보를 의미한다면, 지원 목록(지원자 정보, 지원 상태 등)과는 맞지 않을 수 있습니다. API 응답에 따라 적절한 타입으로 변경하거나, 함수 이름이 실제 반환하는 데이터와 일치하는지 확인이 필요합니다.
  • src/components/Field/FieldBody.tsx - FieldTextarea 컴포넌트: handleKeyDown에서 Enter 키를 막고 handleChange에서 줄바꿈 문자를 제거하고 있습니다. 이는 textarea가 여러 줄 입력을 허용하지 않도록 하는 것으로 보입니다. 만약 여러 줄 입력이 필요한 경우라면 버그이며, 한 줄 입력만 허용한다면 <input type="text">를 사용하는 것이 더 적절하거나, FieldTextarea라는 컴포넌트 이름이 혼란을 줄 수 있습니다.
  • src/components/Field/FieldBody.tsx - FieldEditor 컴포넌트: editor.getMarkdown()을 사용하여 Markdown을 반환하고 &nbsp;를 공백으로 치환하는 로직이 추가되었습니다. 백엔드에서 Markdown을 제대로 파싱하고 처리할 수 있는지, 그리고 &nbsp; 치환 로직이 모든 상황에서 의도대로 동작하는지 확인이 필요합니다. 특정 상황에서 의도치 않은 렌더링 문제를 유발할 수 있습니다.
  • src/components/Field/FieldBody.tsx - FieldPositionSkill 컴포넌트:
    • positionSkillData[selectedPosition as PositionKey] 부분에서 selectedPositionnull일 때 positionSkillData[null]에 접근하여 런타임 에러가 발생할 수 있습니다. selectedPositionnull이 아닐 때만 접근하도록 방어 로직이 필요합니다. (현재 skillDropdownOpen && selectedPosition 조건으로 어느 정도 방어는 되지만, 타입스크립트 관점에서는 as PositionKey가 위험합니다.)
    • item.skills.map에서 key={skill}을 사용하고 있습니다. 만약 동일한 skill 이름을 가진 아이템이 여러 개 추가될 경우 key 충돌이 발생할 수 있습니다. key는 리스트 내에서 고유해야 하므로, key={${itemIdx}-${skill}} 또는 key={${item.position}-${skill}} 와 같이 더 고유한 값을 사용하는 것이 좋습니다.

♿ 접근성 (a11y) 문제

  • src/components/Field/FieldBody.tsx - FieldPositionSkill 컴포넌트:
    • 직무 및 스킬 드롭다운 구현 시 키보드 접근성(Tab, Enter, Arrow keys 등) 및 스크린 리더 지원을 위한 ARIA 속성(예: aria-haspopup, aria-expanded, aria-controls, aria-labelledby, role="listbox", role="option")이 누락되어 있습니다. 현재는 마우스 클릭에만 의존하고 있어 키보드 사용자나 스크린 리더 사용자에게 불편함을 줄 수 있습니다.
    • 모집 인원 증감 버튼(IconWrapper)은 시각적으로는 버튼처럼 보이지만, 실제로는 divonClick이 적용되어 있습니다. role="button"을 추가하거나, 실제 <button> 태그를 사용하는 것이 접근성 측면에서 더 좋습니다.

🎨 CSS / 스타일 개선

  • src/components/Field/FieldBody.tsx - FieldThumbnail 컴포넌트: 썸네일 이미지에 object-cover가 적용되어 이미지가 잘릴 수 있습니다. 썸네일의 목적(예: 이미지 전체를 보여주는 것이 중요한지, 영역을 채우는 것이 중요한지)에 따라 object-contain 또는 object-cover 중 적절한 것을 선택해야 합니다. 현재 변경된 1080x1080 권장 사이즈와 object-cover가 의도된 동작인지 확인이 필요합니다.
  • src/components/Field/FieldBody.tsx - FieldPositionSkill 컴포넌트:
    • 스킬 드롭다운의 left-[9.5rem]와 같은 하드코딩된 위치 값은 반응형 디자인이나 다른 요소와의 조합에서 레이아웃이 깨질 수 있습니다. 유연한 위치 지정을 위한 CSS 속성(예: left: 50%; transform: translateX(-50%);)이나 라이브러리를 고려해볼 수 있습니다.
    • overflow-y-auto pl-[0.1rem] pr-[2rem] pt-[0.1rem]와 같은 미세한 패딩 값은 의도치 않은 스크롤바나 레이아웃 문제를 일으킬 수 있으므로, 명확한 의도가 없다면 정수 단위의 패딩을 사용하는 것이 좋습니다.

💡 코드 품질 개선

  • src/api/post.ts - createPosts 함수: 함수 이름이 createPosts (복수형)인데 단일 모집글을 생성하는 것으로 보입니다. createPost (단수형)으로 변경하여 함수의 의도를 명확히 하는 것이 좋습니다.
  • src/components/Field/FieldBody.tsx - FieldTextarea 컴포넌트: 현재 value={text}onChange={handleChange}로 내부 상태를 관리하면서 ref도 받고 있습니다. 외부에서 valueonChange를 받아 제어되는 컴포넌트로 만들거나, 완전히 비제어 컴포넌트로 만들고 ref만 사용하는 등 일관된 컴포넌트 패턴을 따르는 것이 좋습니다.
  • src/components/Field/FieldBody.tsx - FieldThumbnail 컴포넌트: alt="미리보기"는 너무 일반적인 텍스트입니다. 어떤 이미지인지 설명하는 더 구체적인 alt 텍스트를 제공하여 사용자 경험과 접근성을 개선하는 것이 좋습니다. (예: "업로드된 썸네일 이미지")
  • src/components/Field/FieldBody.tsx - FieldWorkmode 컴포넌트: WorkmodeType'BOTH''HYBRID'로 변경되었습니다. 이는 API 또는 비즈니스 로직 변경에 따른 것일 수 있으나, 기존 코드와의 호환성 및 변경 이유에 대한 주석이나 문서화가 있으면 좋습니다.
  • src/components/Field/FieldBody.tsx - FieldPositionSkill 컴포넌트:
    • 드롭다운 로직(열고 닫기, 외부 클릭 감지)이 컴포넌트 내부에 직접 구현되어 있어 복잡합니다. 재사용 가능한 드롭다운 컴포넌트나 커스텀 훅으로 분리하면 코드를 더 깔끔하게 유지하고 재사용성을 높일 수 있습니다.
    • selectedPositionnull일 때 스킬 드롭다운이 비활성화되는 로직은 좋지만, 사용자에게 왜 스킬 드롭다운이 비활성화되어 있는지 시각적으로 명확하게 보여주는 UI(예: 비활성화된 스타일, 툴팁)가 있으면 더 좋습니다.
    • RecruitmentsValue 타입의 positionPositionKey로 변경되었는데, FieldPosition 컴포넌트에서는 여전히 PositionType을 사용하고 있습니다. 타입 정의의 일관성을 위해 PositionTypePositionKey의 관계를 명확히 하거나 하나로 통일하는 것이 좋습니다.

Gemini 2.5 Flash | Diff 크기: 82111 bytes

@Min9ithub Min9ithub merged commit a8e1a99 into main Mar 19, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants