12월 21, 2025
15 분 읽기

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

interview
career-advice
job-search
C#/.NET 백엔드 개발자 면접 질문: 완벽 가이드
Milad Bonakdar

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#에서 structclass의 차이점은 무엇입니까?

답변:

  • Class: 참조 형식(힙에 할당). 클래스 객체를 메서드에 전달할 때 메모리 위치에 대한 참조를 전달합니다. 메서드 내부의 변경 사항은 원래 객체에 영향을 줍니다. 상속을 지원합니다.
  • Struct: 값 형식(스택에 할당). 구조체를 전달할 때 데이터의 복사본이 전달됩니다. 메서드 내부의 변경 사항은 원래 구조체에 영향을 주지 않습니다. 상속을 지원하지 않지만 인터페이스를 구현할 수 있습니다.
  • 사용법: struct는 단일 값을 나타내는 작고 변경 불가능한 데이터 구조(Point, Color 등)에 사용합니다. 대부분의 다른 객체에는 class를 사용합니다.

희소성: 일반적 난이도: 쉬움


2. asyncawait에 대해 설명하세요. 확장성에 어떻게 도움이 됩니까?

답변: asyncawait는 비동기 프로그래밍에 사용되는 키워드입니다.

  • 메커니즘: 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을 사용합니다. 이렇게 하면 단일 쿼리에서 관련 데이터를 가져오기 위해 SQL JOIN이 생성됩니다.
  • 예제: 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):
var mockRepo = new Mock<IUserRepository>();
mockRepo.Setup(repo => repo.GetById(1)).Returns(new User { Id = 1, Name = "Test" });
var service = new UserService(mockRepo.Object);

희소성: 일반적 난이도: 중간


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는 다음 핸들러를 나타냅니다. 미들웨어 구성 요소는 연결되어 요청 파이프라인을 형성합니다.

희소성: 흔하지 않음 난이도: 어려움

Newsletter subscription

실제로 효과가 있는 주간 커리어 팁

최신 인사이트를 받은 편지함으로 직접 받아보세요

채용 담당자에게 눈에 띄고 꿈의 직장을 얻으세요

ATS를 통과하고 채용 담당자에게 깊은 인상을 주는 AI 기반 이력서로 커리어를 변화시킨 수천 명의 사람들과 함께하세요.

지금 만들기 시작

이 게시물 공유

75% ATS 거부율을 극복하세요

4개 중 3개의 이력서는 사람의 눈에 닿지 않습니다. 우리의 키워드 최적화는 통과율을 최대 80%까지 높여 채용 담당자가 실제로 당신의 잠재력을 볼 수 있도록 합니다.