전체 글

이왕 하는거 우왕 나오게
Googling/cs

[DB] 트랜잭션 격리수준과 부정합 이슈 (feat. Dirty Read ~ Phantom Read)

1. 풀어쓰기 Read Uncommitted 한 읽기 트랜잭션이 시작했을때 다른 트랜잭션은 자유롭게 UPDATE 가능하다. 한 읽기 트랜잭션은 다른 트랜잭션에서 Update 중(un-commit)인 데이터를 조회할 수 있다. => 다른 트랜잭션이 중간에 롤백을 해도 읽기 트랜잭션은 롤백 전 데이터를 조회할 수 있는다. => 다른 트랜잭션의 Update(커밋)과 무관하게 일관된 데이터를 얻을 수 없는 확률이 높다. => Dirty Read Read Committed 한 읽기 트랜잭션이 시작했을때 다른 트랜잭션은 자유롭게 UPDATE 가능하다. 한 읽기 트랜잭션은 다른 트랜잭션에서 Update 완료(commit)된 데이터만 조회할 수 있다. => Dirty Read는 발생할 수 없다. 위 고립수준보다는 일관..

Googling/cs

[CS] 동기(synchronous)와 비동기(Asynchronous)를 쉽게 이해해보기 (feat. 싱크로나이즈드 수영과 핫도그)

프로그래밍에 가장 기본이 되는 동기(synchronous)와 비동기(Asynchronous)를 쉽게 설명해보려고 한다. 왜 동기라는 용어는 혼란스러운가? 'synchronous' is existing or occurring at the same time. - Google Dictionary 동기(synchronous)는 영단어 직역을 하면 '동시에 발생하는 방식'이라고 한다. 이게 혹시 함수가 동시에 실행된다는 건가? 그럼 비동기 개념 아닌가? 하며 혼란에 빠질 수 있다. 하지만 조금씩 비슷한 의미를 따라가다 보면 충분히 이해할 수도 있어 보인다. 여기서 '동시에 발생하는 방식'으로 딱 한번 실행하는 상황을 가정하는 것보단, '동시에 발생하는 방식'이 연속적으로 실행하는 상황을 가정하면 전개가 좀 용이하..

Review

[넷플릭스] 타다 : 대한민국 스타트업의 초상 (feat. 신박하다)

이 다큐영화가 나온다는 소식을 접하고 꼭 봐야겠다 생각했다. 개봉(2021-10-14)하였다는 소식에 상영관을 찾았지만 시간과 장소의 제약이 컸다. 시간이 많이 지나서 우연히 넷플릭스 추천영화를 검색하던 도중 '타다 : 대한민국 스타트업의 초상'이 넷플릭스에 있다는 것을 확인하고 1초의 망설임도 없이 영화를 시청했다. 법인카드를 활용하여 타다를 탈 기회에 몇 번 있었다. 프리미엄 택시인가보다 하고 탔는데 넓고 쾌적해 사용감은 좋았다. 왜 타다는 모두 카니발인가? 그리고 왜 어느 순간 타다는 사라졌는가? 에 대한 물음도 없이 그냥 그렇게 나의 경험 속에서 사라졌었다. 시간이 지나고 문득 기사 속에서 '타다금지법'이라는 키워드를 만나긴 했지만 많은 모빌리티 스타트업들과 택시 간의 다툼이 잦았기때문에 그런 것..

Googling/postgresql

[postgreSQL] 써보니 유용한 쿼리 (feat. 메타 정보 쿼리)

내가 직접 만든 테이블은 아니지만 postgreSQL에 내장되어있는 테이블이 존재한다. 실제로 잘 활용하는 쿼리를 사례와 함께 적어보려고 한다. 테이블 인덱스 확인 실행계획을 볼 때 인덱스를 아예 타고 있지 않거나 잘못된 인덱스를 타고 있음을 확인할 수 있다. 이 떄 보통 테이블에 어떤 인덱스가 있는지를 보고 의도하는 인덱스를 탈 수 있게 쿼리를 튜닝해준다. SELECT * FROM pg_indexes WHERE tablename = '소문자 테이블 명'; 현재 테이블별 전체 카운트 확인 테이블 별로 전체 카운트를 수시로 확인하면 얼마나 데이터 성장세가 가파른지, 어떻게 인프라를 대비해야하는지, 어떻게 데이터를 관리하는게 더 효율적인지 고민해볼 수 있다. 테이블별로 count 쿼리를 직접 때려도 되지만 ..

