본문 바로가기

Development

(135)
Nest.js 클러스터링 무비위키 프로젝트의 성능 개선을 위해 cluster 모듈을 이용해 멀티 프로세싱을 적용했다. 멀티 스레드와 멀티 프로세스가 같은 개념인줄 알았는데 다른 개념이었다. 멀티 스레딩 단일 프로세스 내에서 여러 개의 스레드를 생성하여 동시에 작업을 수행하는 것을 의미한다. 각 스레드는 같은 주소 공간을 공유하므로 데이터 공유가 간단하고 효율적이다. 하지만 스레드 간의 동기화와 경쟁 조건 같은 복잡한 문제를 처리해야 하므로 디버깅이 어려울 수 있다. 멀티 프로세싱 또는 클러스터링 여러 개의 독립된 프로세스를 생성하여 각각을 별도의 CPU 코어에서 실행하는 것을 의미한다. 각 프로세스는 자체적인 주소 공간을 가지고 있으며, 데이터 공유와 통신을 위해 별도의 매커니즘이 필요하다. 각 프로세스가 독립적으로 실행되므로 ..
WIL_챌린지 프로젝트 4주차 지난주 회고 문장 단위 Diff, Patch 코드 구현을 완료했다. 개념은 검색을 통해 쉽지 않게 찾을 수 있었지만 코드 레퍼런스는 거의 없다시피 했다. 구글링과 gpt를 활용해 코드를 완성할 수 있었고 테스트를 통한 수정 보완 후 멘토링 때 만족스러운 평가를 받을 수 있었다. 이번주 목표 이제 실제 코드를 만질 수 있는 시간은 1주일이 채 남지 않았다. 남은 시간을 잘 활용해 기능 고도화와 성능 개선에 집중해야한다. 사실 두 가지를 모두 하기엔 시간이 부족할 것 같다. 우선 기능 고도화에 초점을 두고 진행해야겠다. 기능 고도화 : 실시간 인기게시글, 신고제재 성능 개선 : diff 데이터를 줄이기 위한 압축 알고리즘 (허프먼?)
프로세스 생명주기와 프로세스 메모리 프로세스 생명주기 신규 프로세스가 메인메모리에 올라옴 (실행X) 준비 변수 초기화 등 기초작업 끝낸 후 실행 할 수 있는 상태 수행 CPU가 프로세스 수행 스케줄링에 의해 중단되면 준비 상태로 I/O 또는 이벤트가 필요하면 대기 상태로 수행이 완료되면 종료 상태로 대기 프로세스 도중에 I/O 또는 이벤트 작업이 필요할 경우 종료 최종적으로 프로세스가 종료된 상태 사용하던 메모리 영역 해제 대기 큐 (Waiting Queue) Job queue HDD에 있던 프로그램이 메모리에 올라올 때 메인 메모리가 가득 찼거나 CPU가 다른 작업을 수행 중이라면 메모리에 올라오기 전에 어느 정도 기다려야하는데 HDD의 프로그램들이 잠시 기다리는 곳 Ready Queue 메모리에 올라온 프로세스들이 실행을 위해 대기하는..
비교 단위별 Diff 및 Patch 코드 동작 속도 측정 문장 단위 diff 및 patch 알고리즘 구현이 완료되었다. 현재까지는 특이사항 없이 안정적으로 작동하는 것으로 확인된다. 그런데 문득 글자와 문장 단위 diff 및 patch 코드 동작 속도가 궁금해졌다. 그래서 각각 속도 측정을 하여 비교해보았다. 프로젝트 폴더에서 테스트를 진행할 수 없어 새 폴더를 만들었다. 그런데 서버까지 만들기는 번거로워서 터미널을 통해 코드 동작 속도를 확인하는 방법을 찾아봤다. 타입스크립트 코드 실행 시간 측정 방법 실행 시간을 측정하고자 하는 코드 시작과 끝 지점에 아래 코드를 넣으면 된다. (간단해서 좋았다!) const start = performance.now(); // 성능을 측정하려는 코드 블록 또는 함수 실행 const end = performance.now(..
patch 알고리즘 수정 (feat. </p> 태그 지옥) 현재 진행중인 프로젝트인 무비위키의 버전 관리 기능은 크게 두 부분으로 나뉜다. 두 문서의 변경 사항을 추적하여 데이터화 하는 diff 알고리즘과 원본 문서와 변경 사항 데이터를 더해서 최신 버전 문서를 만들어내는 patch 알고리즘이다. 그런데 기능 테스트 중 오류를 발견했다. 한산 : 리덕스 (moviId : 3721)의 버전 기록 버전 6의 content에 버전 7의 diff를 더하면 버전 7의 content가 나와야하는데 변경 사항 데이터인 diff가 제대로 반영이 되지 않는다..... { "postId": 148, "userId": 13, "content": "이순신 3부작의 2탄!노량의 기록을 깰 수 있을 것인가최종 스코어 720만박해일 버전 이순신은 뭔가 냉철한 느낌이네요가슴이 웅장해지네요...
DP, LCS, MED, SES 개념정리 문서의 문장 단위 변경 추적 기능을 공부하고 구현하며 헷갈렸던 개념들을 간단하게 정리해보려고 한다. Dynamic Programming : 동적 프로그래밍 문제를 여러 하위 문제로 분할하여 해결하는 알고리즘 설계 기법이다. 하위 문제의 해결 방식을 저장하고 재사용하여 중복 계산을 피하는 방식으로 동작한다. 이를 통해 계산 속도를 개선할 수 있다. 동적 프로그래밍은 피보나치 수열, 최장 공통 부분 수열, 최단 경로 문제 등 다양한 문제에 적용할 수 있다. 이러한 문제들은 최적 부분 구조와 중복 부분 문제의 성질을 가지고 있어 동적 프로그래밍을 사용하여 효율적으로 해결될 수 있다. 동적 프로그래밍의 세 가지 주요 요소 Optimal Substructure : 최적 부분 구조 주어진 문제의 최적해가 하위 문제..
문서의 문장 단위 변경 추적 주말에 git의 diff 알고리즘에 학습을 하고 오늘은 코드 작성을 해보았다. git의 diff 알고리즘은 공개되지 않아 레퍼런스가 거의 없다시피 한 상태다. 그래서 개념적인 부분만 적용 해서 코드를 작성해보았다. 무비위키 프로젝트에서 기존의 문서 비교 부분에 적용되어있던 diff 알고리즘과 다른점은 원본 문서와 수정된 문서의 비교를 글자 단위가 아니라 문장 단위로 끊어서 진행한다는 것이다. 문장 단위 변경 사항 추적 알고리즘 사용자가 특정 영화의 post를 등록하면 html 태그가 달린 문자열 형태로 db에 저장된다. 그래서 문자열을 문장 단위로 끊어서 비교를 해주기 위해 p태그를 이용하여 split해준다. 원본 문서와 수정된 문서를 각각 배열로 바꿔준 다음 인덱스를 이용해 비교한다. 추가된 문장과 삭..
WIL_챌린지 프로젝트 3주차 이번주 회고 API 1차 스코프 구현을 완료하고 2차 스코프 구현에 돌입했다. 나는 생성된 문서를 불러오는 기능을 맡았는데 롤백이 중요한 요소이다. 멘토링을 통해 기존에 문서 변경 추적에 사용한 알고리즘을 수정사항이 생겼다. 다음주 목표 문서의 변경 사항을 글자 단위가 아니라 라인 단위로 추적하는 알고리즘으로 수정해야한다. 특정 버전으로 롤백하면 해당 버전을 최신 버전으로 바꿔줘야하고 새로운 버전으로 생성해야한다. 각 버전의 변경 사항 데이터를 이용해 문서의 변경 이력도 보여줘야 한다. 스케줄 관리를 잘해서 밀도있는 한주를 보내야한다.