
# 오늘의 목표
오늘은 본격적인 서버 구현에 들어가기 전에 프로젝트의 기본 개발 환경과 구조를 잡는 것을 목표로 했다.
이번 프로젝트는 Unity 클라이언트와 .NET 서버가 함께 동작하는 구조이기 때문에, 초반에 프로젝트 구조를 제대로 잡아두는 것이 중요하다고 생각했다.
그래서 Day 1에서는 기능 구현보다 아래 작업에 집중했다.
- GitHub 리포지토리 기반 작업 환경 구성
- 서버 / 봇 / Shared 프로젝트 생성
- 전체 폴더 구조 정리
- 기본 문서 작성
- Git 브랜치와 커밋 흐름 정리
# 오늘 작업 내용
오늘 진행한 작업은 크게 아래와 같다.
- GitHub 리포지토리 clone
- .NET 8 SDK 설치
- 서버 / 봇 / Shared 프로젝트 생성
- 솔루션 구성
- 프로젝트 폴더 구조 정리
- 기본 문서 작성
- `dev` 브랜치 생성 후 커밋 및 푸시
# .NET 8을 선택한 이유
서버는 C# 기반의 .NET 콘솔 애플리케이션으로 만들 예정이다.
이번 프로젝트에서는 `.NET 8`을 사용하기로 했다.
가장 큰 이유는 `.NET 8`이 LTS 버전이기 때문이다. 학기 프로젝트는 일정이 정해져 있고, 중간에 개발 환경 문제로 시간을 많이 쓰면 전체 일정이 흔들릴 수 있다.
그래서 최신 기능을 실험하기보다는 안정적으로 사용할 수 있는 버전을 선택하는 것이 더 낫다고 판단했다.
이번 프로젝트의 목표는 새로운 버전의 기능을 써보는 것이 아니라, 직접 만든 서버로 멀티플레이 게임 한 사이클을 동작시키는 것이다.
# 프로젝트 구조
프로젝트는 서버, 봇, 공유 코드, 클라이언트, 문서를 분리해서 구성했다.
현재 기본 구조는 아래와 같다.
```text
2v2_shooter_Server/
├── server/
│ └── GameServer/
├── bot/
│ └── BotClient/
├── shared/
│ └── Shared/
├── client/
├── docs/
├── Game.sln
├── .gitignore
└── README.md
```
각 폴더의 역할은 다음과 같다.
- `server`: 실제 게임 서버 프로젝트
- `bot`: 테스트용 봇 클라이언트 프로젝트
- `shared`: 서버와 클라이언트가 함께 사용할 공통 코드
- `client`: Unity 클라이언트 프로젝트
- `docs`: 패킷, 팀 합의사항, 아키텍처 등을 정리하는 문서 폴더
처음부터 폴더를 나누어둔 이유는 역할을 명확하게 분리하기 위해서다.
특히 서버와 클라이언트가 함께 움직이는 프로젝트에서는 공통으로 사용하는 코드와 각자의 코드가 섞이면 나중에 관리하기 어려워질 수 있다고 생각했다.
# 솔루션 구성
이번에 처음 제대로 정리하게 된 개념 중 하나가 `.sln` 파일이었다.
.NET에서는 여러 프로젝트를 하나로 묶어서 관리하기 위해 솔루션 파일을 사용한다.
이번 프로젝트에는 `GameServer`, `BotClient`, `Shared`처럼 여러 프로젝트가 함께 존재한다. 따라서 각각을 따로 관리하기보다 하나의 솔루션으로 묶어서 관리하기로 했다.
오늘은 아래 작업을 진행했다.
- `Game.sln` 솔루션 생성
- `GameServer` 프로젝트 생성
- `BotClient` 프로젝트 생성
- `Shared` 라이브러리 프로젝트 생성
- `GameServer`와 `BotClient`가 `Shared`를 참조하도록 연결
- 각 프로젝트가 정상 실행되는지 확인
아직 실제 서버 기능을 구현한 것은 아니지만, 프로젝트가 정상적으로 생성되고 실행되는 것까지 확인했다.
# 문서 작성
개발을 시작하기 전에 기본 문서도 함께 만들었다.
오늘 만든 문서는 아래와 같다.
- `protocol.md`
- `agreements.md`
- `architecture.md`
- `README.md`
각 문서의 역할은 다음과 같다.
- `protocol.md`: 서버와 클라이언트가 주고받을 패킷 구조를 정리하기 위한 문서
- `agreements.md`: 포트 번호, 엔디안, 명명 규칙 등 팀 합의사항을 정리하는 문서
- `architecture.md`: 서버 구조와 전체 흐름을 정리하기 위한 문서
- `README.md`: 프로젝트 개요, 실행 방법, 구조 설명 등을 정리할 문서
아직 문서 내용이 완성된 것은 아니지만, 프로젝트가 진행될수록 계속 업데이트할 생각이다.
# 프로젝트 관리
기본 구조를 정리한 뒤 `dev` 브랜치를 생성해서 푸시했다.
`main` 브랜치는 안정적인 결과물을 유지하고, 실제 개발 작업은 `dev` 브랜치에서 진행하기 위해서다.
앞으로는 기능 단위 작업을 `feature/*` 브랜치에서 진행하고, 어느 정도 확인이 끝나면 `dev`로 합치는 방식으로 관리하려고 한다.
Day 1에서는 프로젝트 기본 구조와 문서 작업을 나누어 커밋으로 남겼다.
기능 구현은 아직 많지 않지만, 프로젝트 기반을 잡은 내용도 커밋으로 남겨두는 것이 좋다고 생각했다.
# 작업 중 고찰
오늘 작업하면서 가장 중요하게 생각한 부분은 `Shared` 프로젝트 분리였다.
서버와 클라이언트는 같은 패킷 구조를 기준으로 통신해야 한다.
만약 서버와 클라이언트가 각각 패킷 구조를 따로 정의하면, 나중에 한쪽만 수정되었을 때 문제가 생길 가능성이 크다.
그래서 공통으로 사용하는 패킷 정의와 타입은 `Shared`에 두고, 서버와 봇 클라이언트가 이를 참조하도록 구성했다.
이후 Unity 클라이언트에서도 같은 정의를 사용할 수 있도록 맞춰갈 예정이다.
또 하나 중요하게 본 것은 봇 클라이언트다.
이번 프로젝트는 2vs2 게임이기 때문에 기본적으로 4인 환경 테스트가 필요하다. 하지만 개발할 때마다 사람 4명을 모아서 테스트하는 것은 현실적으로 어렵다.
그래서 처음부터 `BotClient`를 별도 프로젝트로 분리했다.
처음에는 서버 접속과 로그인만 처리하겠지만, 이후에는 방 입장, 준비, 이동, 사격까지 자동화할 계획이다.
봇 클라이언트는 단순 테스트 도구처럼 보일 수 있지만, 이 프로젝트에서는 반복적인 통합 테스트를 가능하게 해주는 중요한 도구가 될 것 같다.
# 환경 세팅 중 겪은 이슈
환경 세팅 중에는 몇 가지 작은 이슈도 있었다.
먼저 `.NET SDK`가 설치되어 있지 않아 `dotnet` 명령어가 동작하지 않았다. SDK를 설치하고 터미널을 다시 열어 해결했다.
또 `.gitignore` 설정 때문에 `.csproj`, `.sln` 파일이 커밋되지 않는 문제도 있었다.
처음에는 Unity용 `.gitignore` 템플릿을 그대로 사용했는데, Unity 프로젝트에서는 `.csproj`와 `.sln`이 자동 생성 파일로 취급되어 제외되는 경우가 있다.
하지만 이번 프로젝트는 Unity만 있는 것이 아니라 .NET 서버 솔루션도 함께 포함되어 있다.
따라서 서버 프로젝트의 `.csproj`와 `Game.sln`은 반드시 커밋되어야 했다.
결국 `.gitignore` 아래에 예외 규칙을 추가해서 해결했다.
```gitignore
!*.csproj
!*.sln
```
이번 경험을 통해 `.gitignore` 템플릿은 그대로 복사해서 쓰기보다, 프로젝트 성격에 맞게 반드시 확인해야 한다는 것을 느꼈다.
# 다음 작업
다음 작업부터는 실제 서버 연결을 시작할 예정이다.
우선순위는 아래와 같다.
- `TcpListener`를 사용해 클라이언트 접속을 받는 서버 소켓 만들기
- 클라이언트 세션 구조 설계하기
- `C_Login`, `S_LoginResult` 패킷 송수신 준비하기
- 봇 클라이언트에서 서버 접속 테스트하기
- 팀원의 Unity `NetworkManager`와 연결 방향 맞추기
Day 2부터는 드디어 실제 서버 코드가 들어갈 것 같다.
# 한 줄 정리
오늘은 기능을 많이 구현한 날이라기보다, **프로젝트를 제대로 시작하기 위한 기반을 잡은 날**이었다.
초반 구조가 어긋나면 나중에 통합 과정에서 시간이 크게 낭비될 수 있기 때문에, Day 1에 폴더 구조, 솔루션 구성, 문서, Git 관리 흐름을 정리한 것은 의미 있는 작업이었다.
'Projects' 카테고리의 다른 글
| 2vs2 Shooter Server #00 - 시작 (0) | 2026.04.29 |
|---|

When I Meet The Star : 별을 만나기 위한 개발 여정
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!