Deep Dive Series/Good Condition

[좋은 조건문 작성하기 4] JSON 객체를 활용한 조건문 형태

※ 대부분에 언어에 해당될 수 있는 내용이지만, javascipt 언어에 가장 적합한 글입니다. 꼭 , 을 써야만 조건문인 것은 아니다. JSON 객체를 활용해서도 조건문을 만들 수 있다. function getFruitByName(name) { if (name === 'apple') { return '🍎' } else if (name === 'banana') { return '🍌'; } else if (name === 'kiwi') { return '🥝'; } else if (name === 'lemon') { return '🍋'; } else { return ''; } } 위의 조건문을 으로 바꿔보자. function getFruitByName(name) { switch (name) { case 'a..

Googling/Node.js

[Node.js] ES모듈(ESM) 사용하는 방법

Javascript는 ES 모듈 시스템을 공식 모듈 시스템으로 사용하고 있고, Node.js는 CommonJs 모듈 시스템을 표준 시스템으로 사용하고 있다. //CommonJs const gulp = require('gulp'); const babel = require('gulp-babel'); //ESModule import gulp from 'gulp'; import babel from 'gulp-babel'; Node.js 에서 ES모듈 시스템을 활용하려면 Babel이라는 별도의 도구가 필요했는데, Node.js 13.2 버전(2019-11-21) 부터 손쉽게 ES모듈을 활용할 수 있게 되었다. package.json 파일에 type 항목을 module로 설정하면 바로 활용 가능하다. { //.....

Deep Dive Series/Algorithm

[Javascript] Combination(조합), 이항계수 가져오기

/** * Q. 자연수 n을 이진법으로 변환했을 때 나오는 1의 개수를 k라고 했을 때, * n보다 작은 자연수 중에서 이진법으로 변환하여 * 1의 개수가 k인 수가 몇 개 있는지를 return 하도록 solution 함수를 완성해 주세요. */ 이 코딩 문제를 효율적으로 풀기 위해 직감적으로 Combination(조합)이 필요하다고 느꼈다. (확률과 통계에서 배운 개념들이 스르륵 스쳐갔다.) 정확히는 이항계수를 구해야하는데 이항계수란 다음과 같다. 위의 이항계수를 코드로 구현해보자. 크게 어려울 것은 없다. //10 C 2 => getCombinationsCount(10, 2) function getCombinationsCount(총원소수, 선택원소수) { const 곱셈 = (a, b) => a * ..

Deep Dive Series/Good Condition

[좋은 조건문 작성하기 3] 애매한 조건문은 팀원들과 생각 나누기

※ 대부분에 언어에 해당될 수 있는 내용이지만, javascipt 언어에 가장 적합한 글입니다. 복잡한 조건문을 작성하다보면, 무언가 잘못 분기하고 있다고 느낄 때가 있다. 이 부분은 애매하지만 매우 중요한 부분이라 생각되어 어떻게든 글로 풀어써보려고 한다. 정답이 있는 문제라기보단 앞서, 왜 좋은 조건문(IF) 을 작성해야할까? 라는 질문에 나는 '서로의 조건 로직을 잘 이해해 서비스를 잘 디벨롭하기 위해서'라고 답하고 싶다. 라고 포스팅했기에, 아래의 시나리오를 팀원들과 같이 읽어보며 좋은 조건문에 대해서 고민해보면 좋을 것 같다. 상황1 . 과일의 이름에 따라 적용가능한 색깔들(배열)을 가져오는 함수를 만드려는데 조건문을 어떻게 만들지 고민이다. function availableColorsByFru..

날개단
날개단 기술 블로그