서비스에 카카오톡 공유하기를 구현하기가 목표였다. kakao developers API 사이트에서 '메시지 - 카카오톡 공유' 문서를 읽고 구현하는 데까지는 어렵지 않았다. 다만, 환경이 typescript 환경이다 보니까 Kakao.Share 선언부에 타입 에러가 나고 있었다. 타입 처리를 해주기 위해 공식 문서를 뒤졌지만 공식 @type 모듈을 찾지 못했다. 공식 타입스크립트 사이트에서 찾아보았다. 가장 스타가 높은건 react-native 용이었고, kakao-sdk가 그다음에 쓰기 적절해 보였지만 cordova 용이었다. 환경에 맞게 보자면 vue-kakao-sdk 가 맞겠다 싶어 들여다보았고 찾은게 @types/kakao-js-sdk 였다. 허나, 이것도 Kakao.Link 구버전에만 대응이 되..
고민의 시작 사이드 프로젝트의 프론트 프레임워크를 'Vue'로 정하고 열심히 개발 중에 있다. 그러던 중 고민이 생겼다. 'components가 비대해지는데 어떻게 폴더링 해야 하는가?' '컴포넌트별로 스켈레톤 로딩 화면을 만들려고 하는데 항상 1쌍씩 생기는데 어떻게 폴더링 해야 하는가?' 사이드 프로젝트의 기능 구현이 끝나면 위 부분을 꼭 정리하고 리팩터링 후 오픈해야겠다는 생각 했고 미리 정리를 좀 해두려고 한다. 현재 환경 vue3 - 기존의 vue2와 vue3는 굉장히 다르다. - vue3 내에서도 초창기에서 조금 더 발전해 script setup 방식을 권장한다. - 나 같은 경우에는 vue2 => vue3 => vue3 script setup 중에서 가장 마지막 방식으로 구현했다. vite -..
2022년의 상반기가 지났다. 항상 그래 왔듯이 회고해보자. 목차 좋은 팀장 되기 ⭐ 팀 공간 만들기 R & R (Role and Responsibility) 리소스 관리 좋은 시니어로 나아가기 💻 서비스가 잘 되길 고민하는 개발자 공유 문화를 만드는 개발자 코드 품질을 고민하는 개발자 크리티컬 이슈 해결 🔥 배치 이슈 월요 장애 이슈 기술 블로그 공부하기 성장 욕구 ✍ 매일매일 조금씩 하자 아직은 혼자가 편해 사이드는 미완성 마무리 ❤ 1. 좋은 팀장 되기 ⭐ 재직한 3년 동안 10명에서 80여명으로 인원이 늘었다. 그에 따라 자연스럽게 나는 ‘셀 리더’, ‘파트장’을 지나 현재 ‘팀장’이라는 직책을 얻게 되었다. 엄청난 실력 때문이라기보단 보다 더 열심히 하라는 의미로 받아들였다. 이왕이면 팀장이 되..
1. MVCC => DEAD_TUPLE => BLOAT postgreSQL은 MVCC(다중버전 동시성 제어)의 이점을 위해 'UPDATE'와 'DELETE' 수행 후 이전 데이터를 즉시 제거하지 않는다. 즉시 제거하지 않은 이전 데이터를 'Dead Tuple'이라고 말한다. 그로 인해, Table Bloat(테이블 팽창), Btree Index Bloat(인덱스 팽창)가 발생할 수 있다. 이는 불필요한 I/O의 증가와 부적절한 인덱싱을 초래한다. 1-1. 어떻게 확인하는가? 🔎 팽창(BLOAT) 확인 : Githup 오픈소스[⭐1.1k] (https://github.com/pgexperts/pgx_scripts/tree/master/bloat) 튜플 확인 SELECT relname, n_dead_tup,..
목적 DISK IO 를 최소화함으로써 IO 성능을 향상시킵니다. 1) 매우 큰 (수십, 수백 GB) 버퍼를 빠르게 액세스해야 합니다. 2) 많은 사용자가 동시에 접근할 때 경합을 최소화해야 합니다. 3) 자주 사용되는 블록은 최대한 오랫동안 버퍼 내에 있어야 합니다. 권장하는 값 공식문서의 내용을 의역해보았습니다. PostgreSQL 서버의 권장 shared_buffers 값은 시스템 메모리의 25%입니다. PostgreSQL 서버는 운영 체제 캐시에 의존합니다. 그래서 RAM의 40% 이상 할당하지 않는 것이 좋습니다. 토픽1. shared_buffers DB 파라미터 기본값이 Aurora PostgreSQL > RDS PostgreSQL인 이유는 무엇입니까? 위 [권장하는 값] 내용을 바탕으로 RDS..
1. 풀어쓰기 약어를 풀면, 다중버전 병행수행제어 (MultiVersion Concurrency Control)가 된다. 쓰기트랜잭션이 읽기트랜잭션을 블로킹하지 않고, 읽기트랜잭션이 쓰기트랜잭션을 블로킹하지 않고, 각 트랜잭션마다 스냅샷 이미지를 보장해 주는 메커니즘을 말한다. 2. 왜 나왔을까? 데이터베이스에서 일관된 데이터를 얻는 것이 굉장히 중요하다. 만약 만원권 1,000장을 가진 사람이 있다고 가정해보자. (부럽다..) 만원권이 1,000장이 맞는지 세고 있을때, 다른 사람들이 몇 개의 만원권을 넣거나 빼거나 한다면 세고 있는 사람은 당연히 제대로 셀 수 없다. 가장 쉽게는 셀 동안은 다른 사람들이 넣거나 빼지 않게 보장하는 것이 일관된 데이터를 얻는 방법이다. 그래서 무조건 1,000장을 셀때..
1. 풀어쓰기 Read Uncommitted 한 읽기 트랜잭션이 시작했을때 다른 트랜잭션은 자유롭게 UPDATE 가능하다. 한 읽기 트랜잭션은 다른 트랜잭션에서 Update 중(un-commit)인 데이터를 조회할 수 있다. => 다른 트랜잭션이 중간에 롤백을 해도 읽기 트랜잭션은 롤백 전 데이터를 조회할 수 있는다. => 다른 트랜잭션의 Update(커밋)과 무관하게 일관된 데이터를 얻을 수 없는 확률이 높다. => Dirty Read Read Committed 한 읽기 트랜잭션이 시작했을때 다른 트랜잭션은 자유롭게 UPDATE 가능하다. 한 읽기 트랜잭션은 다른 트랜잭션에서 Update 완료(commit)된 데이터만 조회할 수 있다. => Dirty Read는 발생할 수 없다. 위 고립수준보다는 일관..
프로그래밍에 가장 기본이 되는 동기(synchronous)와 비동기(Asynchronous)를 쉽게 설명해보려고 한다. 왜 동기라는 용어는 혼란스러운가? 'synchronous' is existing or occurring at the same time. - Google Dictionary 동기(synchronous)는 영단어 직역을 하면 '동시에 발생하는 방식'이라고 한다. 이게 혹시 함수가 동시에 실행된다는 건가? 그럼 비동기 개념 아닌가? 하며 혼란에 빠질 수 있다. 하지만 조금씩 비슷한 의미를 따라가다 보면 충분히 이해할 수도 있어 보인다. 여기서 '동시에 발생하는 방식'으로 딱 한번 실행하는 상황을 가정하는 것보단, '동시에 발생하는 방식'이 연속적으로 실행하는 상황을 가정하면 전개가 좀 용이하..