-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feat: #BBB-99 서적 스터디 대시보드 디자인 #33
Conversation
@@ -0,0 +1 @@ | |||
.env No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
파일 패치에 대한 코드 리뷰:
- 추가된 줄인 ".env"가 표시되지만 그 이유나 콘텐츠에 대한 설명이 없어 개발자들이 변경 내용을 이해하기 어려울 수 있습니다.
- ".env" 파일의 끝에 새로운 줄이 없는 것은 유닉스 스타일의 텍스트 파일에서 예상되는 규칙이며, 이것이 수정되어야 하는 것은 아닙니다.
- 보안을 고려하여 .env 파일이 민감한 정보를 포함하고 있는 경우, 접근 제어 및 암호화 방법을 고려해야 합니다.
|
||
# server.js is created by next build from the standalone output | ||
# https://nextjs.org/docs/pages/api-reference/next-config-js/output | ||
CMD node server.js No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰:
- 위험:
- APK를 통한 libc6-compat을 추가하는 부분에 대해 특정 운영체제와 버전 호환성 문제가 발생할 수 있습니다.
- 사용자 및 그룹 설정에서 UID 및 GID 충돌 가능성이 있습니다.
- 개선 사항:
- 환경 변수를 관리하는 데 도움이 되도록 .env 파일을 사용하고 ENV 구문으로 이를 가져와 사용할 수 있습니다.
- COPY 명령어에서 전체 디렉터리를 복사하지 않고 필요한 파일만 복사하여 이미지의 크기를 줄일 수 있습니다.
- 최신 Next.js 버전 및 보안 업데이트를 유지하기 위해 기반 이미지를 주기적으로 업데이트할 수 있습니다.
- 새로운 버전을 배포할 때 정확성을 확인하기 위해 CI/CD를 구축하면 좋습니다.
alt="hamster with laptop" | ||
className="w-full max-w-md" | ||
/> | ||
</div> | ||
</div> | ||
</> | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰:
-
라이브러리를 import할 때, 모듈 이름이 일관성 없이 혼용되고 있습니다.
import { userState } from '@/recoil/userAtom';
와 같은 부분에서'@/...'
을 사용함에도 불구하고import { VideoIcon } from 'lucide-react';
는 바로 상대 경로를 사용합니다. 모든 import 구문을 동일한 스타일로 통일하는 것이 좋습니다. -
이미 지정된 JSX 요소가 주석 처리되어 있습니다. 코드에 영향을 미치지 않는 주석은 제거하여 가독성을 높일 수 있습니다.
-
CSS 클래스의 사용을 보다 일관된 방식으로 수정할 필요가 있습니다. 예를 들어,
className="ml-12 text-5xl grid grid-rows-3 grid-cols-2 gap-x-12 gap-y-3"
와 같은 인라인 스타일 대신 CSS 파일에 스타일을 정의하고 클래스를 사용하는 방법을 고려해 보세요. -
이미지 소스
'gray-hamster.png'
가 상대 경로로 제공되는데, 이 경로가 정확한지 확인하고 이미지를 올바르게 로드하는지 확인하세요. -
UI 구조를 간결하게 유지하면서 컴포넌트를 재사용 가능하도록 만들어야 합니다. 코드를 병합하거나 확장시 인터페이스가 유연하게 작동하도록 해야 합니다.
-
버튼 디자인이나 아이콘의 크기 및 디자인 일관성을 확인하고 개선해야 할 수 있습니다.
-
중복되는 CSS 클래스가 많이 사용되므로 효율적으로 관리할 수 있는 방안을 고려해 보세요.
-
React 요소에 key 속성을 명시적으로 추가하는 것이 좋습니다. 이는 성능 최적화 및 리렌더링 관련 문제를 방지할 수 있습니다.
</div> | ||
</div> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드는 외부 폰트 로드와 사용자의 게시물을 표시하는 것으로 보여집니다. 개선할 점은 다음과 같습니다:
- 번역 오류 및 오타: 번역 내용에 오류나 오타가 있는지 확인해야 합니다.
- 접근성: 시각적인 요소나 마크업 구조를 검토하여 웹 사이트의 전반적인 접근성을 향상시킬 수 있습니다.
- 보안: 사용자 제공 데이터 처리 및 보안 측면을 고려해야 합니다.
- 최적화: 이미지 압축, 코드 번들링 등을 통해 웹 성능 최적화를 고려할 수 있습니다.
위 사항들을 고려하여 코드를 개선하고 안전성 및 효율성을 향상시킬 수 있습니다.
users={round.users} | ||
showPostBoard={showPostBoard} | ||
setShowPostBoard={setShowPostBoard} | ||
/> | ||
</div> | ||
</div> | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰에 오류 위험을 갖고 있습니다:
Round
과 같은 새로운 타입의AlgorithmRound
에 대한 변경이 진행되었습니다.showPostBoard
및setShowPostBoard
state 변수가 추가되었습니다.handleStart
함수 내 처리된 예외처리가 부족할 수 있습니다.
개선 제안:
handleStart
함수에서 더 많은 예외 처리를 추가하여 예상치 못한 상황에 대비합니다.- 코드 중복을 피하고 가독성을 높이기 위해 공통 컴포넌트 생성을 고려할 수 있습니다.
- 상황에 따라 코드 주석을 추가하여 다른 개발자들이 코드를 이해하기 쉽게 합니다.
주의할 사항:
Round
과AlgorithmRound
타입 간 호환성 유의 (필요 시 API 및 타입 정의 업데이트)- 새로운 state 변수인
showPostBoard
가 어떻게 사용되는지 세심히 검토
전체적으로, 코드는 보수적이며 새 기능 추가 및 코드 리팩터링에 관한 개선점이 존재합니다.
<b>과제 투표 </b> | ||
</div> | ||
</> | ||
)} | ||
</div> | ||
<div className="mt-6"> | ||
<h3 className="text-lg font-bold"> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드에 대한 간단한 코드 리뷰:
-
잠재적 버그 위험:
StudyAbout
컴포넌트에 있는 빈 onClick 핸들러(() => {}
)는 아무 작업도 하지 않으므로, 클릭 이벤트를 처리해야 할 필요가 있습니다.
-
개선 제안:
- TypeScript를 사용하여 정적 타입 검사를 강화할 수 있습니다.
- 핸들러 함수 내에서 상태 변경 전에 이전 상태를 복사하여 변경하는 방식을 고려할 수 있습니다(불변성 유지).
- UI 컴포넌트 관리를 단순화하기 위해 상태 관리 라이브러리(ex: Redux, Recoil) 고려할 수 있습니다.
- 주석 (
// TODO details.book.title로 변경
) 에 명시된 작업을 완료하는 것이 좋습니다.
-
기타:
- JSX의 적절한 구조 및 가독성을 유지하기 위해 요소 중첩과 들여쓰기를 조정할 수 있습니다.
- CSS 클래스 이름을 변수로 관리하거나 Tailwind CSS의 동적 클래스를 활용하여 중복을 줄일 수 있습니다.
이것은 간략한 코드 리뷰이며, 완전한 분석을 위해서는 더 많은 시간과 코드 베이스를 살펴보아야 할 수 있습니다.
solvedProblemRefIds.push(item.problemId); | ||
}); | ||
return solvedProblemRefIds; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 대부분 안전해 보입니다. 그러나 두 가지 향상점이 있습니다:
-
BookRow
함수에서TableRow
,TableCell
을 사용하는 대신에,div
와 CSS로 스타일링 하는 것이 더 일반적입니다. -
createRefIdToProblemIdMap
및getSolvedProblemRefIds
함수의 입력과 출력 유형에 대한 정적 타입 검사를 추가하는 것이 좋습니다.
여기서 주요 버그 위험이 발견되지 않았으며, 코드는 효율적으로 작성되었습니다.
round: AlgorithmRound; | ||
setRound: (round: AlgorithmRound) => void; | ||
round: Round; | ||
setRound: (round: Round) => void; | ||
}) { | ||
const params = useParams(); | ||
const studyId = Number(params.id); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰에 대한 간단한 피드백:
-
AlgorithmRound
,BookRound
및Round
과 같은 타입들의 일관성 부족:- 이 코드는 여러 유형의 라운드를 다룹니다. 이들을 모두 일반적인
Round
으로 통합하는 대신에 알고리즘과 책 스터디와 관련된 고유한 특징을 갖는 자체 타입으로 남겨둘 수 있습니다.
- 이 코드는 여러 유형의 라운드를 다룹니다. 이들을 모두 일반적인
-
BookDashBoardBody
함수와 관련된 리액티브 상태(userState
) 사용:BookDashBoardBody
함수 내에서 UserState를 사용하는 대신에, 해당 로직을 부모 컴포넌트 또는 상태 관리 시스템(Recoil)으로 이동하여 함수로 전달할 수 있습니다.
-
개선 제안:
- 코드의 가독성을 높이기 위해 변수 및 함수명을 더 명확하게 작성할 수 있습니다.
- 불필요한 형변환을 최소화하고 에러 처리를 강화하기 위해 코드를 단순화하는 것도 좋은 방법일 수 있습니다.
- 컴포넌트 구조와 레이아웃을 개선하여 코드를 더 구조화하고 읽기 쉽게 만들 수 있습니다.
종합하면, 주요 변경 사항은 데이터 유형 및 일관성 관리, 상태 처리 및 코드 구조 개선에 중점을 둘 것입니다.
</div> | ||
)} | ||
)} | ||
</div> | ||
</TableCell> | ||
))} | ||
</TableRow> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰 및 개선 제안:
-
버그 위험:
AlgorithmMemberInfo
와AlgorithmProblemInfo
import의 순서가 잘못되었습니다.refresh
함수에서 문제점이 있을 수 있는 비동기 상황을 고려하지 않았습니다.
-
개선 제안:
- API 호출과 관련한 에러 핸들링이 필요합니다.
- 상태 업데이트 시,
setIsLoading
을 활용하여 로딩 상태를 표시할 수 있습니다. CheckIcon
및XIcon
요소에 대한 반복적인 중복 코드를 줄일 수 있습니다.- 사용되지 않는 import (
{ Button }
)들을 정리할 필요가 있습니다. - 코드 스타일 일관성을 유지하기 위해 들여쓰기 및 중괄호 위치를 통일합니다.
-
참고사항:
- 코드 품질을 유지하고 확장 가능성을 고려하여 주석 작성 및 문서화가 필요할 수 있습니다.
- 코드 리팩토링 전에 테스트 케이스 작성이 필수적입니다.
이러한 권고 사항을 고려하여 코드를 개선할 수 있습니다.
</Card> | ||
</div> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 조각에서 발견된 일부 개선 및 버그 리스크:
- 동일한 Card 구조를 반복하는 대신, 데이터를 이용하여 카드를 동적으로 생성하도록 고려해보세요.
- Card 컴포넌트와 스타일링 중복을 줄이기 위해 CSS 클래스를 재사용 가능한 방식으로 관리하는 것을 고려해 보십시오.
- Card에 사용되는 텍스트나 아이콘들을 외부로 빼내어 재사용성을 높일 수 있습니다.
- 충분한 에러 처리 로직이 없으므로 네트워크 오류 등에 대한 예외 처리를 추가하는 것이 바람직합니다.
주의: 더 많은 세부 정보나 전체적인 컨텍스트가 없는 한 이런 종류의 코드 리뷰는 일반적인 조언에 그치므로 상황에 따라 유동적으로 적용하셔야 합니다.
components/ui/avatar.tsx
Outdated
)) | ||
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName | ||
|
||
export { Avatar, AvatarImage, AvatarFallback } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드는 Avatar, AvatarImage, AvatarFallback 컴포넌트를 정의하며 Radix UI의 Avatar 구성 요소를 래핑합니다. 코드에 큰 결함은 없어 보입니다. 그러나 다음 개선 제안 사항을 고려할 수 있습니다:
cn
유틸리티 함수의 원본 소스가 필요합니다. 따라서 이 함수가 어떻게 동작하는지 확인해야 합니다.- JSX 내부에서 클래스 이름을 문자열 결합 대신 템플릿 리터럴로 변경하여 가독성을 향상시킬 수 있습니다.
- TypeScript 타입 선언이 상세하고 명확하며, 사용 사례에 맞춰 유연성을 제공하고 있습니다.
다른 모든 관점에서 깔끔하고 효율적으로 작성된 코드처럼 보입니다.
components/ui/card/card.tsx
Outdated
)) | ||
CardFooter.displayName = "CardFooter" | ||
|
||
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치에 대한 간단한 코드 리뷰를 제공하겠습니다.
-
장점:
- React 컴포넌트가 적절히 작성되어 있으며, 재사용성이 높아 보입니다.
- CSS 클래스를 동적으로 조작하기 위해
cn
유틸리티 함수를 사용하여 깔끔하게 처리하고 있습니다.
-
개선 사항 및 버그 리스크:
- 타입 지정이 명시되어 있지만, TypeScript가 활성화되어 있지 않으면 이로 인한 혼란이 발생할 수 있습니다. 필요한 경우
tsconfig.json
파일을 추가하여 TypeScript를 프로젝트에 통합하는 것이 좋습니다. - 리팩토링을 통해 중복된 코드를 줄이고 공통 부분을 추상화할 수 있습니다. 예를 들어, Card, CardHeader, CardContent 등의 구조는 비슷하므로 공통 부분을 추상화하여 컴포넌트 간의 중복을 최소화할 수 있습니다.
- CSS 클래스 이름을 문자열로 하드코딩하고 있기 때문에, Tailwind CSS에서 정의하는 클래스명과 일치하지 않을 가능성이 있습니다. CSS 클래스명을 상수 변수로 추상화하여 관리하는 방법을 고려해 볼 수 있습니다.
- 타입 지정이 명시되어 있지만, TypeScript가 활성화되어 있지 않으면 이로 인한 혼란이 발생할 수 있습니다. 필요한 경우
-
추가 제안:
- 컴포넌트들을 테스트 가능하도록 Jest나 React Testing Library와 같은 테스트 도구를 이용하여 유닛 테스트를 작성하는 것이 좋습니다.
- ESLint와 Prettier 등의 도구를 활용하여 코드 스타일을 일관성 있게 유지할 수 있습니다.
-
코드 외의 고려 사항:
- 모듈 번들러 설정과 최적화 방안을 검토하여 번들 크기를 최소화하고 성능을 향상시킬 수 있습니다.Webpack 또는 Rollup을 사용하여 번들링 최적화를 진행할 수 있습니다.
좋은 코드 작성에 대한 연속적인 고민과 개선은 읽기 쉬운, 관리하기 쉬운 코드베이스를 유지하는 데 중요합니다.
<rect width="7" height="7" x="3" y="14" rx="1" /> | ||
</svg> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
-
개선 제안:
- 각 아이콘 컴포넌트의
props
에 대해 더 구체적인 타입 지정이 가능하다면 명시하는 것이 좋습니다. stroke="currentColor"
를 사용하는 대신stroke="currentColor"
처럼 테마 컬러로 동적으로 변경할 수 있도록하는 방법 고려해 볼 만 합니다.
- 각 아이콘 컴포넌트의
-
오류 위험:
- 이 코드 패치에는 심각한 버그 위험이 없어 보입니다.
- 각 아이콘의 경로 데이터가 정확하게 지정되었는지 다시 한 번 확인해야 합니다.
-
기타 주의사항:
- SVG 기반의 코드라서 시각적인 변화나 디자인 요소에 따른 추가 검토가 필요할 수 있습니다.
- 코드는 일관되게 깔끔하고 읽기 쉽게 유지되고 있습니다.
@@ -1,5 +1,4 @@ | |||
import axios from 'axios'; | |||
import { useEffect, useState } from 'react'; | |||
|
|||
/** | |||
* 로그인한 유저의 본인 정보 조회 API |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치의 주요 문제점은 useEffect
와 useState
를 import하지 않아 React에서 제공하는 것들을 사용할 수 없다는 점입니다. 이 프로그램이 React 애플리케이션에서 실행되도록 하려면 다음과 같이 수정해야 합니다:
import { useEffect, useState } from 'react';
를 유지하거나 필요한 경우 추가합니다.- 이 코드가 실제로 React 컴포넌트 내부에 있는지 확인합니다.
- API 호출 후 결과를 어떻게 처리할 지에 대한 로직이 누락되어 있습니다. 필요한 경우 상태 업데이트 및 결과 처리가 필요합니다.
개선 제안:
- JSX를 제대로 렌더링하기 위해 React 컴포넌트 내부에서 이 코드를 사용하는 것이 중요합니다.
- 예기치 않은 에러 처리 로직이 필요할 수 있습니다.
- axios 요청이 실패할 경우 적절한 오류 처리를 추가하여 사용자에게 피드백을 제공해야 합니다.
위의 교정 사항을 고려하여 코드를 참조합니다.
@@ -9,7 +9,8 @@ const nextConfig = { | |||
destination: 'https://solved.ac/api/v3/:path*' | |||
} | |||
]; | |||
} | |||
}, | |||
output: 'standalone' | |||
}; | |||
|
|||
export default nextConfig; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치의 코드 리뷰를 짧게 해보겠습니다.
-
버그 위험:
- output 속성은 nextConfig 객체 안에서 적절한 위치에 위치하지 않고 있습니다. output은 일반적으로 없는 속성입니다.
-
개선 제안:
- "output" 필드를 올바른 위치로 이동하여 상태 설정을 더 명확하게 만듭니다.
- 부가적인 설명 주석을 추가하여 코드를 이해하기 쉽게 만들 수 있습니다.
최종 코드 변경:
const nextConfig = {
async rewrites() {
return [
{
source: '/api/:path*',
destination: 'https://solved.ac/api/v3/:path*'
}
];
},
output: 'standalone'
};
export default nextConfig;
위의 변경 사항을 통해 코드의 가독성을 향상시키고, 가능한 오류 발생 위험을 줄여줍니다.
} | ||
export interface QuizInfo { | ||
link: string; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치의 개선점과 버그 위험성을 간단히 검토해 보겠습니다.
AlgorithmRound
인터페이스가Round
인터페이스를 확장하고 있지만 실제로Round
인터페이스 자체에 대한 정의가 있는 지 여부를 확인해야 합니다.BookRound
및BookMemberInfo
의 경우,VideoInfo
및QuizInfo
는 각각의 인터페이스로 분리될 수 있어 보입니다.- 특정 숫자 기반 맵을 사용할 때 불변성을 유지하도록 주의하며, 키값이 번호인 맵에 대한 안정성을 고려해야 합니다.
- 타입 네이밍 일관성을 유지하고자 명명 규칙을 검토하여 interface 명을 통일하면 가독성이 향상될 수 있습니다.
@@ -16,7 +16,7 @@ export interface Study { | |||
studyType: string; | |||
} | |||
|
|||
interface Spread { | |||
export interface Spread { | |||
left: number; | |||
right: number; | |||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 주어진 TypeScript 코드에서 Spread 인터페이스를 공개하도록 수정했습니다. 내가 발견한 주요 이슈는 없지만 개선 제안은 다음과 같습니다:
- 주석 추가: 각 인터페이스에 대해 간단한 설명 주석을 추가하여 코드의 가독성을 향상시킬 수 있습니다.
- 타입 지정 강화: Study 및 Spread 인터페이스의 필드 유형(Type)에 대한 명확한 정의 및 주석을 추가하여 코드 이해도를 높일 수 있습니다.
- 인터페이스 확장: 필요에 따라 Study 및 Spread 인터페이스를 보강하거나 확장하여 코드 재사용성과 유지보수성을 향상시킬 수 있습니다.
위의 제안을 고려하여 코드를 더욱 깔끔하고 유지보수하기 쉽도록 개선할 수 있습니다.
954be79
to
60fd647
Compare
alt="hamster with laptop" | ||
className="w-full max-w-md" | ||
/> | ||
</div> */} | ||
</div> | ||
</> | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
주로 개선이 필요한 사항:
use
대신에import
를 사용했는데, 이것은 오타일 가능성이 있습니다. 코드 상에서'use client';
를import client from 'client';
와 같이 수정하십시오.- 주석 처리된 부분 중 정보가 유용하지 않다면 제거하는 것이 좋습니다.
- 이미지인 "gray-hamster.png" 파일의 경로가 상대 경로인지 절대 경로인지 확인하고 설명을 추가하십시오.
- 컴포넌트 이름은
Button
및VideoIcon
등 앱 내 다른 컴포넌트와 일관성있게 명명해야 합니다. - 클래스 이름과 스타일링이 비교적 하드 코딩되어 있기 때문에, 스타일링을 더 유연하게 관리할 수 있는 방법을 고려해 보세요.
잠재적 버그 위험:
- 이미지 소스 경로가 정확한지 확인하고 올바르게 연결되었는지 테스트합니다.
- 코드를 수정하고나서 UI 간 조화가 잘 맞춰졌는지 확인해야 합니다.
StudyIcon
및VideoIcon
컴포넌트에서 오류를 발생시킬 여지가 있는 데이터 포맷을 전달하거나 사용하는지 검토하세요.
</article> | ||
</div> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드에는 몇 가지 향상점과 버그 위험이 있습니다:
- Accessibility:
<br></br>
대신<br />
를 사용하여 self-closing 태그 사용 권장. - 의미 있는 제목(H1): 페이지 제목인 "스터디 입장 전 필독"을 포함한 내용을
<h1>
태그로 묶으면 SEO 및 접근성 측면에서 도움이 됨. - 마크업 구조 분리: 구조에 따라 컴포넌트 분리 고려해 볼만 함 (예: PostHeader, Comment 등).
- 중복 코드 제거: Avatar Image와 AvatarFallback 부분을 함수나 변수로 추출하여 중복 제거.
- CSS 클래스 정리: CSS 클래스들을 사용할 때 일관된 순서 및 네이밍 규칙 사용.
- Form Validation 추가: 작성 버튼 클릭 시 댓글 입력 필드를 valid/invalid 여부에 따라 처리하기 위한 validation 추가 고려.
이러한 수정 사항을 고려하면 코드의 가독성과 유지 관리가 향상될 수 있습니다.
users={round.users} | ||
showPostBoard={showPostBoard} | ||
setShowPostBoard={setShowPostBoard} | ||
/> | ||
</div> | ||
</div> | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰 요소:
-
StudyPage
함수 컴포넌트에서 사용되는 상태showPostBoard
는 게시판을 표시하는 데 사용됩니다. 이 상태의 목적이 명확하게 드러나지 않으므로 변수명을 더 명확하게 바꾸어 주십시오. -
setTrigger
가 현재 사용되지 않습니다. 불필요한 변수일 수 있으니, 필요 없으면 삭제하거나 목적에 맞게 사용하도록 고려해 보시기 바랍니다. -
API 호출 시 에러 핸들링이 부족합니다. 네트워크 오류 등의 문제가 발생할 경우 해당 부분을 어떻게 처리할지 고려해보세요.
-
handleStart
함수 내의 에러 핸들링이 충분하지 않다면, 더 강화시킬 필요가 있습니다. -
조건문 안의 JSX 코드가 확장될 수 있는 가능성을 고려하고 미리 구조를 점검하여 추가 수정을 용이하게 만드는 것이 좋습니다.
-
CSS 클래스 이름을 하드 코딩하는 대신, TailwindCSS의 동적 클래스나 classNames 패키지와 같은 방법으로 관리할 수 있도록 고려해 보세요.
-
React Hook의 의존성 배열을 업데이트하십시오. 아래 리액트 컴포넌트 함수를 참조하세요.
useEffect(() => { // side effects }, [round, showPostBoard]); // 이 곳에 관련된 상태 변수 추가
-
현재 코드에서는
getStudyDetails
와startStudy
의 사용 방식 및 반환 값에 대한 정보가 부족합니다. 이 동작들이 올바르게 작동하고 있는지 확인하고 예외 상황을 다룰 수 있는지 확인하세요.
이상입니다.
<b>과제 투표 </b> | ||
</div> | ||
</> | ||
)} | ||
</div> | ||
<div className="mt-6"> | ||
<h3 className="text-lg font-bold"> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 어플리케이션의 스터디 페이지 구성에 대한 기능 확장을 포함하고 있습니다.
잠재적인 문제:
showPostBoard
를 토글하기 위해 사용되는setShowPostBoard
함수가 비어있는 상태로 전달될 수 있습니다. 이를 방지하기 위해 null 체크나 유효성 검사를 수행하는 것이 중요합니다.- 클릭 핸들러 함수인
onClick={() => {}}
는 아무런 동작도 하지 않음으로, 해당 이벤트 처리가 필요없는 경우 삭제하는 것이 좋습니다. - 주석이 명확한 정보를 제공하지 않거나 업데이트가 필요한 사례가 있습니다 ("TODO: details.book.title로 변경").
개선 제안:
- 함수 컴포넌트 내부의 중복되는 JSX 코드를 컴포넌트화하여 가독성을 높일 수 있습니다.
- CSS 클래스의 네이밍을 통일하고 일관된 패턴을 적용하여 유지보수성을 향상시킬 수 있습니다.
주요 강점:
- ES6 구문과 TypeScript의 타입 지원을 사용하여 코드의 안정성을 높였습니다.
- JSX 요소와 CSS 클래스를 잘 활용하여 화면 레이아웃을 구성하고 있습니다.
전반적으로 이 코드는 잘 구조화되어 있으며, 개선할 부분은 주로 예외 처리와 유지보수 용이성에 관련되어 있습니다.
solvedProblemRefIds.push(item.problemId); | ||
}); | ||
return solvedProblemRefIds; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드는 대부분 좋아 보입니다. 다음에 주의해야 할 점들은 다음과 같습니다:
useState(false)
의 초기값을 명확히 하세요.- 에러 처리가 전혀 없으므로 API 호출 및 데이터 처리 과정에서 발생할 수 있는 오류를 핸들링할 방법을 고려해야 합니다.
any
사용을 최소화하고 타입을 명확히 지정하는 것이 더 좋습니다.- CSS 클래스명 등을 하드 코딩하여 중복을 줄이고 더 유지보수가 쉬운 방법을 사용해보세요.
- 불필요한
<p>
태그를 제거하고 스타일을 CSS로 옮기는 것이 좋습니다.
이외에도 성능 향상을 위해서 필요한 부분에 memoization이나 useCallback을 고려할 수 있습니다.
round: AlgorithmRound; | ||
setRound: (round: AlgorithmRound) => void; | ||
round: Round; | ||
setRound: (round: Round) => void; | ||
}) { | ||
const params = useParams(); | ||
const studyId = Number(params.id); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰 요약:
-
개선 사항:
- 타입 Round을 알고리즘 라운드 및 책 라운드를 모두 대상으로 하는 넓은 범위로 변경하는 것은 좋은 아이디어입니다.
if
문에 대해 명확한 반환 구문 추가가 유용할 수 있습니다.
-
버그 리스크:
- 현재 코드에서는 심각한 버그 리스크나 보안적인 문제는 보이지 않습니다.
-
추가적인 제안:
- 코드의 일관성을 유지하기 위해 들여쓰기에 주의하세요.
- 코드 주석을 추가하여 특정 부분의 동작을 설명해보세요.
- 변수 및 함수명을 더 명확하게 작성하여 가독성을 향상시킬 수 있습니다.
-
예시 수정사항:
selectDashboardBody
와 같은 함수를 만들어서, 각 라운드 별로 Dashboard Body component를 선택하는 방법을 고려해보세요.- 중복된 부분을 줄일 수 있는 방법을 찾아보세요.
이런 점들을 고려하여 코드를 업데이트하면 좀 더 구조적이고 유지 관리하기 쉬운 코드로 발전할 것입니다.
</Card> | ||
</div> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드는 UI에서 여러 개의 "Card"를 보여주는 컴포넌트를 구현하고 있습니다. 일부 개선할 점 및 버그 가능성은 다음과 같습니다:
- 중복 코드: 카드가 거의 유사한 내용을 가지고 있으므로 중복 코드를 줄이고자 한다.
- 애매한 설명: CardDescription에 있는 내용이 너무 일반적이며 자세한 내용이 없습니다. 정보를 보완해야 합니다.
- 접근성 이슈: CalendarIcon이 단순 이미지로 제공되기 때문에 시각적인 접근성을 고려하여 대체 텍스트나 접근성 요소에 신경을 써야 합니다.
- CSS 클래스 사용: CSS 클래스 이름을 선언적인 방식으로 관리하는 것이 좋습니다. Tailwind CSS 등을 사용하여 스타일을 관리할 수 있습니다.
개선을 위해:
- Card 컴포넌트를 하나로 추출하고, props를 통해 다양한 내용을 전달할 수 있도록 합니다.
- CardDescription에 더 구체적인 내용을 추가하여 사용자가 정보를 더 잘 파악할 수 있도록 합니다.
- CalendarIcon에 대체 텍스트를 제공하거나 시각적인 접근성을 고려하기 위해 알맞은 요소를 추가합니다.
- CSS 클래스를 관리하는 더 나은 방법을 사용하여 스타일을 관리합니다.
이렇게 하면 코드의 가독성과 유지보수성이 향상될 수 있습니다.
<rect width="7" height="7" x="3" y="14" rx="1" /> | ||
</svg> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰 및 개선 제안:
-
PlayIcon
,FilePenIcon
,BellIcon
,BoxIcon
,LayoutGridIcon
함수들은 SVG 아이콘을 렌더링하는 유틸리티 함수로 보임. -
모든 SVG 아이콘 함수들이 중복 코드를 가지고 있음. 공통 부분을 하나의 함수로 추출하여 재사용하도록 변경하는 것이 좋음.
-
props
를 전달하는 방식은 맞지만, 명확한 prop 타입을 정의하여 타입 안정성을 확보하는 것이 바람직함. -
SVG 아이콘의 이름과 관련된 prefix를 추가하여 나중에 코드 트러블 슈팅 시 도움이 될 수 있음.
-
각 아이콘의 경로와 디자인이 올바르게 렌더링되고 있는지 확인할 필요가 있음.
-
파일이 각각 별도의 모듈이어야 하는 경우, 이를 분리하거나 적절한 구조화를 고민해볼 필요가 있음.
} | ||
export interface QuizInfo { | ||
link: string; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 좋은 시작입니다. 몇 가지 개선 제안과 버그 위험 사항은 다음과 같습니다:
Round
및AlgorithmRound
와 같이 유사한 인터페이스 이름을 사용하는 것은 혼란스러울 수 있습니다. 이름을 더 명확하게 만드는 것이 좋습니다.- 인터페이스 및 속성 설명 주석을 추가하여 코드의 가독성을 향상시키세요.
- 마지막으로, 타입들 간에 중복이 발생할 수 있으므로 코드를 정리하여 중복을 없애도록 하세요.
재고 및 개선점을 강조함으로써 이 코드의 질을 향상시킬 수 있을 것입니다.
@@ -16,7 +16,7 @@ export interface Study { | |||
studyType: string; | |||
} | |||
|
|||
interface Spread { | |||
export interface Spread { | |||
left: number; | |||
right: number; | |||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰:
-
주석에서 인터페이스
Study
가 나온 것으로 보아, 추가된 부분은Spread
라는 새로운 인터페이스입니다. -
변경 사항:
Spread
인터페이스가 export되도록 변경되었습니다. 이것은 다른 파일에서 해당 인터페이스를 사용할 수 있도록 해줍니다.
-
개선 제안:
- 기능과 목적에 따라 메서드나 변수 등이 필요한 경우 해당 내용을 추가하면 좋을 것입니다.
- 문서화 요구사항과 팀 코드 스타일 가이드를 따르는지 확인해야 합니다.
- 다른 인터페이스와의 관계 및 일관성을 고려하여 네이밍을 변경하는 것도 고려해볼만합니다.
60fd647
to
df78ee3
Compare
alt="hamster with laptop" | ||
className="w-full max-w-md" | ||
/> | ||
</div> */} | ||
</div> | ||
</> | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰 요약:
- 오타: 'use client' -> 'useContext'
- 올바르지 않은 모듈 이름 ('userState') 수정 필요
- 이미지 소스 경로 정확히 지정 필요
- 주석 처리한 코드는 삭제하거나 필요에 따라 재사용 고려
- UI 구성 및 스타일 일관성 확인
이외에는 주로 코드는 잘 작성되어 있으며 보다 안정적인 코드를 위해 위의 사항들을 검토 및 수정하시면 좋을 것 같습니다.
</article> | ||
</div> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰 요약:
-
잠재적 버그 위험:
<br></br>
: React에서<br>
태그는 닫는 태그를 사용하지 않습니다. 대신<br />
를 사용해야 합니다.
-
개선 제안:
- CSS 클래스 관리를 위해
classnames
패키지 사용 고려. - 텍스트 내용이 길어질 가능성이 있다면 react-intl 또는 i18next와 같은 패키지를 사용하여 다국어 지원을 고려.
- Avatar 컴포넌트의 이미지 로딩 실패에 대비한 오류 처리 추가.
- 코드 일관성을 위해 모든 문자열은 한 곳에 집중하는 방식으로 관리.
- CSS 클래스 관리를 위해
-
기타 제안:
- 코드 중복을 줄이기 위해 상수로 정의할 부분이 있는지 확인.
- 컴포넌트들을 작게 분리하여 재사용성을 높일 수 있도록 구조 변경 고려.
번역하시고 어떤 질문이 있으실까요?
users={round.users} | ||
showPostBoard={showPostBoard} | ||
setShowPostBoard={setShowPostBoard} | ||
/> | ||
</div> | ||
</div> | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치의 리뷰를 진행하겠습니다.
- 개선 사항:
- 코드 확장성을 고려하여, 추가 모듈 및 기능이 필요할 경우 대비하여 적절한 모듈화를 고려해 볼 수 있습니다.
- 현재는 상태 관리에 Recoil을 사용하고 있는데, Context API나 Redux와 같은 다른 상태 관리 라이브러리로도 변경 가능한지 고려해볼 수 있습니다.
- 명확한 오류 처리가 중요한데,
handleStart
내부에서 예외 처리가 충분한지 확인해야 합니다.
- 버그/위험 요소:
refresh
함수는 선언되지 않았는데 사용되고 있습니다. 이 부분에 대해서 정의가 필요합니다.- 컴포넌트 간 데이터 흐름과 의사소통 방법이 명확하지 않습니다. 이로 인한 잠재적인 버그 발생 가능성이 있습니다.
- 코드 스타일:
- 변수명 일관성과 가독성을 높일 수 있도록 변수 명을 명확하게 지어주신 점이 좋습니다.
- 코드의 가독성을 더 향상시키기 위해 주석을 추가하는 것도 고려해볼 만합니다.
코드 자체는 보다 구조적이며 가독성이 높은 편이지만, 위에서 언급한 부분들을 고려하여 더욱 안전하고 유지보수가 용이한 코드로 개선하는 것이 좋습니다.
<b>과제 투표 </b> | ||
</div> | ||
</> | ||
)} | ||
</div> | ||
<div className="mt-6"> | ||
<h3 className="text-lg font-bold"> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치의 짧은 코드 검토는 다음과 같습니다:
-
개선 제안:
- 함수 선언 시 파라미터가 많고 복잡할 때는 구조체로 묶어 관리하는 것이 좋습니다.
- 무의미한 주석 (
{/* TODO details.book.title로 변경 */}
)은 제거해도 무방합니다. - Click 이벤트 처리 부분에 기능을 추가할 수 있도록 함수를 정의하거나 설명하는 주석을 달아주는 것이 좋습니다.
-
버그 리스크:
- 클릭 핸들러 (
onClick={() => {}}
)가 비어 있어 기능이 구현되지 않는 부분이 있습니다. - 변수 또는 상태값에 대한 유효성 검사와 확인이 부족할 수 있습니다.
- 클릭 핸들러 (
-
일반적인 지적:
- JSX에서 클래스 이름을 동적으로 관리할 때 classNames 라이브러리를 사용하여 관리하는 것이 깔끔하며, 가독성을 높일 수 있습니다.
- 코드 스타일이 일관되게 유지되도록 하여 가독성을 향상시킬 수 있습니다.
추가로 실험하거나 수정할 때 문제가 없는지 확인하기 위해 적절한 테스트 케이스 및 테스트 방법을 고려하는 것이 좋습니다.
solvedProblemRefIds.push(item.problemId); | ||
}); | ||
return solvedProblemRefIds; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
위의 코드 패치에 대해 간단한 코드 리뷰를 해드리겠습니다.
-
잠재적 버그:
useState(false)
에서 초기 값인false
를 원하는 값으로 설정하는 게 좋을 것입니다.- 비디오 및 퀴즈 유무를 확인하는 과정에서 해당 값이 예상대로 설정되어 있는지 확인 필요.
-
개선 제안:
- CSS 클래스 이름을 하드코딩하는 대신, 스타일링을 개선하기 위해 CSS 파일이나 CSS-in-JS 라이브러리를 사용할 수 있습니다.
createRefIdToProblemIdMap
의 인자 타입을 명시하여 가독성과 유지보수성을 높일 수 있습니다.- 네임드 익스포트를 사용하여 함수들을 이름으로 내보낼 수 있습니다.
-
질문:
studyId
,roundIdx
,userId
등 일부 파라미터는 이 컴포넌트에서 사용되지 않는 것처럼 보입니다. 이러한 경우라면 필요하지 않은 파라미터를 받는 것은 낭비일 수 있습니다. 필요한 경우 왜 그런지 검토하고 문서화할 필요가 있습니다. -
React Hooks 사용 시 권장 사항을 따르는지 확인하고, 컴포넌트 내의 상태와 이펙트 관리가 적절하게 이루어지고 있는지 꼼꼼히 검토해야 합니다.
round: AlgorithmRound; | ||
setRound: (round: AlgorithmRound) => void; | ||
round: Round; | ||
setRound: (round: Round) => void; | ||
}) { | ||
const params = useParams(); | ||
const studyId = Number(params.id); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드 리뷰 및 개선 제안:
-
개선 안됨:
BookDashBoardBody
및AlgorithmDashBoardBody
함수는 유사한 구조를 가지므로 공통된 부분은 추출해서 함수로 작성하고 해당 함수를 재사용하는 방법으로 코드 중복을 줄일 수 있습니다. -
잠재적 버그:
if (studyType === StudyType.ALGORITHM)
와else if (studyType === StudyType.BOOK)
에서 studyType이 Algorithm 또는 Book 유형인 경우만 고려되고, 다른 유형이 추가될 경우 처리되지 않을 수 있습니다. -
개선 사항: 변수 및 함수 이름을 좀 더 명확하게 지어 가독성을 향상시키는 것이 좋습니다. 변수명과 함수명은 역할을 명확히 나타내야 합니다.
-
추가 개선: TypeScript와 같은 정적 타입 시스템을 사용하여 타입 관련 에러를 컴파일 시에 잡을 수 있도록 하는 등 코드의 안정성을 높일 수 있습니다.
-
약간의 리팩토링: 조건 분기 논리를 간단하게 만들어 가독성을 개선하는 것도 좋을 수 있습니다.
-
최신 도구 사용: 현재 프로젝트 및 의존성의 최신화 여부 확인이 필요합니다.
-
코드 포맷팅: 코드 충돌 가능성 및 가독성을 높이기 위해 일관된 코드 스타일을 적용하는 것이 중요합니다.
-
주석 추가: 코드의 각 부분에 주석을 추가하여 해당 부분의 목적과 동작 방식에 대한 이해를 돕는 것이 좋습니다.
코드 리뷰를 바탕으로 보다 안정적이고 확장 가능한 소프트웨어를 만들기 위해 수정 사항을 검토하고 적용해보세요.
</Card> | ||
</div> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드에는 몇 가지 개선할 점이 있습니다:
- Card 컴포넌트를 여러 번 반복하는 대신, 반복되는 부분을 함수로 추출하여 재사용할 수 있습니다.
- "8월 17일"과 같은 텍스트는 하드코딩되어 있으므로 동적으로 생성할 수 있는 방법을 고려할 수 있습니다.
- Card 컴포넌트와 관련된 스타일 및 클래스의 중복을 줄이기 위해 CSS 클래스를 효율적으로 정리하고 적용할 수 있습니다.
주요 버그에 대해서는 현재 코드 블록에서 명확한 버그가 보이지는 않습니다. 다만 코드의 유지보수성을 개선하기 위해 위 내용들을 고려하는 것이 좋을 것입니다.
CardFooter, | ||
CardHeader, | ||
CardTitle | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드는 일반적인 리액트 컴포넌트들로 구성되어 있으며, 주요한 결함은 없습니다. 다음 개선 제안 사항이 있을 수 있습니다:
- PropTypes 또는 TypeScript를 사용하여 prop types를 명확히 정의하는 것이 좋습니다.
- CSS 클래스 이름을 동적으로 생성하고 관리하는 라이브러리나 방법론을 사용할 수 있습니다 (예:
classnames
). - 컴포넌트들 간에 중복된 스타일 속성이 있다면 이들을 별도의 공통 스타일로 분리하여 재사용성과 유지보수성을 향상시킬 수 있습니다.
위의 변경으로 코드의 가독성 및 확장성을 향상시킬 수 있습니다.
<rect width="7" height="7" x="3" y="14" rx="1" /> | ||
</svg> | ||
); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 패치는 SVG 아이콘 컴포넌트를 정의하고 있습니다. 코드 자체에 큰 결함은 보이지 않지만 몇 가지 개선 사항이 있을 수 있습니다:
Record<string, string>
대신 더 구체적인 타입을 지정하여 props의 객체 구조를 명확히 할 수 있습니다.- SVG를 정의할 때 사용되는 상수들(예: 너비, 높이, 색상 등)을 변수로 만들어 재사용성을 늘릴 수 있습니다.
- 접근 가능성을 향상시키기 위해 세부 주석을 추가할 수 있습니다.
- 각 함수가 반복되는 부분이 많으므로 이를 줄이는 방법을 고민해볼 수 있습니다(예: 중복 코드 제거).
위의 점을 고려하여 코드의 가독성과 유지보수성을 향상시킬 수 있을 것입니다.
} | ||
export interface QuizInfo { | ||
link: string; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드 리뷰에서 발견된 면은 다음과 같습니다:
- BookRound 인터페이스에 "users" 필드가 중복 정의되었습니다.
- BookStudyDetails, BookMemberInfo, VideoInfo 및 QuizInfo에서 "link" 필드명을 통일하는 것이 좋습니다.
- Round과 AlgorithmRound 사이의 관계가 모호해 보입니다. 두 인터페이스 간의 명확한 구분이 필요할 수 있습니다.
개선 제안:
- 중복 정의 및 혼란을 줄이기 위해 상속과 인터페이스 명명을 재구성합니다.
- 필드명을 통일하여 일관성을 갖춥니다.
- 주석을 추가하여 각 인터페이스의 목적을 명확히 합니다.
@@ -16,7 +16,7 @@ export interface Study { | |||
studyType: string; | |||
} | |||
|
|||
interface Spread { | |||
export interface Spread { | |||
left: number; | |||
right: number; | |||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해당 코드 패치를 간단하게 검토하겠습니다.
-
버그 위험:
- 이 코드 패치는 전반적으로 안전한 것으로 보입니다. 그러나 타입스크립트의 인터페이스에 대한 변경은 해당 인터페이스를 사용하는 다른 부분에 영향을 줄 수 있으므로 해당 부분도 함께 업데이트되어야 합니다.
-
개선 제안:
- 인터페이스
Spread
가 수정되어 외부에서 더 적극적으로 활용될 수 있도록 내보내기(public)로 선언된 것은 좋은 선택처럼 보입니다. - 변수명과 함수명이 명확하고 의미있는지 확인하고, 필요 시 개선하세요.
- 인터페이스
이상입니다.
작업 개요
메인페이지
햄스터 없는 버전
서적 스터디 메인페이지
스터디 공지사항 목록
스터디 공지사항 글
전달 사항
참고 자료