지금까지는 모든 파일을 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

+ Recent posts