Go 시니어 프레임워크 기술면접

Go 시니어 (7년+) 프레임워크 5문항 조회수 91 · 2026-07-28 (화) 19:11:02
1 Go Generics
Hard

Q. Go 1.18에서 도입된 Generics의 설계 철학과 제약사항을 설명하고, 기존 interface{} 기반 코드와 비교했을 때의 성능 차이와 타입 안정성 측면의 이점을 설명해주세요. 또한 실무에서 Generics를 도입할 때 기존 코드베이스와의 호환성 유지 전략과 과도한 사용을 피해야 하는 이유를 함께 말씀해주세요.

A. 모범답안

Go Generics는 컴파일 타임 타입 체크를 통해 런타임 오버헤드 없이 타입 안정성을 제공합니다. interface{}는 런타임에 타입 어서션이 필요하고 리플렉션 사용 시 성능 저하가 발생하지만, Generics는 monomorphization을 통해 각 타입별로 최적화된 코드를 생성합니다. 기존 코드와의 호환성을 위해 점진적 도입 전략을 사용하며, 공통 자료구조나 알고리즘에만 적용하고 비즈니스 로직에는 신중하게 접근해야 합니다. 과도한 사용은 코드 복잡도를 높이고 컴파일 시간을 증가시키므로, 실제로 여러 타입에서 재사용되는 경우에만 사용하는 것이 좋습니다.

핵심 포인트
  • • 컴파일 타임 타입 체크로 타입 안정성 보장, 런타임 오버헤드 없음
  • • Monomorphization을 통한 타입별 최적화 코드 생성
  • • 공통 자료구조/알고리즘에만 선택적 적용, 비즈니스 로직은 신중히 접근
  • • 과도한 사용 시 컴파일 시간 증가 및 코드 복잡도 상승
Follow-up 질문

Type constraint에서 comparable과 any의 차이점과 각각의 사용 사례를 설명해주세요. 또한 custom constraint를 정의할 때 주의해야 할 점은 무엇인가요?

2 Go Reflection
Hard

Q. Go의 reflection 패키지를 사용한 동적 타입 처리의 동작 원리와 성능 영향을 설명하고, ORM이나 JSON 마샬링 같은 라이브러리에서 reflection을 어떻게 활용하는지 설명해주세요. 또한 reflection 사용을 최소화하거나 대체할 수 있는 code generation 기반 접근법의 장단점을 비교해주세요.

A. 모범답안

Reflection은 런타임에 타입 정보를 검사하고 조작할 수 있게 하지만, 타입 안정성을 잃고 성능 오버헤드가 발생합니다. reflect.TypeOf와 reflect.ValueOf를 통해 구조체 필드를 순회하며 동적으로 값을 설정할 수 있어 JSON 마샬링이나 ORM에서 활용됩니다. Code generation은 빌드 타임에 타입별 코드를 생성하여 런타임 성능을 향상시키지만, 빌드 프로세스가 복잡해지고 생성된 코드 관리가 필요합니다. 고성능이 요구되는 핫패스에서는 code generation을, 유연성이 중요한 설정 파싱 등에서는 reflection을 사용하는 것이 적절합니다.

핵심 포인트
  • • Reflection은 런타임 타입 검사/조작 가능하지만 성능 오버헤드와 타입 안정성 손실
  • • JSON 마샬링, ORM 등에서 구조체 필드 동적 접근에 활용
  • • Code generation은 빌드 타임 코드 생성으로 런타임 성능 향상
  • • 성능 중요 영역은 code generation, 유연성 중요 영역은 reflection 선택
Follow-up 질문

reflect.Value의 CanSet과 CanAddr 메서드의 차이점과 unexported 필드에 접근할 때의 제약사항을 설명해주세요.

3 Go Module & Dependency Management
Medium

Q. Go Modules의 버전 관리 메커니즘과 semantic versioning을 설명하고, go.mod와 go.sum 파일의 역할 차이를 설명해주세요. 또한 대규모 모노레포 환경에서 여러 모듈을 관리할 때의 전략과 indirect dependency 버전 충돌 해결 방법을 제시해주세요.

A. 모범답안

Go Modules는 semantic versioning을 기반으로 major 버전이 변경되면 import path도 변경됩니다(v2+). go.mod는 직접 의존성과 최소 요구 버전을 명시하고, go.sum은 모든 의존성의 체크섬을 저장하여 무결성을 보장합니다. 모노레포에서는 각 서비스를 별도 모듈로 분리하거나 workspace 기능을 활용하며, replace directive로 로컬 개발을 지원합니다. Indirect dependency 충돌은 go get -u를 통한 업데이트나 exclude directive로 특정 버전을 배제하며, 최종적으로는 minimal version selection 알고리즘이 가장 낮은 호환 버전을 선택합니다.

