Development/TIL (56) 썸네일형 리스트형 DP, LCS, MED, SES 개념정리 문서의 문장 단위 변경 추적 기능을 공부하고 구현하며 헷갈렸던 개념들을 간단하게 정리해보려고 한다. Dynamic Programming : 동적 프로그래밍 문제를 여러 하위 문제로 분할하여 해결하는 알고리즘 설계 기법이다. 하위 문제의 해결 방식을 저장하고 재사용하여 중복 계산을 피하는 방식으로 동작한다. 이를 통해 계산 속도를 개선할 수 있다. 동적 프로그래밍은 피보나치 수열, 최장 공통 부분 수열, 최단 경로 문제 등 다양한 문제에 적용할 수 있다. 이러한 문제들은 최적 부분 구조와 중복 부분 문제의 성질을 가지고 있어 동적 프로그래밍을 사용하여 효율적으로 해결될 수 있다. 동적 프로그래밍의 세 가지 주요 요소 Optimal Substructure : 최적 부분 구조 주어진 문제의 최적해가 하위 문제.. 문서의 문장 단위 변경 추적 주말에 git의 diff 알고리즘에 학습을 하고 오늘은 코드 작성을 해보았다. git의 diff 알고리즘은 공개되지 않아 레퍼런스가 거의 없다시피 한 상태다. 그래서 개념적인 부분만 적용 해서 코드를 작성해보았다. 무비위키 프로젝트에서 기존의 문서 비교 부분에 적용되어있던 diff 알고리즘과 다른점은 원본 문서와 수정된 문서의 비교를 글자 단위가 아니라 문장 단위로 끊어서 진행한다는 것이다. 문장 단위 변경 사항 추적 알고리즘 사용자가 특정 영화의 post를 등록하면 html 태그가 달린 문자열 형태로 db에 저장된다. 그래서 문자열을 문장 단위로 끊어서 비교를 해주기 위해 p태그를 이용하여 split해준다. 원본 문서와 수정된 문서를 각각 배열로 바꿔준 다음 인덱스를 이용해 비교한다. 추가된 문장과 삭.. git의 diff 알고리즘 오늘은 코치님의 멘토링이 있었다. 현재 우리 프로젝트는 LCS를 기반으로 한 diff 알고리즘을 형상 관리에 적용하고 있다. 그런데 코치님은 LCS에 기반한 diff 알고리즘은 비효율적이라고 다른 알고리즘을 사용할 것을 추천하셨다. 그래서 git에서 사용하는 diff 알고리즘에 대한 설명이 담긴 웹 페이지를 공유해주셨다. 그것을 보고 학습한 내용을 정리해보려고 한다. diff와 patch diff는 두 개의 파일 또는 문서 간의 차이점을 식별하는 알고리즘 또는 도구를 의미한다. 원본과 수정된 버전 사이의 변경 내용을 탐지하고 추가된 내용, 제거된 내용, 수정된 내용 등을 식별한다. 주로 LCS 알고리즘이나 히스토그램 알고리즘 등을 사용해 구현할 수 있다. patch는 변경된 내용을 적용하는 것을 의미한다.. 데이터 형상 관리 (특정 버전으로 롤백) 이번주는 증분식 데이터 형상관리 학습과 구현으로 대부분의 시간을 보냈다. 나는 최신 버전 전체 스냅샷과 특정 버전 스냅샷으로 롤백하는 기능 구현을 맡았다. 전체 스냅샷 응답은 스냅샷 테이블에서 특정 영화의 id 값을 기준으로 찾아서 보여주면 되는 것이기 때문에 어려움 없이 구현할 수 있었다. 반면 롤백 기능 구현에 많은 시간을 할애했다. 롤백은 post 테이블에 쌓인 버전별 변경사항 데이터와 snapshot 테이블에 10개의 버전 단위로 쌓인 전체 스냅샷 데이터를 movieId와 version 값을 기준으로 찾아와서 합치는 것이 기본적인 로직이다. 오늘 애를 먹었던 부분은 post 테이블에서 여러 버전의 변경 사항 데이터들을 가져와 원본 문서와 더해주는 함수에 집어 넣는 것이다. 아래는 repositor.. 증분식 데이터 형상관리 : Increment Data Versioning 현재 진행중인 MovieWiki 프로젝트의 1차 API 작성을 완료했다. 이제 다음 스텝은 성능 개선 및 기능 고도화다. 그중에서도 가장 난이도가 높을 것으로 예상되는 것이 프로젝트의 핵심 기능인 데이터 형상관리 (Data Versioning)이다. 지난주 멘토링에서 코치님이 증분식 데이터 형상관리(Increment Data Versioning)를 사용하는 것으로 방향성을 제시해주셨다. 그래서 그에 대해 학습한 것을 정리해본다. 증분식 데이터 형상관리(Increment Data Versioning) 데이터의 변경 이력을 증분 방식으로 관리하는 방법이다. 데이터의 일부분이 변경되었을 때 전체를 저장하거나 복사하는 대신 변경된 부분만 저장하여 저장 공간을 절약하고 데이터 전송 시간을 단축시키는 장점이 있다... TypeORM enum 타입 사용하기 코드 작성 중 entity에 제한된 값을 가지는 컬럼을 만들기 위해 enum(열거형) 타입을 사용해보았다. 진행중인 프로젝트에서 유저가 특정 게시물에 적절하지 않은 내용이 있을 경우 신고를 할 수 있는 기능이 있다. 그래서 유저가 해당 게시물에 신고 요청을 하면 관리자가 내용을 확인하고 승인 또는 반려를 하게된다. 위의 로직에서 특정 신고에 3가지의 제한된 상태가 필요하다. 유저가 특정 게시물 신고를 완료한 상태 => AWAIT (관리자의 처리를 대기하는 상태) 관리자가 내용을 확인하고 신고를 승인한 상태 => ACCEPT 신고 내용이 적절하지 않아 반려한 상태 => REJECT notification-status.enum.ts 먼저 enum 파일을 생성하여 상태 값을 정의해주었다. export enum.. git stash(생성, 삭제, 복구) 협업을 하다보면 내가 작성해놓은 코드를 커밋하기 전에 github repository에서 pull을 해야할 경우가 생긴다. 그럴경우엔 git stash 명령어를 사용하여 커밋을 하지 않고 임시 저장해두었다가 merge를 완료한 후에 불러와서 작업을 이어갈 수 있다. 오늘도 프로젝트의 organization repo에서 내 repo로 최신버전을 sync fork한 후 local에서 작업중이던 내용을 stash하고 remote repo를 pull해왔다. 그리고 stash apply를 이용해 임시 저장한 작업 내용을 불러왔다. 문제는 그 다음에 발생했다. 괜히 stash 기록을 깔끔하게 만들고 싶어서 stash drop을 이용해 list를 지웠더니 해당 stash에 적용되는 코드들이 전부 날아가버린 것이다. .. TypeORM Isolation Level 이번 프로젝트에 transaction을 적용하며 TypeORM이 지원하는 transaction의 격리 수준에 대해 정리한다. 트랜잭션 격리 수준(Isolation Level)은 데이터베이스에서 동시에 실행되는 트랜잭션들 간에 어떻게 상호작용하고 데이터 일관성을 유지할지를 정의하는 개념이다. TypeORM은 다양한 트랜잭션 격리 수준을 지원한다. 1. Read Uncommitted (Level 0): - 가장 낮은 격리 수준이며, 트랜잭션의 변경 내용이 커밋되지 않았더라도 다른 트랜잭션에서 해당 변경 내용을 읽을 수 있다. - Dirty Read, Non-repeatable Read, Phantom Read 등과 같은 일관성 문제가 발생할 수 있다. 2. Read Committed (Level 1): - .. 이전 1 2 3 4 5 ··· 7 다음 목록 더보기