분류 전체보기(102)
-
[Javascript] 배열을 비동기 처리하기 위한 Promise.all()의 사용법
개요순회작업에서 비동기 작업을 처리하는 과정에서 더 깊게 이해하게 된 Promise.all의 동작과 Javascript의 병렬처리 여부에 관해 정리해보고자 한다. 상황여러 요소가 있고 각 요소들에 대해 비동기 처리를 하려면 어떻게 해야할까?MDN을 참고해보면 forEach는 기본적으로 콜백함수를 기다리지 않는다고 명세돼있듯이 forEach내부에서 await를 걸어도 forEach문은 끝나게 된다. 콜백함수로 전달받은 인수인 함수를 실행만 하는 것이다. 다음의 간단한 예제를 살펴보자 예제1. forEach의 콜백함수를 비동기(async)로 선언한 경우async function promise1() { return new Promise(resolve => { setTimeout(() => { ..
2025.01.23 -
[Android] SharedPreference commit(), apply()
개요앱에서 중요한 요청을 실패할 경우 EncryptedSharedPreference를 사용해 정보를 저장하고 있다가 재요청을 날려야 하는 부분이 있었다.내가 원하는 부분인 onResumse 단계에서는 asynchronously한 동작과 함께 매핑된 데이터와 관련된 요청을 잘 수행하였다.그러나 문제는 sharedPreference객체의 edit 메서드 직후에 앱 자체를 crash를 발생시킬 경우였다.분명 Editor 클래스의 .edit()은 수행됐으나 SharedPreference에 저장되지 않는 것에 의문이 들어 찾아보니 commit과 apply의 차이에서 발생하는 문제였다. 해결요약하자면 commit은 디스크에 동기적으로 File write를 수행하나 main thread에서 사용할 경우 UI 렌더링..
2025.01.22 -
[MySQL] AUTO_INCREMENT 값 순차적 일관성 검증
개요비즈니스 로직 작성 중 bulk insert 이후 모든 레코드에 대해 update를 수행해야 할 필요가 생겼다.개별 데이터에 대해 단일 쿼리문을 실행하면 로직 작성은 편하겠으나 성능이 떨어질 거 같았다. 따라서 Bulk Insert 이후에 id값을 활용하여 update를 해야하는데 여기서 삽입된 레코드들에 대한 Auto increment의 값이 과연 순차적임을 보장하는지에 대한 궁금증에서 비롯된 실험을 공유하고자 한다. 우선 필자의 MySQL은 별도의 튜닝없이 default setting만 가지며 엔진은 InnoDB 를 사용했음을 고려하고 봐줬으면 한다. MySQL의 Auto increment를 핸들링하는 세가지 방법https://dev.mysql.com/doc/refman/8.4/en/innodb..
2024.12.31 -
[VSCode] Typescript 단일 파일 디버깅 하는 법
개요npm 명령어가 아닌 간단하게 단일 파일에 대해서만 디버깅하고 싶은 상황이 생겨 타입스크립트 단일 파일에 대해 디버깅하는 법을 알아본다. 1. VSCode 파일 생성launch.json 파일을 루트 경로의 .vscode 하위에 생성하고 아래와 같이 추가한다.{ "name": "Launch Some TS File", "type": "node", "request": "launch", "runtimeArgs": [ "-r", "ts-node/register" ], "program": "${your_file_path}" }program에 추가하는 경로는 루트 경로부터 명시한다.ex) src/user/user.service.ts 추가 후 name에 해당하는 디버깅을 실행하면 ..
2024.12.27 -
[MySQL] 대화형 연결과 비대화형 연결(interactive connection, noninteractive connection), Packet out of order 에러 해결
개요 Node환경에서 mysql 라이브러리를 사용하여 트랜잭션을 수행할 때 발생한 에러에 대해 알아보고 해결방법에 대해 알아본다. 문제 상황Mysql 라이브러리를 사용하는데 디버깅을 할때마다 Packet out of order 에러가 발생했다.뿐만 아니라 로직이 조금 오래 걸리는 비즈니스 로직을 작성했는데 디버깅 과정에 있지 않더라도 에러가 발생하였다.라이브러리에서 throw하는 에러의 message 내용은 다음과 같았다.Cannot enqueue Query after fatal error. 사용중인 라이브러리의 커넥션이 실행되는 부분에는 다음과 같이 설정돼있었다.connection.on('connection', function (connection) { connection.query('SET SES..
2024.12.04 -
[Typescript] CryptoJS 사용기
개요API 사용을 위해 요청 헤더 조건으로 crypto js를 통한 암호화가 필요했다.기존의 javascript 코드로 작성된 레퍼런스는 많았으나 '@types/crypto-js'를 사용하게 되면 CommonJS 모듈 방식을 사용하지 않기 때문에 라이브러리 분석을 통해 기존 코드를 타입스크립트에 호환되게끔 치환한다.(GPT를 사용하면 편하게 변환해줄 수 있긴 하겠다만 사용을 지양하는 편이라..크흠) 과정기본적으로 알아야 할 지식은 Crypto JS가 어떤 과정을 통해 암호화 하는가이다.1. SHA256, 512, HMAC 등 여러가지 암호화 알고리즘을 통해 해쉬값을 생성함2. 생성해낸 해쉬값을 32비트의 고정 길이 단어 배열을 생성해낸다.3. 생성된 단어배열을 인코딩(UTF-8, UTF-16, HEX)을..
2024.12.01