오늘 수행한 프로젝트 내용은 다음과 같다.
- 기능 추가마다 구동할 추가 테스트 구현
- 로컬 테스트를 위한 TCP 연결 연습 구현
- 이어서 메모리 기반 TCP 은행 명령 구현
- 서버 전용 데이터 파일을 이용하여, 정상 종료 방식과 파일 로드 구현
- 멀티스레드와 동시 저장 구현

처음에 소스 파일로만 컴파일 했더니 빌드를 실패했다. 해본 적이 있어야 말이지..
CMake 소스 타깃으로 TcpServer와 TcpClient를 지정하니 둘 다 실행할 수 있었다.
TCP는 메시지가 아닌 바이트 흐름이기 때문에, 메시지 끝 '\n'을 감지하여 한 줄 명령으로 처리하도록 했다.
이는 실제 네트워크 코드에서 중요한 부분이다.
지금 단계에서는 테스트를 위해 PING, QUIT같은 프로토콜 명령을 만들었지만, 프로젝트를 확장하면 나중에
CREATE_ACCOUNT, DEPOSIT과 같은 명령이 이 자리에 추가될 수 있다.
아직은 단일 스레드이며, 멀티 스레드로 확장될 것이다.

TCPServer는 Bank 객체를 하나 갖고 있다.
해당 객체는 클라이언트가 종료해도 계속 잔존하기 때문에, 다른 클라이언트가 요청해도 같은 정보를 열람할 수 있다.
현재는 메모리 기반이기 때문에, 서버를 종료하면 정보가 휘발되어 사라진다.
후에 서버 전용 데이터 파일을 생성하여, 그를 통해 정보를 유지할 것이다.

이제 클라이언트에서 SHUTDOWN 커맨드를 이용하여 종료하면, 작업 디렉토리에 파일이 남는다.
해당 파일에는 계좌의 정보들이 담겨져 있고, TcpServer는 실행될 때 해당 파일을 로딩한다.
테스트로 계좌 "100"번은 이전과 똑같이 생성한 뒤, SHUTDOWN으로 종료했다.
계좌 "200"번은 생성하고, SHUTDOWN 커맨드 없이 강제 종료했다.
따라서 작업 디렉토리의 파일은 "100"번 계좌의 정보만 담고 있어서, "200"번 계좌 조회는 불가능하다.

멀티스레드로 동시 저장을 구현했다.
이제 클라이언트 여럿을 연결해놓아도, 명령을 보내고 응답을 받을 수 있다!
멀티스레드 테스트를 사람이 직접 하기엔 다소 무리가 있었다.

당연한 말이지만, 각 클라이언트 스레드는 함수 실행 흐름이 다르다. 그러나, 값들은 모두 함께 같은 값을 사용해야한다.
따라서 공유 상태를 ServerState에 모았다.
처음 보는 'mutex' 라는 클래스가 등장했다. mutual exclusion의 약자로, 상호 배제를 뜻한다.
특정 스레드가 작업을 수행하는 동안, 다른 스레드가 대기하도록 한다.
mutex가 없다면, 같은 계좌에 두 클라이언트가 금액을 입금할 때, 값이 잘못 덧씌워지는 경우가 있을 수 있다.
경쟁 상태를 방지하는 것이다.
하나의 큰 Mutex로 묶어서 관리할 수 있지만, 관계없는 모든 작업까지 대기해야 하는 문제가 있기 때문에 크게 세 개로 나누었다.
- accountsMutex: 은행 데이터를 보호한다
- commandMutex: 은행 명령과 종료/저장 순서를 보호한다
- clientsMutex: 접속 중인 클라이언트 목록을 보호한다
'활동 > 모각코' 카테고리의 다른 글
| 2026 ㅂㅇㄷㄹㄹㅈㄷ (0) | 2026.07.23 |
|---|---|
| 2026 하계 모각코 5회차 계획 (0) | 2026.07.21 |
| 2026 하계 모각코 4회차 회고 (0) | 2026.07.15 |
| 2026 하계 모각코 4회차 계획 (0) | 2026.07.15 |
| 2026 하계 모각코 3회차 회고 (0) | 2026.07.14 |