본문 바로가기

전체 글94

동기와 비동기 / Deadlock 동기/비동기 : 요청한 작업에 대해 완료여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 대한 관점 블로킹/논블로킹: 단어 그대로 현재 작업이 block 되느냐, 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점 보통 비동기 특징을 성능과 연관지어 말한다. 왜냐하면 요청한 작업에 대해 완료여부를 신경쓰지 않고 자신의 그 다음 작업을 수행한다는 것은, I/O 작업과 같은 느린 작업이 발생할 때, 기다리지 않고 다른 작업을 처리하면서 동시에 처리하여 멀티 작업을 진행할 수 있기 떄문이다. 이는 전반적인 시스템 성능 향상에 도움을 줄 수 있다. 데드락 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태. '교착상태'라고도 하며 시스템적으로 한정된 자원을 여러곳에서 사용하려고 할 때 발생한다... 2024. 4. 22.
Nest) request Query nullable 명시했으나 오류가 생기는 문제 @ApiOperation({ summary: '리뷰 조회' }) @Render('detailContent') @Get() async getCReivew( @Param('webContentsId', ParseIntPipe) webContentsId: number, @Query('page', ParseIntPipe) page?: number, @Query('order') order?: string, @Query('option') option?: string, ) { const result = await this.reviewService.getCReviews( webContentsId, page, order, option, ); const { content, reviewList, totalPages } = r.. 2024. 4. 18.
Promise, asyc/await, Hoisting Promise 자바스크립트 프로미스는 비동기 프로그래밍의 근간이 되는 기법 중 하나이다. 프로미스를 사용하면 콜백 함수를 대체하고, 비동기 흐름을 쉽게 제어할 수 있다. 프로미스 객체는 비동기 작업의 최종완료 또는 실패를 나타내는 Array 나 Object처럼 독자적인 객체라고 보면 된다. 비동기 작업이 끝날 때까지 결과를 기다리는것이 아니라, 결과를 제공하겠다는 '약속'을 반환한다는 의미에서 Promise라 명명 지어졌다고 한다. 비동기는 다같이 땅 해서 달리는거 동기는 릴레이 달리기. 바톤을 넘겨줘야 코드 실행가능~~ async/await Hoisting 2024. 4. 17.
GCP Compute Engine 이용해 서버 배포하기 gcp를 이용해 서버 배포하는법을 알아보자! aws EC2 ubuntu 서버와 동일하게 대응하는것은 GCP의 Compute Engine 이다. 우선 Compute Engine에 들어가 인스턴스 만들기를 눌러준다. 새 vm 인스턴스, 템플릿에서 만들기, 머신 이미지 등등 많지만 우리가 사용할것은 vm 인스턴스이다. 이름: 내가 사용할 인스턴스 이름설정 리전: 서울로 설정(근데 왜 라스베가스보다 가격이 올라가는...?) 머신구성: N1 우리가 aws에서 항상 하던 그놈 부팅디스크는 Ubuntu로 설정해준다. 다른 블로그에서는 크기를 20으로 맞추던데 상황따라 하면 될것같다. 방화벽도 이렇게 설정해준다. 그리고 만들어주면 끝!! 정상적으로 만들어진 인스턴스에 들어가서 SSH > 브라우저 창에서 열기를 클릭하면.. 2024. 4. 16.
api를 이용한 스크래핑 성능 개선 퍼페티어를 이용해 스크래핑을 완성하였으나, 성능이 너무나 뒤떨어졌다. 데이터 스크래핑을 해야하는 페이지는 사용자에게 쾌적한 사용을 주기 위해서인지 스크롤을 해서 해당 페이지에 도착했을때 해당 데이터가 네트워크 탭을 통해 들어오게 된다. 이런 특성 때문에 퍼페티어상에서도 직접 스크롤을 해야하고, 리뷰 목록을 가져올때도, 아무튼 모든걸 하나하나 클릭을 해서 가져오는데에 비해 가져올 데이터는 많아서 느려도 너무 느렸다.. 작품 데이터 상위 20개만 가져온다고 해도 먼저 랭킹페이지에서 20위까지의 상세페이지 링크를 긁어모으고, 하나하나 들어가서 원하는 데이터를 가져와야한다. 이 와중에 스크롤도 해야하고 리뷰버튼은 더보기 버튼의 css 선택자가 달랐다... 뭐 이런 문제는 차치해도 성능이 큰 문제였다. 저렇게만 .. 2024. 4. 15.
Array & LinkedList / Stack & Queue Array와 LinkedList 배열과 링크드리스트는 데이터를 저장하고 관리하는데 사용되는 두 가지 기본적인 자료구조이다. 배열 연속된 메모리 공간에 데이터를 저장한다. 인덱스를 사용해 원소에 빠르게 접근할 수 있다. 고정된 크기를 가지며, 크기변경이 어렵다. 미리 할당된 메모리 크기를 초과하면 새로운 메모리 공간을 할당하고 데이터를 복사해야합니다. 원소를 삽입하거나 삭제할때, 원소들을 이동시켜야 하므로 시간이 오래 걸릴 수 있습니다. 메모리 사용이 효율적이다. 각 원소는 인덱스로 접근되며, 추가적인 메모리를 사용하지 않는다. 링크드 리스트 각 노드가 데이터와 다음 노드에 대한 참조포인터를 포함하며, 노드들이 연속되지 않은 메모리 공간에 저장된다. 원소에 접근하기 위해서 리스를 순차적으로 탐색해야 한다... 2024. 4. 15.
힙 정렬 힙정렬 우선순위 큐를 위해 만들어진 자료구조 완전 이진트리의 일종, 우선순위 큐를 위해 만들어진 자료구조 모든 데이터 정렬이 아닌 최댓값 몇몇개, 최솟값 몇몇개 뽑아낼때 유리하다 자료구조/삭제되는 요소 스택 - 가장 최근에 들어온 데이터 큐 - 가장 먼저 들어온 데이터 우선순위큐 - 가장 우선순위가 높은 데이터 힙은 일종의 반정렬상태를 유지함 - 큰값이 상위레벨, 작은값이 하위레벨에 있는 느슨한 정렬상태 - 부모노드의 키값이 자식노드의 키 값보다 항상 큰 이진트리 중복된 값을 허용한다.(이진탐색트리에서는 중복된 값을 허용하지않음) 표준적 자료구조는 배열 편한 구현을 위해 0은 사용하지않음 새로운 값이 추가되면 아래인덱스부터 비교해 교환해나간다. 부모노드=i 왼쪽 자식노드=2i 오른쪽 자식노드=2i+1 8.. 2024. 4. 12.
이모지 문자 mySql에 저장하기 크롤링 해 온 데이터를 db에 저장하는 과정 중 오류가 발생했다. "Incorrect string value: '\\xF0\\x9F\\x92\\xAC\\xF0\\x9F...' for column 'reviews' at row 1" sql 에러메시지를 살펴보니 다른 리뷰들과 다른 부분이 눈에 띄었다. 바로 😎👽🐸 이런 이모지들...!! 이모지 같은 문자들은 글자당 최대 4바이트의 사이즈가 필요한데 Mysql의 utf8 문자셋의 경우 글자당 최대 3바이트까지만 지원한다. 그래서 이런 문제가 발생하는 것이다. 해결방법 1. 이모지 제거하는 정규식 사용 var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udff.. 2024. 4. 12.
퍼펫티어를 이용한 크롤링(2) 크롤링 한 데이터를 json으로 변환해서 로컬에 저장한 후, 그 데이터를 다시 파싱해서 db에 넣었다. 그렇게 한 이유는 일단 크롤링 한 데이터들이 db에 들어가기전 제대로 정제된 상태인지 눈으로 확인하고싶었고, 만약 db에 저장했을때 잘못된 정보가 있다면 수정하기 위해서 이 방법을 이용했다. 현재는 굳이 데이터를 json파일로 만들고, 그걸 다시 파싱해서 db에 넣고.. 너무 비효율적이라 수정할 계획이다. 일단 여태까지 삽질한 코드들을 블로그에 올리려 한다. fs를 이용해 path에 있는 파일을 읽고 json으로 파싱한다. async readJson(path: string, files: string[]) { const postPromises = files.map(async (file) => { cons.. 2024. 4. 11.