Next.js 주니어 시스템 설계 면접
새 면접Q. Next.js에서 사용자 프로필 조회 API를 설계할 때, 공개 프로필과 비공개 프로필을 구분하여 처리하는 방법을 설명하고, 응답 데이터 구조와 적절한 HTTP 상태 코드를 제안해주세요.
공개/비공개 여부는 데이터베이스의 isPublic 필드로 관리하며, API에서 요청자의 인증 상태를 확인합니다. 비공개 프로필의 경우 본인이거나 친구 관계인 경우에만 전체 정보를 반환하고, 그 외에는 403 Forbidden을 반환합니다. 공개 프로필은 누구나 조회 가능하지만 민감한 정보(이메일, 전화번호)는 제외합니다. 응답 구조는 { success: boolean, data: {...}, message: string } 형태로 일관성 있게 설계하며, 성공 시 200, 찾을 수 없을 때 404, 권한 없을 때 403을 반환합니다.
- • 데이터베이스에서 공개/비공개 상태를 필드로 관리
- • 요청자의 인증 상태와 권한을 검증하여 접근 제어
- • 민감한 정보는 조건부로 필터링하여 응답
- • 일관된 응답 구조와 적절한 HTTP 상태 코드 사용
만약 프로필 조회 횟수를 제한해야 한다면(Rate Limiting) 어떤 방식으로 구현할 수 있을까요?
Q. 소셜 미디어 애플리케이션에서 사용자 간 팔로우 관계를 데이터베이스에 모델링할 때, 테이블 구조를 설계하고 '맞팔로우' 관계를 효율적으로 조회하는 방법을 설명해주세요.
Follow 테이블을 생성하여 follower_id와 following_id 컬럼으로 관계를 저장합니다. 기본키는 (follower_id, following_id) 복합키로 설정하여 중복 팔로우를 방지합니다. 맞팔로우 관계는 두 개의 레코드가 서로 반대 방향으로 존재하는지 확인하는 쿼리로 조회합니다. 성능 최적화를 위해 follower_id와 following_id 각각에 인덱스를 생성하며, 팔로워 수와 팔로잉 수는 User 테이블에 비정규화하여 카운트 컬럼으로 관리할 수 있습니다.
- • Follow 테이블에 follower_id, following_id로 관계 저장
- • 복합 기본키로 중복 팔로우 방지
- • 맞팔로우는 양방향 레코드 존재 여부로 확인
- • 인덱스 생성과 카운트 컬럼 비정규화로 성능 최적화
팔로워가 수백만 명인 인플루언서의 팔로워 목록을 조회할 때 발생할 수 있는 성능 문제와 해결 방법은 무엇인가요?
Q. Next.js에서 사용자별로 개인화된 대시보드 데이터를 캐싱할 때, 전체 캐싱과 부분 캐싱 전략의 차이를 설명하고 어떤 상황에서 각각을 사용해야 하는지 제안해주세요.
전체 캐싱은 대시보드 전체를 하나의 캐시 키로 저장하는 방식으로 구현이 간단하지만 일부 데이터만 변경되어도 전체를 갱신해야 합니다. 부분 캐싱은 위젯별로 독립적인 캐시 키를 사용하여 변경된 부분만 무효화할 수 있어 효율적입니다. 정적인 데이터가 많고 업데이트 빈도가 낮으면 전체 캐싱을, 실시간 알림이나 메시지처럼 일부 영역만 자주 변경되면 부분 캐싱을 사용합니다. 캐시 키는 user:{userId}:dashboard 또는 user:{userId}:widget:{widgetName} 형태로 네이밍하여 관리합니다.
- • 전체 캐싱은 구현 간단하지만 부분 변경 시 비효율적
- • 부분 캐싱은 위젯별 독립 캐시로 선택적 무효화 가능
- • 데이터 변경 빈도와 패턴에 따라 전략 선택
- • 체계적인 캐시 키 네이밍 규칙 적용
여러 위젯의 데이터를 한 번에 조회해야 할 때, 캐시 미스가 발생한 위젯만 DB에서 가져오는 로직을 어떻게 구현할 수 있을까요?
Q. Next.js로 구축한 파일 업로드 API에서 대용량 파일(100MB 이상) 업로드 시 발생할 수 있는 문제점과 이를 해결하기 위한 설계 방안을 제안해주세요.
대용량 파일을 한 번에 업로드하면 메모리 부족, 타임아웃, 네트워크 오류 시 재업로드 문제가 발생합니다. 해결 방안으로 멀티파트 업로드(Chunked Upload)를 구현하여 파일을 작은 청크로 나누어 순차적으로 업로드합니다. 각 청크는 독립적으로 업로드되며 실패 시 해당 청크만 재시도합니다. 서버에서는 청크를 임시 저장소에 모은 후 모든 청크가 도착하면 병합합니다. AWS S3의 Multipart Upload나 Azure Blob Storage의 Block Blob을 활용하면 클라우드 레벨에서 이를 지원받을 수 있습니다.
- • 대용량 파일은 메모리, 타임아웃, 재업로드 문제 발생
- • 멀티파트 업로드로 파일을 청크 단위로 분할
- • 청크별 독립 업로드 및 실패 시 부분 재시도
- • 클라우드 스토리지의 멀티파트 업로드 기능 활용
동시에 여러 파일을 업로드할 때 서버 리소스를 보호하기 위한 동시성 제어 방법은 무엇인가요?
Q. Next.js API Route에서 파일 다운로드 기능을 구현할 때, 경로 탐색(Path Traversal) 공격을 방지하기 위한 보안 검증 방법과 안전한 파일 접근 전략을 설명해주세요.
경로 탐색 공격은 '../../../etc/passwd'와 같은 상대 경로를 사용해 허용되지 않은 파일에 접근하는 공격입니다. 방어를 위해 사용자 입력 파일명에서 '..'와 '/' 같은 특수 문자를 제거하거나 거부하고, path.basename()으로 파일명만 추출합니다. 파일은 화이트리스트 기반으로 허용된 확장자만 다운로드 가능하도록 검증하며, 실제 파일 경로는 서버 내부에서만 관리하고 사용자에게 노출하지 않습니다. 데이터베이스에 파일 메타데이터를 저장하고 UUID 같은 안전한 식별자로 파일을 조회하는 방식이 안전합니다.
- • 사용자 입력에서 상대 경로 문자 제거 및 basename 추출
- • 화이트리스트 기반 파일 확장자 검증
- • 실제 파일 경로를 사용자에게 노출하지 않음
- • UUID 등 안전한 식별자로 파일 접근 관리
다운로드 권한이 있는 사용자만 파일에 접근할 수 있도록 하려면 어떤 인증 및 인가 로직을 추가해야 하나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!