핵심 포인트
  • • Semantic versioning 기반, major 버전 변경 시 import path 변경 (v2+)
  • • go.mod는 직접 의존성 명시, go.sum은 체크섬으로 무결성 보장
  • • 모노레포에서는 workspace 기능 또는 replace directive 활용
  • • Minimal version selection으로 가장 낮은 호환 버전 자동 선택
Follow-up 질문

Go 1.18의 workspace 기능과 기존 replace directive의 차이점은 무엇이며, 각각 어떤 상황에서 사용하는 것이 적절한가요?

4 Go Build & Compilation
Hard

Q. Go의 빌드 프로세스와 링킹 메커니즘을 설명하고, build tag와 conditional compilation을 활용한 환경별 빌드 전략을 제시해주세요. 또한 CGO를 사용할 때의 성능 영향과 크로스 컴파일 시 제약사항, 그리고 바이너리 크기 최적화 방법을 설명해주세요.

A. 모범답안

Go는 정적 링킹을 기본으로 하여 단일 바이너리를 생성하며, build tag를 통해 파일 단위로 조건부 컴파일이 가능합니다. 환경별 설정은 build tag나 -ldflags를 활용해 빌드 타임에 주입합니다. CGO는 C 라이브러리 호출 시 goroutine 스케줄링 오버헤드가 발생하고 크로스 컴파일이 복잡해지므로 가능하면 pure Go 구현을 선호합니다. 바이너리 크기 최적화는 -ldflags='-s -w'로 디버그 정보 제거, UPX 압축, 불필요한 의존성 제거 등을 통해 수행하며, 프로덕션에서는 크기와 디버깅 가능성의 트레이드오프를 고려해야 합니다.

핵심 포인트
  • • 정적 링킹으로 단일 바이너리 생성, build tag로 조건부 컴파일
  • • CGO는 스케줄링 오버헤드 발생, 크로스 컴파일 복잡, pure Go 선호
  • • 바이너리 최적화: -ldflags='-s -w', UPX 압축, 의존성 정리
  • • 크기 최적화와 디버깅 가능성의 트레이드오프 고려 필요
Follow-up 질문

Go 1.20에서 도입된 PGO(Profile-Guided Optimization)의 동작 원리와 실제 적용 시 성능 개선 효과, 그리고 프로파일 수집 전략을 설명해주세요.

5 Go Standard Library Internals
Hard

Q. Go의 net/http 패키지에서 HTTP/2 지원과 connection pooling 메커니즘을 설명하고, Transport의 설정 파라미터(MaxIdleConns, IdleConnTimeout 등)가 성능과 리소스 사용에 미치는 영향을 분석해주세요. 또한 keep-alive connection의 재사용 전략과 connection leak을 방지하는 방법을 설명해주세요.

A. 모범답안

net/http는 기본적으로 HTTP/2를 지원하며 자동으로 프로토콜 협상을 수행합니다. Transport는 내부적으로 connection pool을 관리하여 동일 호스트로의 요청을 재사용하며, MaxIdleConns는 전체 유휴 연결 수, MaxIdleConnsPerHost는 호스트별 제한을 설정합니다. IdleConnTimeout은 유휴 연결 유지 시간을 제어하여 메모리와 소켓 리소스를 관리합니다. Connection leak 방지를 위해서는 반드시 response.Body.Close()를 호출해야 하며, defer를 사용하거나 context timeout을 설정하여 장시간 대기를 방지해야 합니다. 고부하 환경에서는 MaxConnsPerHost를 조정하여 백엔드 서버 부하를 제어합니다.

핵심 포인트
  • • HTTP/2 자동 지원 및 프로토콜 협상, Transport의 connection pool 관리
  • • MaxIdleConns, MaxIdleConnsPerHost로 연결 재사용 제어
  • • IdleConnTimeout으로 유휴 연결 타임아웃 관리, 리소스 최적화
  • • response.Body.Close() 필수 호출 및 context timeout으로 leak 방지
Follow-up 질문

HTTP/1.1과 HTTP/2에서 connection pooling 동작의 차이점과 HTTP/2의 멀티플렉싱이 실제 성능에 미치는 영향을 설명해주세요.

댓글 0

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

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