WebAPI 테스트는 요청(Request)을 전송하고 그에 대한 응답(Response)을 수신하는 과정으로 이루어집니다. WebAPI를 테스트하는 방법은 여러 가지가 있지만, 이 글에서는 가장 널리 사용되는 Swagger와 Postman 두 가지 도구를 활용한 테스트 방법을 소개합니다.먼저 아래와 같이 StudentController를 생성해 보겠습니다.Student 모델namespace DemoWebApplication Models{ public class Student{ public int Id { get;
ViewData는 ASP.NET MVC에서 컨트롤러(Controller)와 뷰(View) 사이에 데이터를 전달하기 위해 사용되는 객체 딕셔너리입니다. 문자열을 키(Key)로 사용하여 데이터를 저장하고 조회할 수 있으며, 내부적으로 키-값(Key-Value) 쌍으로 구성되어 있습니다.ViewData의 주요 특징데이터 전달 방향은 컨트롤러 → 뷰로만 가능하며, 그 반대 방향(뷰 → 컨트롤러)으로는 사용할 수 없습니다.모든 키는 반드시 문자열(string)이어야 합니다.데이터는 현재 요청(Request) 동안에만 유효합니다. 즉, 리다이
DelegatingHandler란 무엇인가?ASP.NET Web API에서 메시지 핸들러(Message Handler)는 여러 개의 핸들러가 하나의 체인(chain) 형태로 연결되어 동작합니다. 체인의 첫 번째 핸들러가 HTTP 요청을 받아 일정한 처리를 수행한 뒤 요청을 다음 핸들러에 전달하고, 어느 시점에서 응답이 생성되면 그 응답은 다시 체인을 거슬러 올라가 최종적으로 호출자에게 반환됩니다. 이러한 패턴을 위임 핸들러(Delegating Handler)라고 부릅니다.커스텀 서버 측 HTTP 메시지 핸들러 만들기ASP.NET W
ASP.NET Web API에서 서버 측 사용자 지정 HTTP 메시지 핸들러(Message Handler)를 생성하려면 System.Net.Http.DelegatingHandler 클래스를 상속받는 클래스를 만들어야 합니다.메시지 핸들러는 HTTP 요청이 컨트롤러에 도달하기 전과 응답이 클라이언트로 반환되기 전에 요청·응답을 가로채어 처리할 수 있게 해주는 강력한 확장 지점입니다. 아래 단계별로 살펴보겠습니다.1단계: 컨트롤러 및 액션 메서드 생성먼저 테스트용 컨트롤러와 해당 액션 메서드를 작성합니다.using DemoWebAppl
C#으로 개발하다 보면 특정 문자나 문자열을 지정한 횟수만큼 반복해야 하는 경우가 자주 있습니다. 예를 들어 구분선을 만들거나, 문자열 패딩을 처리하거나, 테스트 데이터를 생성할 때 유용하게 활용됩니다. 이 글에서는 가장 널리 사용되는 세 가지 방법을 코드 예제와 함께 정리했습니다.string 생성자 – new string(charToRepeat, 5) : 단일 문자를 반복할 때 가장 간단하고 빠릅니다.string.Concat + Enumerable.Repeat – string.Concat(Enumerable.Repeat(charT
C#에서 텍스트 파일을 한 줄씩 읽는 방법은 여러 가지가 있습니다. 대표적으로 StreamReader.ReadLine, File.ReadLines, File.ReadAllLines 등이 있으며, 각각의 동작 방식과 장단점이 다릅니다.이 글에서는 아래와 같은 내용이 담긴 로컬 텍스트 파일(Demo.txt)을 예시로 세 가지 방법을 하나씩 살펴보겠습니다.1. StreamReader.ReadLine 사용하기StreamReader는 지정된 인코딩 방식으로 스트림에서 문자를 읽어오는 클래스입니다. ReadLine 메서드는 입력 스트림에서 한
ASP.NET MVC에서 ActionName 특성(Attribute)은 액션 선택자(Action Selector) 중 하나로, 액션 메서드에 실제 메서드 이름과 다른 별칭 이름을 부여할 때 사용합니다. 즉, 메서드의 원래 이름 대신 다른 이름으로 해당 액션을 호출하고 싶을 때 이 특성을 활용할 수 있습니다.[ActionName(AliasName)]컨트롤러(Controller) 예제아래 예제는 Index 메서드에 ListCountries라는 별칭을 지정한 코드입니다.using System.Collections.Generic; usin
리스트를 평탄화(flatten)한다는 것은 List<List<T>>처럼 중첩된 리스트 구조를 단일 List<T>로 변환하는 작업을 의미합니다. 예를 들어 여러 개의 정수 리스트를 담고 있는 List<List<int>>를 하나의 List<int>로 합쳐야 하는 경우가 대표적입니다.LINQ의 SelectMany 연산자는 시퀀스의 각 요소를 IEnumerable<T>로 프로젝션한 뒤, 그 결과로 만들어진 여러 시퀀스를 하나의 시퀀스로 병합하는 역할을 합니다. 즉,
C#으로 Windows 서비스를 개발한 후에는 서비스 제어 관리자(Service Control Manager)에 등록해야 실제로 실행할 수 있습니다. 이 글에서는 Visual Studio에서 Windows 서비스 애플리케이션을 만들고, 설치 관리자(Installer)를 추가한 뒤, 명령 프롬프트의 InstallUtil.exe 도구를 사용해 서비스를 설치하고 실행까지 확인하는 전 과정을 단계별로 살펴봅니다. 1단계: Windows 서비스 프로젝트 생성 Visual Studio에서 새로운 Windows 서비스(.NET Framework
C#에는 두 가지 OR 연산자가 있습니다. ||는 논리 OR(Logical OR) 연산자이고, |는 비트별 논리 OR(Bitwise Logical OR) 연산자입니다. 두 연산자는 문법상 거의 동일해 보이지만, 실제 실행 방식에서 중요한 차이가 있습니다.기본 문법bool_exp1 || bool_exp2bool_exp1 | bool_exp2두 구문은 형태가 비슷하지만, 내부적으로 처리되는 방식은 완전히 다릅니다.|| 연산자 (논리 OR)의 동작 방식먼저 bool_exp1을 실행하고, 그 결과에 따라 두 번째 표현식의 실행 여부가 결정
네트워크에 연결된 모든 컴퓨터는 고유한 식별자를 가지고 있습니다. 우편물에 수신자의 주소를 적어 보내는 것처럼, 컴퓨터도 이 고유한 식별자를 사용하여 네트워크상의 특정 컴퓨터로 데이터를 전송합니다. 오늘날 인터넷에 연결된 모든 컴퓨터를 포함한 대부분의 네트워크는 TCP/IP 프로토콜을 통신 표준으로 사용하고 있으며, TCP/IP 프로토콜에서 컴퓨터의 고유 식별자를 바로 IP 주소(IP Address)라고 부릅니다.이 글에서는 ASP.NET MVC C# 환경에서 클라이언트(사용자)의 IP 주소를 확인하는 다양한 방법을 살펴보겠습니다.
C# 정적 생성자란 무엇인가?정적 생성자(static constructor)는 클래스의 정적 데이터를 초기화하거나, 프로그램 전체에서 단 한 번만 수행해야 하는 작업을 처리하기 위해 사용됩니다. 정적 생성자는 첫 번째 인스턴스가 생성되기 전 또는 어떤 정적 멤버가 처음 참조되기 전에 런타임에 의해 자동으로 호출됩니다.정적 생성자는 비관리 코드(unmanaged code)를 위한 래퍼(wrapper) 클래스를 작성할 때 특히 유용합니다. 이 경우 생성자 내부에서 LoadLibrary 메서드를 호출하여 필요한 네이티브 라이브러리를 로드
리플렉션(Reflection)은 관리 코드(managed code)가 자신의 메타데이터를 읽어 어셈블리를 찾을 수 있도록 하는 기능입니다. 쉽게 말해, 동일한 시스템 안에서 코드가 다른 코드를 검사하고 조작할 수 있게 해주는 메커니즘입니다. C#에서 리플렉션을 활용하면 특정 타입의 인스턴스를 동적으로 생성하거나, 해당 타입을 기존 객체에 바인딩할 수 있습니다. 또한 이미 존재하는 객체로부터 타입 정보를 가져와 그 속성(property)에 접근하는 것도 가능합니다. 코드에서 애트리뷰트(attribute)를 사용할 때에도 리플렉션은 모
미디어 타입(media type), 흔히 MIME 타입이라고 불리는 것은 데이터의 형식을 식별하는 역할을 합니다. HTTP에서 미디어 타입은 메시지 본문(message body)의 형식을 설명하며, 타입(type)과 서브타입(subtype)이라는 두 개의 문자열로 구성됩니다. 대표적인 예는 다음과 같습니다. text/html image/png application/json HTTP 메시지에 엔티티 본문(entity-body)이 포함되어 있으면 Content-Type 헤더가 메시지 본문의 형식을 지정합니다. 이 헤더 덕분에 수신
C# 애플리케이션에서 Process 클래스를 사용하면 외부 프로그램을 손쉽게 실행할 수 있습니다. 프로세스란 현재 컴퓨터에서 실행 중인 프로그램을 의미합니다. 맞춤법 검사기나 시스템 이벤트 처리기 같은 작은 백그라운드 작업부터 메모장과 같은 완전한 데스크톱 애플리케이션까지 모두 프로세스에 해당합니다.프로세스와 스레드의 개념각 프로세스는 프로그램을 실행하는 데 필요한 리소스를 제공합니다. 프로세스는 시작될 때 하나의 스레드, 즉 기본 스레드(primary thread)와 함께 생성되며, 필요에 따라 여러 개의 추가 스레드를 가질 수도
Configure() 메서드란?Configure 메서드는 ASP.NET Core 애플리케이션의 Startup 클래스 내부에 정의되어 있습니다.이 메서드는 내장 IoC(제어 반전) 컨테이너가 제공하는 IApplicationBuilder 인스턴스를 사용하여 애플리케이션의 요청 파이프라인(request pipeline)을 구성하는 핵심 지점입니다. 즉, 들어오는 HTTP 요청이 어떤 미들웨어를 거쳐 처리될지 결정하는 곳이라고 할 수 있습니다.기본 매개변수Configure 메서드는 기본적으로 다음 세 가지 매개변수를 가질 수 있습니다.IA
미들웨어란 무엇인가?미들웨어(Middleware)는 애플리케이션 파이프라인에 조립되어 들어오는 요청(Request)과 나가는 응답(Response)을 처리하는 소프트웨어 구성 요소입니다.각 미들웨어 구성 요소는 요청을 파이프라인의 다음 구성 요소로 전달할지 여부를 스스로 결정하며, 다음 구성 요소가 호출되기 전과 후에 로깅, 인증, 예외 처리 같은 특정 작업을 수행할 수 있습니다.Map 확장 메서드의 역할Map 확장 메서드는 파이프라인을 분기(Branching)하기 위한 규약(Convention)으로 사용됩니다. 이 메서드는 요청
ASP.NET Core 애플리케이션에서는 Startup 클래스의 Configure 메서드에서 IApplicationBuilder 인스턴스를 사용해 미들웨어를 구성할 수 있습니다. 이때 가장 많이 사용되는 두 가지 확장 메서드가 바로 Run()과 Use()입니다.Run() 메서드란?Run()은 IApplicationBuilder 인스턴스의 확장 메서드로, 애플리케이션 요청 파이프라인에 터미널(Terminal) 미들웨어를 추가합니다. 터미널 미들웨어란 파이프라인의 끝을 의미하며, 이 미들웨어가 실행된 후에는 다음 미들웨어로 제어가 넘어
라우팅(Routing)은 들어오는 HTTP 요청을 적절한 경로 처리기(Route Handler)에 매핑하는 데 사용되는 핵심 메커니즘입니다.라우트는 애플리케이션이 시작될 때 구성되며, 요청 처리 과정에서 사용할 수 있는 값들을 URL로부터 추출할 수 있습니다.라우팅의 기본 개념라우팅은 IRouter 인터페이스의 구현체인 라우트(Route)를 사용하여 다음 두 가지 작업을 수행합니다.들어오는 요청을 경로 처리기에 매핑응답에 사용될 URL 생성라우팅은 RouterMiddleware 클래스를 통해 미들웨어 파이프라인에 연결됩니다. ASP
ASP.NET Core 세션(Session)이란? 세션(Session)은 ASP.NET Core에서 사용자 데이터를 저장하고 관리할 수 있게 해주는 기능입니다. 세션은 서버 측의 딕셔너리(Dictionary)에 데이터를 저장하며, SessionId가 그 키(key)로 사용됩니다. SessionId는 클라이언트 측에서 쿠키 형태로 저장되고, 모든 요청마다 함께 전송됩니다. SessionId 쿠키는 브라우저별로 발급되기 때문에 서로 다른 브라우저 간에는 공유할 수 없습니다. 또한 별도의 만료 시간이 지정되어 있지 않아 브라우저 세션이