[AWS] aws-sdk v3 마이그레이션 (Node.js 18.x 런타임)
serverless로 Labmda를 컴파일하는데 aws-sdk v3를 사용하라는 warning이 계속 나타나서 이참에 업그레이드를 하기로 했다. AWS에서 sdk-v3로 코드를 바꿔주는 커맨드가 있긴한데 난 그걸로는 부족해서 이참에 리팩토링도 진행했다.v3로 버전업 되면서 달라진 점이 몇 가지 있는데 장점이 많아 업그레이드 할 시간이 있다면 바꿔보는 게 좋을 것 같다. modular package이전에는 aws-sdk 라이브러리 전체를 import해서 사용해야 했다. 1import {SNS} from "aws-sdk"; 이제 필요한 모듈만 import해서 사용할 수 있다. 1import { SNSClient } from "@aws-sdk/client-sns"; 이렇게 전체 라이브러리가 아닌 modular package를 사용하면 전체 번들러의 크기가 줄어들기 때문에 성능 향상에 도움이 될 수 있다....
[Error] Typescript process.env undefined 이슈
아무 세팅없이 process.env를 사용하면 그 타입은 string|undefined이다. 타입스크립트가 실제로 그 환경 변수가 있는지 알 수 없기 떄문이다. 그래서 타입에러가 가끔 발생한다. 12345678const dynamoDBClient = new DynamoDBClient({ endpoint: process.env.DYNAMO_ENDPOINT, region: process.env.REGION, credentials: { accessKeyId: process.env.ACCESS_KEY, secretAccessKey: process.env.SECRET_ACCESS_KEY, }, }) 이렇게 작성할 경우 DynmoDBClient 생성자 파라미터 옵션이 모두 string으로 되어있기 때문에 타입에러가 발생한다. TS2322: Type ‘string | undefined’ is not...
[CS] Singleton pattern(JS)
Singleton pattern은 생성자가 여러 차례 호출되더라도 실제 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초 생성자가 생성한 객체를 리턴하는 디자인 유형이다. 주로 공통된 객체를 여러개 생성해 사용하는 Database Connection Pool과 같은 상황에서 많이 사용된다. 몇 가지 단점도 있는 패턴이다. Single responsibility 원칙을 저해한다. 두 가지 문제를 한 번에 해결해버리는 패턴이다. 한 가지는, ‘하나의 클래스는 하나의 인스턴스만 가질 것’ 다른 문제는 ‘단 하나의 클래스 인스턴스로 글로벌 액세스 포인트를 제공할 것’이다. 유닛 테스트를 작성하기 힘들어진다. 글로벌 변수의 현재 상태는 실행 순서에 따라 값이 달라지기 때문이다. 또한 글로벌 인스턴스이기 때문에 테스트 중 다른 컴포넌트가 상태를 변화시킬 수 있어 디버깅이 어려워질 수 있다. 자바스크립트에서 singleton pattern을 구현하는 방법은 여러가지가...
[AWS] serverless AWS Labmda testing - SQS & DynamoDB
AWS Lambda 테스트 코드를 작성한다. 나는 serverless 프레임워크 위에서 작업을 진행하고 있다. SQS 테스트serverless 문서에 따라 ElasticMQ를 사용했다. ElasticMQ는 Amazon SQS와 호환 가능한 메시지 큐 시스템이다. Amazon SQS를 테스트 하고 싶을때도 많이 사용된다고 한다.
[Error] Serverless DynamoDB local 설치 이슈
테스트를 위해 local DynamoDB를 serverless에 설치하려는데 에러가 발생했다. 1sls dynamodb install 설치 명령어를 입력하면 아래 에러가 발생하며 설치가 실행되지 않았다. Error: Error getting DynamoDb local latest tar.gz location undefined: 403 검색해보니 이미 많은 사람들이 겪고있는 문제였다. (Error getting DynamoDb local latest tar.gz location undefined: 403) 공식 해결법은 아직 없는 것 같고 라이브러리 코드를 조금 수정해서 해결할 수 있었다. 해결법node_modules/dynamodb-localhost/dynamodb/config.json 파일을 열어 download_url을 https://s3.us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.tar.gz로...
[React Native] 배포 및 릴리즈 기록
React Native로 개발한 앱을 여러번의 수정을 거쳐 빌드를 마치고 앱 스토어 심사를 기다리고 있다. 순탄하게 흘러갔던 과정이 단 하나도 없었던 것 같아 기록을 남겨놓으려고 한다. 빌드iOSiOS는 XCode 사용법이 익숙치 않아 초반에 어려움을 느꼈으나 한 번만 세팅만 잘 맞춰놓으면 그 뒤로 문제가 발생한 적은 없었던 것 같다. ‘Product > Scheme’ 설정에서 Build Configuration을 Release로 맞추고 ‘Product > Archive’를 눌러 실행하면 production 버전의 빌드가 시작된다. 정상적으로 빌드가 완료되면 Archive 히스토리와 함께 새로운 창이 뜬다. 배포할 버전을 선택하고 Distribute App 버튼을 누르면 배포가 진행된다. 앱 배포 및 TestFlight 기능을 사용하기 위해 App Store Connect를 선택했다. 다음 옵션도 대부분 App Store Connect에 관리를 위임하도록...
[React] ref 전달하기
React에서 자식 컴포넌트에 ref를 전달하려고 하면 오류가 발생한다. 123456789101112import { useRef, useEffect } from 'react'export function Parent() { const elementRef = useRef() useEffect(() => { // Does not work! console.log(elementRef.current) // logs undefined }, []) return <Child ref={elementRef} /> // assign the ref}function Child({ ref }) { // a new component return <div ref={ref}>Hello,...
[Javascript] Closure란
클로저란 함수의 레퍼런스와 함수를 둘러싼 state, 즉 lexical 환경을 합쳐서 부르는 말이다. 클로저는 내부 함수에서 외부 함수 scope에 접근할 수 있도록 해준다. JavaScript에서 클로저는 함수가 생성될 때마다 함수 생성 시점에 클로저가 생성된다. Lexical scoping아래 코드를 살펴보자. 123456789function init() { var name = "Mozilla"; // name 은 init에서 만들어진 local variable이다 function displayName() { // displayName() 은 내부 함수이다. 클로저를 형성한다. console.log(name); // 외부 부모 함수에서 만든 variable을 사용하고있다. } displayName();}init(); init()은 name이라는 local variable과...
React Native Xcode archive 실패 - Operation not permitted
Archieve를 진행하려고 하는데 계속해서 에러가 발생했다. 1jest-haste-map: Watchman crawl failed. Retrying once with node crawler. Usually this happens when watchman isn't running. Create an empty .watchmanconfig file in your project's root folder or initialize a git or hg repository in your project. Error: Watchman error: std::__1::system_error: open: /Users/sychoi/Desktop/Project/MyProject: Operation not permitted. Make sure watchman is running for this project. See...