본문 바로가기
동기와 비동기 / 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.
퍼펫티어를 이용한 크롤링(1) 퍼펫티어 npm 설치 npm i puppeteer 페이지 띄우는 코드 const url = ridibooks.ridiPage; const browser = await puppeteer.launch({ headless: true, }); const page = await browser.newPage(); 로그인, 진짜 별거 없다.. 실제로 로그인 페이지를 띄워서 로그인 정보를 입력 후 클릭한다. async login(page: any, url: string) { const { pageBtn, submitBtn, textCursor1, textCursor2 } = ridibooks.login; await page.goto(url); await page.waitForSelector(pageBtn); await.. 2024. 4. 11.
최종프로젝트 https://www.notion.so/teamsparta/1-dbe5da002a084e20bc120b8260836a03 회빙환(절대 풀네임을 물어봐선 안돼..) | Notion API 명세 - 큰 기능으로 토글화 해서 관리해보세요! teamsparta.notion.site 팀노션 https://www.notion.so/teamsparta/Daily-Scrum-780342274e014429b9cf9dc78f31e9aa Daily Scrum | Notion Built with Notion, the all-in-one connected workspace with publishing capabilities. teamsparta.notion.site 데일리 스크럼 프로젝트 소개: 웹소설 & 웹툰 종합정보 플랫폼.. 2024. 4. 9.
[JS] 선택정렬 / 버블정렬 선택정렬 배열에서 최솟값을 찾은 후, 최솟값과 맨앞에 위치한 값과 교체한다. 두번째 회전에서는 맨앞에 위치한 값을 제외한 최솟값을 찾아서 계속 바꿔주는 방법이다. 하나의 원소만 남을때까지 위의 과정을 반복한다. //마지막 숫자는 자동으로 정렬되기때문에 숫자 -1만큼 반복 function selectionSort(arr) { for (let i = 0; i < arr.length - 1; i++) { min = i; for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { min = j; } } if (i !== min) { let swap = arr[min]; arr[min] = arr[i]; arr[i] = swap; } console.l.. 2024. 4. 9.
객체지향 프로그래밍 / 클래스형, 함수형의 차이 객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요? 객체 지향 프로그래밍: 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 객체 지향 프로그래밍의 장, 단점은? 장점 코드 재사용이 용이 남이 만든 클래스를 가져와 이용 가능, 상속을 통해 확장할 수 있다. 유지보수가 쉬움 절차 지향 프로그래밍에서는 코드를 수정할때 일일이 찾아 수정해야 하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다. 대형 프로젝트에 적합 클래스 단위로 모듈화 시켜서 개발할 수 있으므로 대형 프로젝.. 2024. 4. 5.
http, https / OSI 7계층 http, https 의 차이점 HTTP(hyperText Transfer Protocol)의 약자로 웹 상에서 웹 서버 및 웹브라우저 상호간의 데이터 전송을 위한 응용계층 프로토콜을 의미한다. 과거에는 www상의 하이퍼텍스트 형태의 문서를 전달하는데 주로 이용되었다. 현재에는 이미지, 비디오, 음성 등 거의 모든 형식의 데이터를 전송할 수 있다. http는 기본적으로 통신규약임. 사용자가 클라이언트, 즉 브라우저 등으로 서버에 요청을 보내면 클라이언트의 요청을 받은 서버는 특정 자원에 대한 정보를 제공하거나 작업을 처리하게 된다. http 요청 메시지와 응답 메시지는 일정한 형식을 갖추어 데이터를 통신하게 된다. 컴퓨터간 상호 이해할수있는 형식인 셈이다. http는 1. 무상태성 2. 비연결성이라는 대.. 2024. 4. 4.
JWT, 토큰인증, OAuth JWT, Refresh, Access Token에 대해서 설명해주세요. 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. 토큰 기반 인증 시스템은 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 토큰을 부여한다. 기존의 세션기반 인증은 서버가 파일이나 데이터베이스에 세션정보를 가지고 있어야하고 이를 조회하는 과정이 필요하기 때문에 많은 오버헤드가 발생한다. 하지만 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기때문에 메모리나 스토리지 등 을 통해 세션을 관리했던 서버의 부담을 줄여준다. JWT(JSON Web Token) 인증에 필요한 정보들을 암호화시킨 JSON 토큰 JWT 기반 인증은 JWT토큰을 HTTP 헤더에 .. 2024. 4. 2.