윈도우에서 서버개발 환경 구축하기

정선호·2025년 4월 12일
0

Server

목록 보기
3/6

개요

C#을 이용해 서버(게임, 웹)를 개발하기 위해 필요한 환경을 구축하는 방식에 대한 문서이다.

사용하는 프로그램 언어는 다음과 같다.

  • C# (.Net 8.0)
  • MSSQL

환경 및 사용 프로그램은 다음과 같다.

  • Windows 10/11
  • Visual Studio 2022
  • Sql Server Express 2022
  • Sql Server Management Studio 20

목차

Visual Studio

  • Visual Studio 2022
    • 설치 및 설정
    • 프로젝트 템플릿
    • Nuget 패키지 관리

SQL

  • SQL Server

    • SQL Server 설치
    • 서버 인스턴스 관리 및 삭제
  • SSMS

    • 서버 인스턴스 연결 및 관리

C#에 DB 연결하기

  • 사전 설정
  • DB 생성/복사 및 설정
  • C# 코드에 연결

.exe 빌드


Visual Studio

Visual Studio 2022 설명서

Visual Studio를 사용하는 이유는 다음과 같다.

  • C# + MSSQL에 친화적인 IDE
  • 콘솔 앱, 웹앱, 게임 등 다양한 템플릿 제공
  • Nuget 패키지 관리
  • 코드렌즈, 인텔리센스, Github Copilot과 같은 부가 기능

설치 및 설정

  1. Visual Studio Installer 설치

Visual Studio 홈페이지에서 설치 파일을 다운받아 실행한다.

  1. Visual Studio 2022 Community 설치

다음과 같이 인스톨러에서 IDE를 설치한다.

  1. 각종 세팅

Visual Studio 워크로드

인스톨러의 설치된 IDE 쪽에 '수정' 버튼을 누르면 여러 개발 워크로드를 설정 및 추가할 수 있다.
각종 서버 및 게임 클라이언트 개발을 위해서 다음과 같은 워크로드를 추가한다.

  • ASP.NET 및 웹 개발 -> 웹서버 개발 워크로드
  • .NET 데스크톱 개발 -> C# 콘솔 앱 개발 워크로드, C# 서버 개발에 필요
  • C++을 사용한 데스크톱 개발 -> C++ 콘솔 앱 개발 워크로드, C++ 서버 개발에 필요
  • Unity를 사용한 게임 개발 -> 유니티 엔진 개발 워크로드
  • C++를 사용한 게임 개발 -> 언리얼 등 C++ 사용 엔진 개발 워크로드
  • 데이터 스토리 및 처리 -> SQL 개발 워크로드

프로젝트 템플릿

Visual Studio의 새 프로젝트 만들기를 클릭하면 여러 프로젝트 템플릿을 사용하여 개발을 시작할 수 있다.

  • 콘솔 앱 : PC에서 실행 가능한 .NET 애플리케이션을 만든다. C# 게임 서버 템플릿
  • ASP.NET : 주로 웹서버 및 API서버를 만들 때 사용한다.
  • Blazor : 웹페이지 및 웹 애플리케이션을 만든다.

Nuget 패키지

Nuget이란

Nuget 패키지 관리자

Nuget 패키지 관리자를 사용해 각종 패키지를 설치 및 사용할 수 있다.


SQL

MS SQL Server 다운로드

Visual Studio에서도 MSSQL DB에 대한 접근을 할 수 있지만 DB 설정 및 데이터 직접 조작을 위해 다음과 같은 도구를 사용한다.

SQL Server

SQL Server 설치

위의 MS SQL Server 다운로드 페이지에서 Express를 다운로드해 설치한다.
그러면 다음과 같은 화면이 나오는데 원하는 옵션을 선택해 SQL Server를 설치한다.
미디어 다운로드도 클릭해 추후 서버 인스턴스 설치를 위한 미디어 파일을 받아둔다.

설치 완료시 Sql Server 구성 관리자 프로그램 또한 자동으로 설치된다.

이를 이용해 각 DB 서버 인스턴스에 대한 설정을 관리할 수 있다.

서버 인스턴스 설치 및 삭제

설치 방법
공식 설치 방법

새 서버 인스턴스 설치 방법은 다음과 같다.

  • SQL Server 설치 센터 프로그램을 실행한다.
  • '설치' - '새 SQL Server 독립 실행형 설치 또는 기존 설치에 기능 추가'를 누른다
  • 받아둔 미디어 파일을 실행해 설치 환경으로 들어간다.
  • 설정들을 기입하고 설치를 실시한다.

