Go 주니어 시스템 설계 기술면접

Go 주니어 (1~3년) 시스템 설계 5문항 조회수 106 · 2026-05-05 (화) 19:10:52
1 API 설계
Medium

Q. 전자상거래 플랫폼에서 상품 검색 API를 설계한다고 가정합니다. 검색어, 카테고리 필터, 가격 범위, 정렬 옵션, 페이지네이션을 지원해야 할 때, RESTful API의 URL 구조와 쿼리 파라미터를 어떻게 설계하시겠습니까? 또한 응답 데이터 구조는 어떻게 설계하는 것이 좋을까요?

A. 모범답안

GET /api/v1/products/search 엔드포인트를 사용하며, 쿼리 파라미터로 q(검색어), category(카테고리), min_price, max_price(가격 범위), sort_by(정렬 기준), order(asc/desc), page, limit(페이지네이션)을 받도록 설계합니다. 응답은 products 배열과 함께 total_count, current_page, total_pages 같은 메타데이터를 포함한 구조로 반환하여 클라이언트가 페이지네이션을 구현할 수 있도록 합니다. 모든 파라미터는 선택적(optional)으로 처리하며, 기본값을 설정하여 유연성을 제공합니다.

핵심 포인트
  • • RESTful 설계 원칙에 따라 GET 메서드와 명확한 리소스 경로 사용
  • • 쿼리 파라미터로 필터링, 정렬, 페이지네이션 옵션 제공
  • • 응답에 데이터와 메타데이터를 함께 포함하여 클라이언트 편의성 제공
  • • API 버저닝(v1)을 포함하여 향후 확장성 고려
Follow-up 질문

검색 결과가 수백만 건일 때 페이지네이션 성능을 개선하기 위해 offset 방식 대신 커서 기반 페이지네이션을 사용한다면 API 설계를 어떻게 변경하시겠습니까?

2 DB 모델링
Medium

Q. 온라인 강의 플랫폼을 개발할 때 강의(Course), 섹션(Section), 레슨(Lesson)의 계층 구조를 데이터베이스에 어떻게 모델링하시겠습니까? 각 테이블의 주요 컬럼과 관계 설정, 그리고 레슨의 순서를 관리하는 방법을 설명해주세요.

A. 모범답안

courses 테이블(id, title, description, instructor_id, created_at), sections 테이블(id, course_id, title, order_index), lessons 테이블(id, section_id, title, content, video_url, duration, order_index)로 설계합니다. course_id와 section_id는 각각 외래키로 설정하여 1:N 관계를 구현하고, ON DELETE CASCADE 옵션으로 상위 항목 삭제 시 하위 항목도 함께 삭제되도록 합니다. order_index 컬럼(정수형)을 사용하여 섹션과 레슨의 순서를 관리하며, 순서 변경 시 해당 값만 업데이트합니다. course_id와 section_id에는 인덱스를 생성하여 조회 성능을 최적화합니다.

핵심 포인트
  • • 계층 구조를 외래키 관계로 명확하게 표현
  • • order_index 컬럼으로 순서 관리 구현
  • • ON DELETE CASCADE로 데이터 무결성 유지
  • • 외래키 컬럼에 인덱스 추가로 조회 성능 최적화
Follow-up 질문

한 강의를 조회할 때 모든 섹션과 레슨 정보를 함께 가져와야 한다면, Go에서 N+1 쿼리 문제를 방지하기 위해 어떤 방법을 사용하시겠습니까?

3 확장성
Medium

Q. 사용자가 업로드한 이미지 파일을 처리하는 API를 개발할 때, 파일 저장 위치와 URL 구조를 어떻게 설계하시겠습니까? 또한 트래픽이 증가하여 서버를 여러 대로 확장해야 할 때 고려해야 할 사항은 무엇인가요?

A. 모범답안

파일은 서버의 로컬 파일 시스템이 아닌 AWS S3, Google Cloud Storage 같은 객체 스토리지에 저장하는 것이 확장성 측면에서 유리합니다. 파일명은 UUID나 해시값을 사용하여 중복을 방지하고, 업로드 날짜 기반으로 디렉토리를 구성(예: /2024/01/15/uuid.jpg)하여 관리합니다. DB에는 파일의 메타데이터(파일명, 크기, MIME 타입, 저장 경로)만 저장하고, 실제 파일 URL은 객체 스토리지의 주소를 반환합니다. 여러 서버로 확장 시에도 모든 서버가 동일한 객체 스토리지를 참조하므로 파일 동기화 문제가 발생하지 않습니다.

