포스트

[회고록] 2025년 1, 2월 회고

[회고록] 2025년 1, 2월 회고

25년의 1, 2월은 새로운 프로젝트를 진행하며 다양한 기술을 배울 수 있었습니다.
이번 주 포스트에서는 2개월 간 진행한 프로젝트들의 점검과 앞으로의 계획을 알리고자 합니다.

3줄 요약

  • C++ 기반 프로젝트 중간 점검
  • 서브 언어로 C#을 학습
  • Azure, Docker, .NET Orleans, Redis 등 활용한 새로운 프로젝트 구상


대규모 접속이 가능한 채팅 프로그램 만들기


이 기간 중 가장 많이 개발을 진행한 프로젝트는 채팅 프로그램이라는 프로젝트였습니다.
이 프로젝트를 진행하게 된 계기는 작년(24년) 12월, 평소 가고 싶었던 회사의 최종면접에서 탈락한 후
채용 과정을 복기하면서 어떤 점이 아쉬웠는지 고민하던 중
포토폴리오에 작성했던 프로젝트 속 사용 기술에 대한 적용 근거가 부족했다고 생각하게 되었습니다.

해당 프로젝트에서 적용한 기술들 중 윈도우의 고성능 I/O 기술인 IOCP가 있었습니다.
이 프로젝트는 대규모 접속을 허용하는 것이 아닌 4인 파티들과 사용자의 정보
그리고 데이터 베이스를 관리하는 서버를 사용했습니다.
그러나 서버의 최대 동시 접속 인원이 많지 않아서 다른 기술을 사용할 수 있지만 그럼에도
IOCP를 사용한 이유를 제대로 설명하지 못 했기 때문이라고 분석했습니다.

따라서 이번 기회에 서버 프로그램 중 가장 기본이 되는 채팅 프로그램을 개발하면서
IOCP를 제대로 활용해보고자 하였습니다.


지금까지 개발된 채팅 프로그램은 최대 50’000개의 클라이언트가 동시에 접속하고
클라이언트들이 송신한 문자열을 서버에서 수신받고 이 문자열들을
Log Viewer라는 MFC 기반 프로그램램으로 송신해 실시간 출력하도록 개발하였습니다.
그러나 실제 실행 결과는 클라이언트 수에 비해서 채팅 속도가 매우 느렸습니다.

이전까지는 TCP 소켓을 사용한 문자열 송수신도 진행하고 동시에 Log viewer에서 10초 간격으로 접속한 유저를 확인하기 위한 통신을 TCP 소켓으로 함께 진행했기 때문에
클라이언트의 수가 증가할 수록 채팅의 반응 속도가 느려진다는 단점이 존재했습니다.


따라서 이 문제를 개선하고자 유저의 확인은 UDP 기반 Multicast를 사용하고
추가로 공지사항과 같은 단방향 통신 또한 Multicast를 사용하고자 개선 중에 있습니다.


C# 배워보기


저는 지금까지 메인 언어를 C++로 사용하고 다른 언어는 전혀 사용하지 않고 있었습니다.

그러나 신입과 경력 서버 개발 직군의 채용 공고를 보면서
생각보다 C++만큼 C#을 사용하는 기업이 많다는 것과 더 나아가 C# 단독으로 사용하는 것이 아니라
개발 상황과 요구 조건에 따라 추가적으로 그 외 다양한 언어를 사용할 수 있다는 것을 알게 되었습니다.
따라서 C++ 외 서브 언어로 C#을 배워보고자 하였습니다.

여러 프로그래밍 언어들 중 C#을 선택한 이유는 문법이 C++와 완전히 다른 언어가 아닌
C언어에 Java 스타일을 더한 언어로 다른 언어를 보다 더 쉽게 이해할 수 있겠다고 생각했기 때문입니다.

그리고 C++는 새로운 버전이 출시되면 아래의 코드처럼 기존 함수를 새로운 함수에 맞춰 수정해야 하지만
C#의 경우 새로운 버전을 출시해도 기존 코드를 그대로 사용할 수 있다는 장점이 있습니다.

1
2
3
char dest[10];
// strcpy(dest, "Hello");               // [실패] C++11에서 빌드 불가능
strcpy_s(dest, sizeof(dest), "Hello");  // [성공] dest에 "Hello"를 안전하게 복사

마지막으로 C# 코드는 CLR(Common Language Runtime)에서 실행할 수 있기 때문에
Windows에서 개발한 언어라도 Linux에서 동작할 수 있다는 강력한 장점이 있다는 장점이 있습니다.
따라서 C#의 이러한 특징을 활용해 신규 프로젝트를 진행해보고자 하였습니다.


채팅 프로그램 이후 신규 프로젝트 계획


구상도


개인 프로젝트에서 개발하는 서버는 대체로 개발하는 환경을 따라가게 됩니다.
제가 진행한 프로젝트들 또한 제가 사용하는 Windows11을 기반으로 실행되도록 만들었습니다.
그러나 상용 서버는 Windows 기반 서버를 실행하려면 Windows Server라는 특수한 운영체제를 사용해야 합니다.
하지만 값비싼 비용 때문에 Linux 기반 서버를 사용하는 것이 대부분입니다.

따라서 이번 신규 프로젝트에서 운영체제는 Linux Ubuntu server를 사용하고
더 나아가 Docker 라는 기술을 함께 사용하고자 계획하였습니다.


Docker를 사용하게 된 이유는 현재 사용하는 컴퓨터 자원의 한계 때문이였습니다.
한 컴퓨터에서 Orleans, Redis, PostgreSQL, Blazor를 동시에 실행할 경우,
여러 프로세스가 컴퓨터의 한정된 자원을 쟁취하기 위해 경쟁하게 되어
이는 서버 전체의 성능 저하로 이어질 수 있다고 생각했기 때문입니다.

이 문제를 개선하고자 각 프로세스를 컨테이너에 담아 실행시키도록 계획하였습니다.

추가적으로 프로젝트를 계획하면서 도커 연습을 위해 여러 컨테이너를 동시에 사용했는데
각 컨테이너를 명령어로 직접 관리하는 것에 어려움을 느꼈고
이 문제를 개선하고자 쿠버네티스라는 컨테이너 오케스트레이션 기술도 알게되어
이를 사용하도록 계획하였습니다.


위 계획들을 수행하기 위해 1월부터 여러 기술들을 연습하고 있습니다.
Docker와 Kubernetes는 도서관의 여러 도서와 테크 블로그의 설명으로 연습하고 있습니다.
C#은 전문 도서와 Unity를 사용하면서 연습하고
Redis와 PostgreSQL은 유료 온라인 강의를 통해 개념을 잡고 있습니다.

위 프로그램들을 클라우드 환경에서 사용해보기 위해서
Azure for Students라는 체험 계정 크레딧을 활용해 연습하고 있습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.