C#을 이용해 서버(게임, 웹)를 개발하기 위해 필요한 환경을 구축하는 방식에 대한 문서이다.
사용하는 프로그램 언어는 다음과 같다.
환경 및 사용 프로그램은 다음과 같다.
SQL Server
SSMS
Visual Studio를 사용하는 이유는 다음과 같다.
Visual Studio 홈페이지에서 설치 파일을 다운받아 실행한다.
다음과 같이 인스톨러에서 IDE를 설치한다.
인스톨러의 설치된 IDE 쪽에 '수정' 버튼을 누르면 여러 개발 워크로드를 설정 및 추가할 수 있다.
각종 서버 및 게임 클라이언트 개발을 위해서 다음과 같은 워크로드를 추가한다.
Visual Studio의 새 프로젝트 만들기를 클릭하면 여러 프로젝트 템플릿을 사용하여 개발을 시작할 수 있다.
Nuget 패키지 관리자를 사용해 각종 패키지를 설치 및 사용할 수 있다.
Visual Studio에서도 MSSQL DB에 대한 접근을 할 수 있지만 DB 설정 및 데이터 직접 조작을 위해 다음과 같은 도구를 사용한다.
위의 MS SQL Server 다운로드 페이지에서 Express를 다운로드해 설치한다.
그러면 다음과 같은 화면이 나오는데 원하는 옵션을 선택해 SQL Server를 설치한다.
미디어 다운로드도 클릭해 추후 서버 인스턴스 설치를 위한 미디어 파일을 받아둔다.
설치 완료시 Sql Server 구성 관리자 프로그램 또한 자동으로 설치된다.
이를 이용해 각 DB 서버 인스턴스에 대한 설정을 관리할 수 있다.
새 서버 인스턴스 설치 방법은 다음과 같다.
기존 서버 인스턴스 삭제 방법은 다음과 같다.
각 DB 인스턴스를 간단하게 연결해 안의 데이터베이스에 접근, CRUD작업 등을 수행할 수 있는 도구이다.
Remove-Item -Path "$env:APPDATA\Microsoft\SQL Server Management Studio" -Recurse -Force
사실 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 SA 계정 생성 및 인증 절차
SSMS에서 간단하게 설정할 수 있다.
DB를 localhost든 외부 네트워크든 넷을 통해 접속하려면 TCP 포트를 열어줘야 한다.
위와 같이 설정에 들어가 포트를 열어주자. DB에서 주로 사용하는 포트는 1433이다.
적용 후 서비스 재시작을 하면 포트가 열리는데 telnet 127.0.0.1 1433
을 이용해 포트가 잘 열렸는지 확인하자.
DB 생성은 SSMS에서 수행하는 것이 편하다.
DB 복사는 파일 통복사 혹은 백업 파일 복사 및 붙여넣기 방식으로 수행할 수 있다. 공식 문서
.bak
백업 파일을 만든다.공통적으로 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;"
}
}
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}");
}
}
}