보통 c언어에서는 데이터 셋을 구조체를 통해 구현한다. 다른 언어가 객체와 같이 key-value 쌍으로 유연하게 속성을 추가하고, 관리할 수 있다. 그러나 c는 구조페를 선언할때 사용할 맴버를 미리 정해야하고, 구조체 배열에서 CRUD을 수행하려면 배열을 전부 순회하거나 새로 만드는 형식으로 밖에 구현이 불가능하다. 때문에 이번 프로젝트에서는 해쉬 테이블을 사용하여 CRUD를 좀 더 간편하고, 빠르게 구현할 것이다. 해쉬 테이블 구성 해쉬 테이블에는 uthash라는 라이브러리를 사용하며, UT_hash_handle라는 속성을 구조체에 추가하여 구현하였다. struct file_list { char *path; char *file_name; unsigned long file_path_size; unsig..
이번 파트는 동기화 리스트.txt 파일을 읽고, 거기에 저장된 경로를 추출하는 것이다. 때문에 유효한 경로인지 확인하는 것과 상대 경로 구분하고 베이스 설정 등을 소개할 것이다. 이번 코드는 서버 코드만 나오면 클라이언트 관련 코드는 없다 실행 인자 먼저 실행 시 입력하는 인자에 대해서이다. 우선 서버 간 동기화는 고려하지 않기에 실행 인자는 동기화 리스트 1개이다. 다음은 인자 관련 코드이다. #define MAX_LENGTH 4096 int main(int argc, char *argv[]) { char sync_file_path[MAX_LENGTH]; memset(sync_file_path, 0, sizeof(sync_file_path)); // 인자 미입력시 입력 if (0 == file_path..

1.개발 및 운영 환경 c언어로 개발. vs 코드 사용 ubuntu 20.04 에서 동작 주요 기능에 대해 google test로 유닛테스트 작성. cmake로 컴파일 cli 기반 프로그램 요구 사항 1차 목표 - 서버-클라이언트 동기화 서버에서 클라이언트에게 파일을 전송하여, 두 기기 간의 파일 동기화를 진행한다. 파일의 경로가 저장된 동기화 리스트.txt를 서버가 가지고 있으며, 이 리스트는 주기적으로 업데이트 된다. 이때 동기화 리스트는 실행시 인자로 경로를 입력한다. 최초로 서버와 클라이언트 연결 시, 서버는 동기화 파일들을 클라이언트에 전송한다. 이후, 동기화 리스트 혹은 동기화 파일이 업데이트 되었을 경우, 변경된 파일만 전송한다. 모든 전송은 대상 파일들을 직렬화하여 전송한다. 일정 크기 이..

이번 메인 프로젝트에서 많은 것을 배웠지만, 가장 큰 성과는 useEffect의 구조에 대해서 확실히 알게 되었다는 것이다. 사실 지금까지 useEffect를 많이 사용하기는 하였지만, useEffect에 대해서 깊게 생각해 본 적은 없었다. 그저 "처음 렌더링시 실행되고, 의존성 배열에 있는 상태가 바뀌면 또다시 실행된다. 추가로 return으로 원마운트시에 clean-up 함수를 지정할 수 있다"라고 알고 있었다. 물론 저 말이 틀린 것도 아니고, 실사용시에도 저 정도만 알고 있어도 된다. 그러나 가끔 무한 루프가 발생할 때가 있었는데, 이게 useEffect에서 발생한다는 것은 알았지만, 왜 그런지는 알지 못했다. 추가로 실행 시점을 제대로 알지 못해서 저번 recoil게시글에서의 오류의 원인이 되..