본 프로젝트는 전북대학교 리눅스 프로그래밍 수업에서 진행된 팀 프로젝트로, Linux 환경에서 제공하는 소켓 통신, 파일 시스템, 프로세스, 시스템 콜을 직접 활용하여 C 언어 기반의 다중 사용자 게시판 서버/클라이언트 시스템을 구현하는 것을 목표로 합니다.
서버는 다수의 클라이언트로부터 동시에 접속 요청을 수신하며, 회원가입 및 로그인과 같은 인증 기능을 기반으로 게시글과 댓글을 파일 기반 데이터베이스로 관리합니다.
특히 본 프로젝트는 단순한 콘솔 프로그램을 넘어,
- TCP 소켓을 이용한 클라이언트–서버 구조
- 다중 클라이언트 환경에서의 동시성 처리
- 파일 I/O 및 파일 잠금(lock)을 통한 데이터 무결성 보장
- 시스템 콜 기반의 저수준 구현
을 중심으로, 리눅스 시스템 프로그래밍의 핵심 개념을 실제로 적용하는 데 초점을 맞추었습니다.
본 게시판 시스템은 인증, 게시글, 댓글의 세 영역으로 구성됩니다.
- 회원가입
- 새로운 사용자 계정을 생성하고 사용자 정보를 파일에 저장
- 로그인
- 아이디 및 비밀번호 검증을 통해 사용자 인증 수행
- 서버 세션에서 로그인 상태 유지
- 게시글 작성
- 로그인한 사용자만 게시글 작성 가능
- 작성자 정보, 작성 시각, 내용 등을 파일에 저장
- 게시글 수정
- 작성자 본인만 게시글 수정 가능
- 게시글 삭제
- 작성자 권한 검증 후 삭제 처리
- 게시글 검색
- 제목 또는 작성자 기준으로 게시글 검색 지원
- 댓글 작성
- 특정 게시글에 댓글 추가
- 작성자 및 작성 시각 정보 저장
본 프로젝트는 Linux 환경을 기준으로 개발되었습니다. 프로젝트를 빌드 및 실행하기 위해서는 다음 도구들이 필요합니다.
- gcc : C 컴파일러
- make : Makefile 기반 빌드 도구
- git : 소스 코드 다운로드
sudo apt update
sudo apt install -y gcc make gitsudo dnf install -y gcc make gitbrew install gcc make git설치가 완료되면 다음 명령어로 정상 설치 여부를 확인할 수 있습니다.
gcc --version
make --version
git --version본 프로젝트를 실행하기 위한 단계는 다음과 같습니다.
GitHub에서 프로젝트 저장소를 로컬 환경으로 클론합니다.
git clone https://github.com/boseung2/linux-board.git
cd linux-board프로젝트의 서버와 클라이언트를 빌드합니다. Makefile이 제공되므로 make 명령어를 사용합니다.
make clean
makemake clean: 이전에 빌드된 실행 파일 및 오브젝트 파일을 제거합니다.make: 서버 (server/server) 및 클라이언트 (client/client) 실행 파일을 빌드합니다.
성공적으로 빌드되면 server/server와 client/client 실행 파일이 각 디렉터리에 생성됩니다.
클라이언트가 접속할 수 있도록 서버를 먼저 실행해야 합니다.
./server/server서버가 성공적으로 시작되면 다음과 같은 메시지가 출력됩니다.
Server is running on port 9000
서버가 실행 중인 상태에서 클라이언트를 실행하여 게시판 시스템에 접속합니다.
./client/client클라이언트가 서버에 성공적으로 연결되면 다음과 같은 메시지가 출력됩니다.
Connected to server 127.0.0.1:9000
이제 클라이언트 콘솔을 통해 게시판 기능을 이용할 수 있습니다.
본 프로젝트의 주요 디렉터리 및 파일 구조는 다음과 같습니다.
.
├── Makefile # 프로젝트 빌드 자동화를 위한 make 파일
├── README.md # 프로젝트 설명 문서
├── client/ # 클라이언트 관련 소스 코드
│ ├── client.h # 클라이언트 공통 헤더
│ ├── main.c # 클라이언트 메인 함수 (초기화 및 UI 흐름 제어)
│ ├── socket.c # 서버와의 소켓 통신 처리
│ ├── socket.h # 소켓 통신 관련 헤더
│ ├── ui_auth.c # 인증(회원가입, 로그인) UI 및 로직
│ ├── ui_auth.h # 인증 UI 헤더
│ ├── ui_board.c # 게시판(글 목록, 상세, 작성, 수정, 삭제, 댓글) UI 및 로직
│ ├── ui_board.h # 게시판 UI 헤더
│ ├── ui_main_menu.c # 메인 메뉴 UI 및 로직
│ └── ui_main_menu.h # 메인 메뉴 UI 헤더
├── data/ # 서버 데이터 저장 (게시글, 사용자 정보 등)
├── server/ # 서버 관련 소스 코드
├── auth.c # 사용자 인증 처리 (세션 관리)
├── auth.h # 인증 관련 헤더
├── board_controller.c # 클라이언트 요청(게시판 관련) 처리 및 서비스 호출
├── board_controller.h # 게시판 컨트롤러 헤더
├── board_service.c # 게시글/댓글 데이터 파일 CRUD 로직
├── board_service.h # 게시판 서비스 헤더
├── board.h # 게시글 및 댓글 구조체 정의
├── lock.h # 파일 잠금(fcntl) 관련 헤더
├── log.c # 서버 로깅 기능
├── log.h # 로깅 헤더
├── server.c # 서버 메인 함수 (소켓 초기화, 다중 클라이언트 관리)
├── user.c # 사용자 정보(회원가입, 로그인) 파일 CRUD 로직
└── user.h # 사용자 정보 관련 헤더
client/: 사용자 인터페이스 및 서버와의 통신 로직을 담당하는 클라이언트 측 코드입니다. 사용자의 입력을 받고 서버에 요청을 전송하며, 서버 응답을 파싱하여 사용자에게 보여주는 역할을 합니다.server/: 클라이언트의 요청을 처리하고 데이터를 관리하는 서버 측 코드입니다. 소켓 통신, 사용자 인증, 게시판 데이터 관리, 파일 잠금 등을 처리합니다.data/: 서버가 관리하는 사용자 계정 정보, 게시글 및 댓글 데이터가 이진 파일 형태로 저장되는 디렉터리입니다. 서버 실행 시 자동으로 생성됩니다.
각 주요 기능에 대한 상세 설명 및 스크린샷입니다.
새로운 사용자 계정을 생성합니다. 아이디와 비밀번호를 입력받아 서버에 전송하고, 중복 확인 후 계정을 생성합니다.
등록된 아이디와 비밀번호로 시스템에 로그인합니다. 성공 시 사용자 세션이 유지되며, 게시판 기능에 접근할 수 있습니다.
작성된 모든 게시글을 최신순으로 조회합니다. 페이지네이션을 지원하며, 제목 또는 작성자로 검색할 수 있습니다.
특정 게시글의 제목, 작성자, 내용, 작성일시 등을 상세하게 조회합니다.
로그인한 사용자는 새로운 게시글을 작성할 수 있습니다. 제목과 내용을 입력하여 게시글을 등록합니다.
작성자 본인만 게시글을 수정할 수 있습니다. 기존 내용을 바탕으로 제목과 내용을 변경합니다.
작성자 본인만 게시글을 삭제할 수 있습니다. 게시글은 실제로 삭제되지 않고 is_deleted 플래그를 통해 비활성화됩니다 (Soft Delete).
게시글 상세 화면에서 댓글을 작성할 수 있습니다. 작성된 댓글은 게시글 하단에 표시됩니다.
- 로그인 성공 시 서버는 소켓(fd)과 사용자 ID를 세션으로 매핑하여 관리합니다.
- 이후 요청에서는 클라이언트로부터 사용자 ID를 직접 전달받지 않고, 서버 세션을 통해 인증 상태를 유지합니다.
- 다수의 클라이언트가 동시에 파일에 접근하는 환경을 고려하여
fcntl기반 파일 잠금을 적용하였습니다. - 이를 통해 게시글 및 사용자 데이터 파일 접근 시 Race Condition을 방지합니다.
- 5분 동안 활동이 없는 세션은 자동으로 로그아웃 처리됩니다.
- 이를 통해 서버 자원 점유를 최소화하고 안정적인 운영을 고려하였습니다.
- 별도의 데이터베이스를 사용하지 않고, 파일 시스템을 직접 활용하여 데이터를 관리합니다.
- 서버 재시작 이후에도 기존 데이터가 유지되도록 설계하였습니다.
- 서버의 주요 동작(접속, 인증, 파일 접근 등)을 로그로 기록하여 디버깅과 시연에 활용합니다.
- 게시글 수정 및 삭제 시 서버 세션 정보와 게시글 작성자를 비교하여 권한을 검증합니다.
- 클라이언트 입력에 의존하지 않는 서버 중심 권한 판단 구조를 적용하였습니다.
- 서버는 다수의 클라이언트 접속을 처리할 수 있도록 소켓 기반 구조로 설계되었습니다.
- 세션 관리와 파일 잠금을 통해 동시 접속 환경에서도 안정적인 동작을 보장합니다.
- 파일 크기 무한 증가를 방지하기 위해 게시글 최대 개수를 제한하였습니다.
- 제한 초과 시 게시글 생성 요청을 거부하여 서버 안정성을 고려하였습니다.
서버–클라이언트 소켓 통신 구조를 설계하고 구현하였으며, 회원가입 및 로그인 기능을 담당하여 사용자 인증 흐름을 완성하였다. 또한 게시판의 사용성을 향상시키기 위한 부가 기능을 중심으로 구현하였다.
주요 기능 구현
- 서버–클라이언트 소켓 통신 구조 설계 및 구현
- 회원가입 및 로그인 기능 구현
- 자동 로그아웃 기능 구현
- 게시글 목록 페이지네이션 기능 구현 (이전 페이지 / 다음 페이지)
- 게시글 목록 검색 기능 구현 (제목, 작성자 기준)
- 시연 영상 제작
게시판 시스템의 핵심 기능(CRUD)을 담당하였으며, 다중 클라이언트 환경에서의 안정적인 동작을 위해 동시성 제어와 권한 관리를 중점적으로 구현하였다.
주요 기능 구현
- 게시글 기능 구현 (Create, Read, Update, Delete)
- 게시판 파일에 대한 전체 구조 단위 Lock 적용
- 작성자 본인만 게시글 수정/삭제가 가능하도록 권한 검사 로직 구현
- 게시글 상세 보기에서 내용이 한 줄만 출력되던 오류 수정
- 발표 영상 제작
본 프로젝트를 수행하며 소켓 통신과 파일 시스템을 직접 다루는 과정에서, 시스템 프로그래밍이 단순한 기능 구현이 아니라 자원 관리와 안정성을 고려한 설계의 연속임을 체감할 수 있었다.
특히 다중 클라이언트 접근 상황에서의 파일 잠금, 세션 관리, 권한 검증 등을 구현하며 이론으로 배운 개념이 실제 프로그램에서 어떤 의미를 가지며, 어떻게 활용되는지를 구체적으로 이해할 수 있었다.
이러한 경험은 향후 더 복잡한 서버 프로그램을 설계하고 구현하는 데 중요한 경험이 될 것으로 기대한다.