공식 삭제 방법

기존 서버 인스턴스 삭제 방법은 다음과 같다.

  • '설정' - '앱' - '설치된 앱'에서 Microsoft SQL Server 2022를 찾아 삭제 버튼을 누른다.
  • 옵션 선택창에서 '제거'를 누른다.
  • 제거할 SQL Server 인스턴스를 선택한 후 삭제를 실시한다.

서버 인스턴스 관리 문서

SQL 비밀번호를 까먹었을 때

SSMS

각 DB 인스턴스를 간단하게 연결해 안의 데이터베이스에 접근, CRUD작업 등을 수행할 수 있는 도구이다.

SSMS 다운로드

서버 인스턴스 연결 및 관리

SSMS 사용법

  • 개체 탐색기의 '연결' 버튼을 이용해 컴퓨터 내에 존재하는 SQL Server 인스턴스에 연결 가능
  • 삭제된 서버 인스턴스가 캐싱되어 연결 목록에 뜨면 다음 Powershell 스크립트로 캐시를 초기화해준다.
Remove-Item -Path "$env:APPDATA\Microsoft\SQL Server Management Studio" -Recurse -Force

C#에 DB 연결하기

사실 EFCore를 사용하면 알아서 DB 인스턴스를 만들어서 자동으로 연결 및 관리해준다.
하지만 EFCore를 안 쓰는 예전 코드도 존재하고, 인증서 연결 및 비밀번호 설정과 같은 보안 기법은 따로 설정한 후 연결하는 것이 편하기 때문에 작성하였다.

사전 설정

로컬 인증서 생성 및 적용

인증서 관련 오류가 발목을 잡을 수 있으므로 테스트 환경이라면 그냥 윈도우 인증 쓰자.

원래는 PowerShell에서 개인 인증서 만들고 그걸 SQL Server 구성 관리자에서 적용해야 되지만
ChatGPT님께서 원터치 Powershell 스크립트를 작성해 주었다.

# -----------------------------
# 1. 변수 설정
# -----------------------------
$dnsName = "YOUR-SERVER-NAME"   # 서버 이름 (예: HOYA-PC 또는 FQDN)
$certName = "HOYA_SQL_CERT"     # 인증서 발급 이름
$storePath = "cert:\LocalMachine\My"
$sqlInstanceName = "MSSQLSERVER"  # SQL Server 인스턴스 이름 (기본 인스턴스는 MSSQLSERVER)

# -----------------------------
# 2. 기존 같은 이름 인증서 제거
# -----------------------------
$oldCerts = Get-ChildItem $storePath | Where-Object { $_.Subject -like "*$certName*" }
foreach ($cert in $oldCerts) {
    Remove-Item -Path "$storePath\$($cert.Thumbprint)" -Force
    Write-Host "삭제 완료: $($cert.Subject)"
}

# -----------------------------
# 3. 새 인증서 발급 (서버 인증용 확장 포함)
# -----------------------------
$cert = New-SelfSignedCertificate `
    -DnsName $dnsName `
    -CertStoreLocation $storePath `
    -Subject "CN=$certName" `
    -KeyLength 2048 `
    -KeyExportPolicy Exportable `
    -FriendlyName $certName `
    -NotAfter (Get-Date).AddYears(2) `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.1") # 서버 인증 EKU

Write-Host "`n[✔] 인증서 발급 완료: $($cert.Thumbprint)`n"

# -----------------------------
# 4. SQL Server에 인증서 등록
# -----------------------------
# 인증서 Thumbprint 포맷 수정 (공백 제거, 대문자)
$thumb = $cert.Thumbprint.ToUpper() -replace " ", ""

# 레지스트리에 인증서 Thumbprint 설정
$regPath = "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SuperSocketNetLib"
Set-ItemProperty -Path $regPath -Name "Certificate" -Value $thumb

# 암호화 활성화 (옵션)
Set-ItemProperty -Path $regPath -Name "ForceEncryption" -Value 1

Write-Host "[✔] SQL Server에 인증서 적용 완료: $thumb`n"

# -----------------------------
# 5. SQL Server 서비스 재시작
# -----------------------------
Write-Host "[⏳] SQL Server 서비스를 다시 시작합니다..."
Restart-Service -Name "MSSQL`$$sqlInstanceName" -Force -ErrorAction Stop
Write-Host "[✔] SQL Server 서비스 재시작 완료!"

