지금까지는 모든 파일을 server 폴더안에 넣어놓고 사용했다. 이렇게 해도 필요한 테스트는 openssl s_client로 다 해볼 수 있었기 때문. 하지만 이제 패킷을 직렬화, 역직렬화하고 멀티스레드환경에서 제대로 돌아가는지 확인해야 하기때문에 클라이언트도 업그레이드를 할 필요성을 느꼈다.
그래서 이번엔 더미클라이언트 개발을 위한 밑작업으로 프로젝트를 리펙토링 해보자.

먼저 디렉토리 구조부터 수정했다. 기존에는 Makefile이 있는곳에 모든 cpp, h, o, 실행파일이 뒤섞여있었는데, 이것들을 분리했다.
- ServerCore : 서버와 클라이언트에 모두 사용될 파일들을 모아놓음. 정적 라이브러리로 만들어 사용한다.
- AuthServer : 서버에서만 사용될 파일을 모아놓음. 서버코어 라이브러리과 함께 서버프로그램을 빌드한다.
- DummyClient : 클라에서만 사용될 파일을 모아놓음. 서버코어 라이브러리와 함께 클라프로그램을 빌드한다.
- Protocol : Protobuf 관련 파일을 모아놓음.
- TLS : 서버에서 사용할 인증서와 개인키를 보관.
그리고 Makefile을 수정해서 각 프로그램이 빌드될 수 있게 만들었다.
#======= AuthServer ========#
AUTH_SERVER_DIR = AuthServer
AUTH_SERVER_EXE = test
AUTH_SERVER_SRC_FILE = AuthServer.cpp \
CAuthSession.cpp \
ClientPacketHandler.cpp \
Protocol.pb.cc
AUTH_SERVER_SRC = $(addprefix $(AUTH_SERVER_DIR)/, $(AUTH_SERVER_SRC_FILE))
AUTH_SERVER_OBJ_DIR = $(AUTH_SERVER_DIR)/ObjectFiles
AUTH_SERVER_OBJ_FILE = $(AUTH_SERVER_SRC_FILE:.cpp=.o)
AUTH_SERVER_OBJ_FILE := $(AUTH_SERVER_OBJ_FILE:.cc=.o)
AUTH_SERVER_OBJ = $(addprefix $(AUTH_SERVER_OBJ_DIR)/, $(AUTH_SERVER_OBJ_FILE))
#======= AuthServer ========#
#======= DummyCient ========#
CLIENT_DIR = DummyClient
CLIENT_EXE = client
CLIENT_SRC_FILE = DummyClient.cpp \
Protocol.pb.cc \
ServerPacketHandler.cpp
CLIENT_SRC = $(addprefix $(CLIENT_DIR)/, $(CLIENT_SRC_FILE))
CLIENT_OBJ_DIR = $(CLIENT_DIR)/ObjectFiles
CLIENT_OBJ_FILE = $(CLIENT_SRC_FILE:.cpp=.o)
CLIENT_OBJ_FILE := $(CLIENT_OBJ_FILE:.cc=.o)
CLIENT_OBJ = $(addprefix $(CLIENT_OBJ_DIR)/, $(CLIENT_OBJ_FILE))
#======= DummyCient ========#
#======= ServerCore ========#
SERVER_CORE_DIR = ServerCore
SERVER_CORE_LIB = $(SERVER_CORE_DIR)/ServerCore.a
SERVER_CORE_SRC_FILE = CoreGlobal.cpp \
CoreTLS.cpp \
DBConnection.cpp \
DBConnectionPool.cpp \
EpollCore.cpp \
EpollEvent.cpp \
EpollObject.cpp \
JobQueue.cpp \
Listener.cpp \
NetAddress.cpp \
ReadBuffer.cpp \
Service.cpp \
Session.cpp \
SslCtx.cpp \
SslObject.cpp \
ThreadManager.cpp \
Timer.cpp \
Utils.cpp \
WriteBuffer.cpp
SERVER_CORE_SRC = $(addprefix $(SERVER_CORE_DIR)/, $(SERVER_CORE_SRC_FILE))
SERVER_CORE_OBJ_DIR = $(SERVER_CORE_DIR)/ObjectFiles
SERVER_CORE_OBJ_FILE = $(SERVER_CORE_SRC_FILE:.cpp=.o)
SERVER_CORE_OBJ = $(addprefix $(SERVER_CORE_OBJ_DIR)/, $(SERVER_CORE_OBJ_FILE))
#======= ServerCore ========#
SERVER_CORE_INC = -I$(SERVER_CORE_DIR)
CXX = g++
CXXFLAGS = #-Wall -Werror -Wextra
LDLIBS = -lhiredis -lpq -lprotobuf -lssl -lcrypto
.PHONY : all auth cli clean fclean re
all : auth cli
#======= AuthServer ========#
auth : $(AUTH_SERVER_EXE)
$(AUTH_SERVER_EXE) : $(AUTH_SERVER_OBJ_DIR) $(SERVER_CORE_LIB) $(AUTH_SERVER_OBJ)
$(CXX) $(CXXFLAGS) $(AUTH_SERVER_OBJ) $(SERVER_CORE_LIB) $(LDLIBS) -o $(AUTH_SERVER_EXE)
$(AUTH_SERVER_OBJ_DIR) :
mkdir -p $(AUTH_SERVER_OBJ_DIR)
$(AUTH_SERVER_OBJ_DIR)/%.o : $(AUTH_SERVER_DIR)/%.cpp
$(CXX) $(CXXFLAGS) $(SERVER_CORE_INC) -o $@ -c $<
$(AUTH_SERVER_OBJ_DIR)/%.o : $(AUTH_SERVER_DIR)/%.cc
$(CXX) $(CXXFLAGS) $(SERVER_CORE_INC) -o $@ -c $<
#======= AuthServer ========#
#======= DummyCient ========#
cli : $(CLIENT_EXE)
$(CLIENT_EXE) : $(CLIENT_OBJ_DIR) $(CLIENT_OBJ) $(SERVER_CORE_LIB)
$(CXX) $(CXXFLAGS) $(CLIENT_OBJ) $(SERVER_CORE_LIB) $(LDLIBS) -o $(CLIENT_EXE)
$(CLIENT_OBJ_DIR) :
mkdir -p $(CLIENT_OBJ_DIR)
$(CLIENT_OBJ_DIR)/%.o : $(CLIENT_DIR)/%.cpp
$(CXX) $(CXXFLAGS) $(SERVER_CORE_INC) -o $@ -c $<
$(CLIENT_OBJ_DIR)/%.o : $(CLIENT_DIR)/%.cc
$(CXX) $(CXXFLAGS) $(SERVER_CORE_INC) -o $@ -c $<
#======= DummyCient ========#
#======= ServerCore ========#
$(SERVER_CORE_LIB) : $(SERVER_CORE_OBJ_DIR) $(SERVER_CORE_OBJ)
ar rcs $(SERVER_CORE_LIB) $(SERVER_CORE_OBJ)
$(SERVER_CORE_OBJ_DIR) :
mkdir -p $(SERVER_CORE_OBJ_DIR)
$(SERVER_CORE_OBJ_DIR)/%.o : $(SERVER_CORE_DIR)/%.cpp
$(CXX) $(CXXFLAGS) $(AUTH_SERVER_INC) -o $@ -c $<
#======= ServerCore ========#
clean :
rm -rf $(AUTH_SERVER_OBJ_DIR) $(CLIENT_OBJ_DIR) $(SERVER_CORE_OBJ_DIR)
fclean : clean
rm -rf $(AUTH_SERVER_EXE) $(CLIENT_EXE) $(SERVER_CORE_LIB)
re : fclean all
o파일들을 깔끔하게 각 폴더의 ObjectFiles에 생성하고, 삭제할때는 폴더째로 삭제하게 만들어봤다.
make 를 하면 client와 authserver(지금이름은 test) 프로그램이 makefile 디렉토리에 생성되도록 만들었다.
make auth, make cli 로 서버나 클라만 만들수도 있다.
Include 문제는 아래와같이 서버코어 인클루드 위치를 넣어서 컴파일단계에 삽입했다.
SERVER_CORE_INC = -I$(SERVER_CORE_DIR)
$(AUTH_SERVER_OBJ_DIR)/%.o : $(AUTH_SERVER_DIR)/%.cpp
$(CXX) $(CXXFLAGS) $(SERVER_CORE_INC) -o $@ -c $<
$(AUTH_SERVER_OBJ_DIR)/%.o : $(AUTH_SERVER_DIR)/%.cc
$(CXX) $(CXXFLAGS) $(SERVER_CORE_INC) -o $@ -c $<
그리고 주의할것이 링크, 빌드할때는 외부라이브러리가 마지막에 와야한다.
# 외부 라이브러리들
LDLIBS = -lhiredis -lpq -lprotobuf -lssl -lcrypto
$(AUTH_SERVER_EXE) : $(AUTH_SERVER_OBJ_DIR) $(SERVER_CORE_LIB) $(AUTH_SERVER_OBJ)
$(CXX) $(CXXFLAGS) $(AUTH_SERVER_OBJ) $(SERVER_CORE_LIB) $(LDLIBS) -o $(AUTH_SERVER_EXE)

성공적으로 client와 test(서버) 프로그램이 빌드된다!
'프로젝트 > Project_Island' 카테고리의 다른 글
| 12. DummyClient (2) (0) | 2026.03.06 |
|---|---|
| 11. DummyClient (1) (0) | 2026.03.06 |
| 9. DBConnectionPool 기초다지기 (0) | 2026.03.05 |
| 8. PacketHandler (0) | 2026.03.04 |
| 7. Protobuf, PacketHeader, PacketSession (0) | 2026.03.04 |