핵심 포인트
  • • 객체 스토리지 사용으로 서버 확장 시 파일 동기화 문제 해결
  • • 고유한 파일명 생성으로 중복 방지
  • • DB에는 메타데이터만 저장하고 실제 파일은 분리 저장
  • • 날짜 기반 디렉토리 구조로 파일 관리 용이성 확보
Follow-up 질문

이미지 업로드 후 썸네일 생성이나 리사이징 같은 무거운 처리 작업이 필요하다면, API 응답 속도를 유지하면서 이를 처리하기 위해 어떤 아키텍처를 적용하시겠습니까?

4 캐싱
Medium

Q. 실시간 환율 정보를 제공하는 API를 개발한다고 가정합니다. 외부 환율 API를 호출하는 비용을 줄이면서도 사용자에게는 최신 정보를 제공해야 할 때, Go에서 어떤 캐싱 전략을 사용하시겠습니까? 캐시 만료 시간과 갱신 방식을 어떻게 설계하는 것이 적절한지 설명해주세요.

A. 모범답안

Redis를 캐시 저장소로 사용하고, TTL(Time To Live)을 5분으로 설정하여 환율 데이터를 캐싱합니다. API 요청 시 먼저 Redis에서 데이터를 조회하고, 캐시가 없거나 만료되었을 때만 외부 API를 호출합니다. 더 나아가 Cache-Aside 패턴과 함께 백그라운드에서 주기적으로 캐시를 갱신하는 방식(예: cron job이나 goroutine으로 3분마다 갱신)을 적용하면, 캐시 만료로 인한 응답 지연을 방지할 수 있습니다. 환율 데이터의 키는 통화 쌍(예: USD_KRW)을 사용하여 구분합니다.

핵심 포인트
  • • Redis를 활용한 분산 캐싱으로 여러 서버 간 캐시 공유
  • • 적절한 TTL 설정으로 비용과 최신성 균형 유지
  • • Cache-Aside 패턴으로 캐시 미스 시 데이터 조회 및 저장
  • • 백그라운드 갱신으로 사용자 응답 지연 최소화
Follow-up 질문

외부 API 호출이 실패했을 때 오래된 캐시 데이터라도 반환하는 것이 나을 수 있습니다. 이런 Stale-While-Revalidate 전략을 Go에서 어떻게 구현하시겠습니까?

5 보안
Medium

Q. 사용자 회원가입 API를 개발할 때 비밀번호를 안전하게 저장하고 관리하기 위한 방법을 설명해주세요. Go에서 어떤 라이브러리를 사용하며, 비밀번호 검증 시에는 어떤 과정을 거쳐야 하나요? 또한 비밀번호 정책은 어떻게 설정하는 것이 좋을까요?

A. 모범답안

비밀번호는 절대 평문으로 저장하지 않고, golang.org/x/crypto/bcrypt 패키지를 사용하여 해싱한 후 저장합니다. bcrypt.GenerateFromPassword 함수로 솔트가 자동으로 포함된 해시를 생성하고, 로그인 시에는 bcrypt.CompareHashAndPassword로 입력된 비밀번호와 저장된 해시를 비교합니다. 비밀번호 정책으로는 최소 8자 이상, 영문 대소문자, 숫자, 특수문자 중 3가지 이상 조합을 요구하며, 정규표현식으로 검증합니다. 추가적으로 비밀번호 변경 주기 안내, 이전 비밀번호 재사용 방지, 로그인 실패 횟수 제한 등의 보안 정책도 함께 구현하는 것이 좋습니다.

핵심 포인트
  • • bcrypt를 사용한 안전한 비밀번호 해싱 및 검증
  • • 솔트가 자동으로 포함되어 레인보우 테이블 공격 방어
  • • 적절한 비밀번호 복잡도 정책 적용
  • • 로그인 실패 제한으로 무차별 대입 공격 방지
Follow-up 질문

비밀번호 재설정 기능을 구현할 때 이메일로 전송하는 재설정 토큰은 어떻게 생성하고 관리해야 안전한가요? 토큰의 유효 시간과 일회용 처리는 어떻게 구현하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!