# -----------------------------
# 완료 안내
# -----------------------------
Write-Host "`n🎉 모든 작업이 완료되었습니다!"

DB 접속용 계정 생성 및 연결

DB SA 계정 생성 및 인증 절차
SSMS에서 간단하게 설정할 수 있다.

TCP 포트 오픈

DB를 localhost든 외부 네트워크든 넷을 통해 접속하려면 TCP 포트를 열어줘야 한다.

위와 같이 설정에 들어가 포트를 열어주자. DB에서 주로 사용하는 포트는 1433이다.
적용 후 서비스 재시작을 하면 포트가 열리는데 telnet 127.0.0.1 1433을 이용해 포트가 잘 열렸는지 확인하자.

DB 생성/복사 및 설정

DB 생성은 SSMS에서 수행하는 것이 편하다.

DB 복사는 파일 통복사 혹은 백업 파일 복사 및 붙여넣기 방식으로 수행할 수 있다. 공식 문서

  1. SSMS에서 복사할 DB를 선택 후 '태스크' - '백업'으로 .bak 백업 파일을 만든다.
  2. 붙여넣을 위치의 SQL 인스턴스에 복사 마법사를 이용해 복사한다.
    만약 복사가 불가능하면 접근 권한 경로 문제이므로 '파일'페이지에서 경로를 바꿔주면 된다.

C# 코드에 연결

공통적으로 connectionString을 이용해 연결한다.
IP, 포트번호, DB 인스턴스, 아이디, 비밀번호를 설정해 들어가기 위해서는 다음과 같은 커넥션 스트링을 사용한다.

string connectionString = "Server=127.0.0.1,1433;Database=YourDatabaseName;User ID=test;Password=test123;TrustServerCertificate=True;";

이 때 TrustServerCertificate=True 는 로컬 개발용으로 SSL 인증서 오류를 무시할 수 있게 한다.
로컬 테스트가 아닌 실제 연결에서는 Encrypt=True; TrustServerCertificate=False;를 사용해야 한다.

연결 스트링 작성

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=127.0.0.1,1433;Database=TestDB;User ID=sa;Password=sksckrgo1203;TrustServerCertificate=True;"
  }
}

DBContext 정의

using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public DbSet<User> Users { get; set; }      // Users 테이블에 매핑되는 DbSet

    private readonly IConfiguration _config;

    public AppDbContext(DbContextOptions<AppDbContext> options, IConfiguration config) : base(options)
    {
        _config = config;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connectionString = _config.GetConnectionString("DefaultConnection");
        optionsBuilder.UseSqlServer(connectionString);
    }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

메인 함수

using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;
using Microsoft.Data.SqlClient;

class Program
{
    public static void Main(string[] args)
    {
        // .NET 8의 새로운 Host 생성 방식 사용
        var builder = Host.CreateApplicationBuilder(args);

        // appsettings.json 파일을 설정에 추가 (DB 연결 문자열 등 로딩)
        builder.Configuration.AddJsonFile("appsettings.json");

        // DI 컨테이너에 DbContext 등록 (appsettings.json의 연결 문자열 자동 사용)
        builder.Services.AddDbContext<AppDbContext>();

        // 호스트 빌드 (구성 및 서비스가 포함된 애플리케이션 객체 생성)
        var host = builder.Build();

        // EF Core로 DB 접속
        using (var scope = host.Services.CreateScope())
        {
            // 스코프에서 DbContext 인스턴스 가져오기
            var dbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>();
            dbContext.Database.EnsureCreated();

            // Users 테이블을 쿼리하여 이름 출력
            Console.WriteLine("EF Core로 사용자 목록:");
            foreach (var user in dbContext.Users)
            {
                Console.WriteLine($"- {user.Name}");
            }
        }

        // SqlConnection을 사용하여 동일한 DB에 직접 접속
        var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
         
        // SqlConnection으로 DB 연결 시작
        using (var conn = new SqlConnection(connectionString))
        {
            conn.Open(); // 연결 열기

            // Users 테이블에서 첫 번째 사용자의 이름을 조회하는 SQL 명령 실행
            var cmd = new SqlCommand("SELECT TOP 1 Name FROM Users", conn);
            var result = cmd.ExecuteScalar(); // 단일 값 반환 (첫 번째 Name)

            Console.WriteLine($"\nSqlConnection으로 직접 조회 결과: {result}");
        }
    }
}

.exe 빌드

Visual Studio에서 .exe로 빌드 1
Visual Studio에서 .exe로 빌드 2

profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글