C#/.NET 백엔드 개발자 면접 질문: 완벽 가이드

Milad Bonakdar
작성자
ASP.NET Core, Entity Framework, 의존성 주입, 시스템 설계 등 필수 면접 질문을 통해 C# 및 .NET 백엔드 개발을 마스터하세요.
소개
C#과 .NET은 고성능 백엔드 시스템 구축을 위한 강력한 크로스 플랫폼 생태계로 크게 발전했습니다. .NET Core(현재는 .NET 5+)의 등장으로 클라우드 네이티브 애플리케이션, 마이크로서비스 및 엔터프라이즈 솔루션을 위한 최고의 선택이 되었습니다.
이 가이드에서는 C# 및 .NET을 전문으로 하는 백엔드 개발자를 위한 필수 면접 질문을 다룹니다. 언어 기본 사항, ASP.NET Core 아키텍처, Entity Framework를 사용한 데이터베이스 상호 작용 및 다음 면접을 준비하는 데 도움이 되는 모범 사례를 살펴봅니다.
C# 언어 기본 사항
1. C#에서 struct와 class의 차이점은 무엇입니까?
답변:
- Class: 참조 형식(힙에 할당). 클래스 객체를 메서드에 전달할 때 메모리 위치에 대한 참조를 전달합니다. 메서드 내부의 변경 사항은 원래 객체에 영향을 줍니다. 상속을 지원합니다.
- Struct: 값 형식(스택에 할당). 구조체를 전달할 때 데이터의 복사본이 전달됩니다. 메서드 내부의 변경 사항은 원래 구조체에 영향을 주지 않습니다. 상속을 지원하지 않지만 인터페이스를 구현할 수 있습니다.
- 사용법:
struct는 단일 값을 나타내는 작고 변경 불가능한 데이터 구조(Point,Color등)에 사용합니다. 대부분의 다른 객체에는class를 사용합니다.
희소성: 일반적 난이도: 쉬움
2. async 및 await에 대해 설명하세요. 확장성에 어떻게 도움이 됩니까?
답변:
async 및 await는 비동기 프로그래밍에 사용되는 키워드입니다.
- 메커니즘:
await키워드가 발생하면 메서드 실행이 일시 중지되고 스레드는 다른 요청을 처리하기 위해 스레드 풀로 반환됩니다. 대기 중인 작업이 완료되면 실행이 재개됩니다(다른 스레드에서 실행될 수 있음). - 확장성: 웹 서버(예: Kestrel)에서 스레드는 제한된 리소스입니다. 스레드가 I/O(데이터베이스, 네트워크)를 기다리는 동안 차단되면 다른 요청을 처리할 수 없습니다. Async를 사용하면 서버가 I/O 작업 중에 스레드를 차단하지 않아 더 적은 스레드로 훨씬 더 많은 동시 요청을 처리할 수 있습니다.
희소성: 매우 일반적 난이도: 중간
3. 종속성 주입(DI)이란 무엇이며 .NET에서 어떻게 구현됩니까?
답변: 종속성 주입은 클래스의 종속성이 내부적으로 생성되는 것이 아니라 외부에서 제공되는 디자인 패턴입니다.
- .NET에서: ASP.NET Core에는 기본 제공 DI 컨테이너가 있습니다.
Program.cs(또는 이전 버전의Startup.cs)에서 서비스를 등록하고 생성자 주입을 통해 주입합니다. - 수명:
- Transient: 요청될 때마다 생성됩니다.
- Scoped: 클라이언트 요청(HTTP 요청)당 한 번 생성됩니다.
- Singleton: 처음 요청될 때 생성되고 모든 후속 요청에서 공유됩니다.
희소성: 매우 일반적 난이도: 중간
4. IEnumerable<T>와 IQueryable<T>의 차이점은 무엇입니까?
답변:
IEnumerable<T>: 메모리에서 쿼리를 실행합니다. 데이터베이스(EF Core)와 함께 사용하는 경우 서버에서 클라이언트 메모리로 모든 데이터를 가져온 다음 필터링합니다. LINQ to Objects에 적합합니다.IQueryable<T>: 원격으로 쿼리를 실행합니다(예: SQL 서버). SQL 쿼리로 변환되는 식 트리를 빌드합니다. 필터링은 데이터베이스 측에서 수행되므로 대규모 데이터 세트에 훨씬 더 효율적입니다.
희소성: 일반적 난이도: 중간
5. 확장 메서드란 무엇입니까?
답변: 확장 메서드를 사용하면 새 파생 형식을 만들거나 다시 컴파일하거나 원래 형식을 수정하지 않고도 기존 형식에 메서드를 "추가"할 수 있습니다.
- 구문: 정적 클래스의 정적 메서드로 정의됩니다. 첫 번째 매개 변수는 메서드가 작동하는 형식을 지정하며
this키워드가 앞에 옵니다. - 예제:
string클래스에WordCount()메서드 추가.
희소성: 일반적 난이도: 쉬움
ASP.NET Core 및 아키텍처
6. ASP.NET Core에서 미들웨어란 무엇입니까?
답변: 미들웨어는 요청 및 응답을 처리하기 위해 애플리케이션 파이프라인으로 조립되는 소프트웨어 구성 요소입니다.
- 파이프라인: 각 구성 요소는 요청을 파이프라인의 다음 구성 요소로 전달할지 여부를 선택하고 다음 구성 요소가 호출되기 전후에 작업을 수행할 수 있습니다.
- 예: 인증, 권한 부여, 로깅, 예외 처리, 정적 파일 제공.
- 순서 중요:
Program.cs에 미들웨어가 추가되는 순서에 따라 실행 순서가 정의됩니다.
희소성: 매우 일반적 난이도: 중간
7. .NET Core와 .NET Framework의 차이점을 설명하세요.
답변:
- .NET Framework: 원래 Windows 전용 구현입니다. 성숙했지만 Windows에 종속됩니다.
- .NET Core (현재는 그냥 .NET): 크로스 플랫폼, 오픈 소스 및 모듈식 구현입니다. Windows, Linux 및 macOS에서 실행됩니다. 고성능 및 클라우드 배포에 최적화되어 있습니다.
- 주요 차이점: 크로스 플랫폼 지원, 마이크로서비스 아키텍처에 적합, 더 높은 성능, side-by-side 버전 관리.
희소성: 일반적 난이도: 쉬움
8. Kestrel이란 무엇입니까?
답변: Kestrel은 ASP.NET Core 템플릿에 기본적으로 포함된 크로스 플랫폼, 오픈 소스, 이벤트 기반 웹 서버입니다.
- 역할: HTTP 요청을 수신하고 애플리케이션으로 전달합니다.
- 사용법: 독립 실행형(에지 서버)으로 실행하거나 IIS, Nginx 또는 Apache와 같은 역방향 프록시 뒤에서 실행할 수 있습니다. 보안, 로드 밸런싱 및 SSL 종료를 처리하기 위해 프로덕션 환경에서는 역방향 프록시를 사용하는 것이 좋습니다.
희소성: 중간 난이도: 중간
9. ASP.NET Core에서 전역 예외 처리를 어떻게 처리합니까?
답변: 모든 컨트롤러에서 try-catch 블록을 사용하는 대신 전역 예외 처리를 위해 미들웨어를 사용해야 합니다.
UseExceptionHandler: 예외를 캡처하고, 로깅하고, 대체 파이프라인에서 요청을 다시 실행하는 기본 제공 미들웨어(일반적으로 오류 페이지 또는 API 응답을 가리킴).- 사용자 지정 미들웨어: 사용자 지정 미들웨어를 작성하여 예외를 캡처하고 표준화된 JSON 오류 응답(
ProblemDetails등)을 반환할 수 있습니다.
희소성: 일반적 난이도: 중간
데이터베이스 및 Entity Framework
10. Entity Framework Core(EF Core)란 무엇입니까? Code-First vs. Database-First?
답변: EF Core는 .NET용 ORM(개체 관계형 매퍼)입니다. 개발자가 .NET 개체를 사용하여 데이터베이스를 사용할 수 있도록 합니다.
- Code-First: 도메인 클래스(엔터티)를 먼저 정의하고 EF Core는 마이그레이션을 사용하여 이를 기반으로 데이터베이스 스키마를 만들거나 업데이트합니다. 새 프로젝트에 선호됩니다.
- Database-First: 기존 데이터베이스가 있고 EF Core는 스키마를 기반으로 .NET 클래스(스캐폴딩)를 생성합니다.
희소성: 일반적 난이도: 쉬움
11. EF Core에서 N+1 문제란 무엇이며 어떻게 해결합니까?
답변: N+1 문제는 엔터티 목록(1 쿼리)을 가져온 다음 루프에서 각 항목에 대한 관련 엔터티에 액세스하여 N개의 추가 쿼리를 발생시키는 경우 발생합니다.
- 해결:
.Include()메서드를 사용하여 Eager Loading을 사용합니다. 이렇게 하면 단일 쿼리에서 관련 데이터를 가져오기 위해 SQLJOIN이 생성됩니다. - 예제:
context.Orders.Include(o => o.Customer).ToList();
희소성: 매우 일반적 난이도: 중간
12. 리포지토리 패턴에 대해 설명하세요. EF Core와 함께 사용하는 이유는 무엇입니까?
답변: 리포지토리 패턴은 도메인 객체에 액세스하기 위한 컬렉션과 유사한 인터페이스를 사용하여 도메인 및 데이터 매핑 계층 간을 중재합니다.
- 장점: 특정 데이터 액세스 기술(EF Core)에서 애플리케이션을 분리하고, 단위 테스트를 더 쉽게 만들고(리포지토리를 모의할 수 있음), 데이터 액세스 로직을 중앙 집중화합니다.
- 단점/논쟁: EF Core의
DbContext는 이미 리포지토리/작업 단위 패턴의 구현입니다. 다른 계층을 추가하면 때때로 중복될 수 있습니다("추상화에 대한 추상화").
희소성: 일반적 난이도: 어려움
REST API 및 웹 서비스
13. HTTP 동사 및 일반적인 사용법은 무엇입니까?
답변:
- GET: 리소스를 검색합니다. 안전하고 멱등적입니다.
- POST: 새 리소스를 만듭니다. 멱등적이지 않습니다.
- PUT: 기존 리소스를 업데이트/바꿉니다. 멱등적입니다.
- PATCH: 리소스를 부분적으로 업데이트합니다. 반드시 멱등적인 것은 아닙니다(일반적으로 멱등적임).
- DELETE: 리소스를 제거합니다. 멱등적입니다.
희소성: 일반적 난이도: 쉬움
14. 401 Unauthorized와 403 Forbidden의 차이점은 무엇입니까?
답변:
- 401 Unauthorized: 사용자가 인증되지 않았습니다. 클라이언트는 로그인하고 다시 시도해야 합니다. "당신이 누구인지 모릅니다."
- 403 Forbidden: 사용자가 인증되었지만 리소스에 액세스할 권한이 없습니다. "당신이 누구인지 알지만 이 작업을 수행할 수 없습니다."
희소성: 일반적 난이도: 쉬움
테스트 및 모범 사례
15. 단위 테스트와 통합 테스트의 차이점은 무엇입니까?
답변:
- 단위 테스트: 격리된 상태에서 작은 코드 단위(일반적으로 메서드)를 테스트합니다. 종속성은 (Moq와 같은 도구를 사용하여) 모의됩니다. 빠르고 안정적입니다.
- 통합 테스트: 애플리케이션의 여러 부분이 함께 작동하는 방식을 테스트합니다(예: API 엔드포인트 + 데이터베이스). 느리지만 실제 시스템 동작을 확인합니다.
희소성: 일반적 난이도: 쉬움
16. 단위 테스트에서 종속성을 어떻게 모의합니까?
답변: Moq 또는 NSubstitute와 같은 모의 프레임워크는 인터페이스의 가짜 구현을 만드는 데 사용됩니다.
- 목적: 테스트 중인 클래스를 격리합니다. 예를 들어
UserService를 테스트하는 경우 실제 데이터베이스에 액세스하지 않도록IUserRepository를 모의합니다. - 예제 (Moq):
희소성: 일반적 난이도: 중간
17. SOLID 원칙이란 무엇입니까? 예제를 하나 들어주세요.
답변: SOLID는 소프트웨어를 더 이해하기 쉽고, 유연하고, 유지 관리하기 쉽도록 하는 5가지 디자인 원칙의 약어입니다.
- S 단일 책임 원칙(SRP)
- O 개방/폐쇄 원칙(OCP)
- L 리스코프 치환 원칙(LSP)
- I 인터페이스 분리 원칙(ISP)
- D 종속성 역전 원칙(DIP)
- 예제 (DIP): 상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 됩니다. 둘 다 추상화에 의존해야 합니다. 이것이 종속성 주입의 기본입니다.
희소성: 일반적 난이도: 어려움
18. Boxing과 Unboxing이란 무엇입니까? 피해야 하는 이유는 무엇입니까?
답변:
- Boxing: 값 형식(예:
int)을 참조 형식(object)으로 변환합니다. 힙에 메모리를 할당합니다. - Unboxing: 참조 형식을 값 형식으로 다시 변환합니다.
- 성능: 둘 다 비싼 작업입니다(메모리 할당, 형식 검사). 제네릭(
List<T>)은 이전 컬렉션(ArrayList)에 비해 boxing/unboxing을 피하는 데 도움이 됩니다.
희소성: 일반적 난이도: 중간
19. C#에서 using 문이란 무엇입니까?
답변:
using 문은 IDisposable 개체의 올바른 사용을 보장하는 편리한 구문을 제공합니다.
- 메커니즘: 블록이 종료될 때(예외가 발생하더라도) 개체에서
Dispose()메서드를 자동으로 호출합니다. - 최신 구문:
using var file = File.OpenRead("path");(중괄호가 필요 없으며 범위 끝에서 삭제됨).
희소성: 일반적 난이도: 쉬움
20. "책임 연쇄" 패턴의 컨텍스트에서 미들웨어의 개념을 설명하세요.
답변: ASP.NET Core 미들웨어는 책임 연쇄 패턴의 고전적인 구현입니다.
- 패턴: 요청은 핸들러 체인을 따라 전달됩니다. 각 핸들러는 요청을 처리할지 또는 체인의 다음 핸들러로 전달할지 결정합니다.
- 애플리케이션: .NET에서
RequestDelegate는 다음 핸들러를 나타냅니다. 미들웨어 구성 요소는 연결되어 요청 파이프라인을 형성합니다.
희소성: 흔하지 않음 난이도: 어려움


