본문 바로가기

전체 글70

[Rust] Rust, Go, Java, C#, Python, Node.js, Elixir 1백만 개의 동시 작업을 실행 테스트 (번역) Rust, Go, Java, C#, Python, Node.js, Elixir 같은 인기 언어를 사용한 비동기 및 멀티 스레드 프로그래밍 간의 메모리 소비를 비교해 보았습니다. 얼마 전, 대량의 네트워크 연결을 처리하도록 설계된 몇 가지 컴퓨터 프로그램의 성능을 비교할 필요가 있었습니다. 이러한 프로그램들의 메모리 소비에 있어서는 20배 이상의 큰 차이를 보았습니다. 일부 프로그램은 100MB 조금 넘게 사용했지만, 다른 프로그램들은 10k 연결에서 거의 3GB에 도달했습니다. 불행히도, 이 프로그램들은 상당히 복잡하고 기능에서도 차이가 있어 직접 비교하고 의미 있는 결론을 도출하기 어려웠습니다. 이는 저에게 대신 합성 벤치마크를 만들어보는 아이디어를 주었습니다. 벤치마크 다양한 프로그래밍 언어로 다음과.. 2024. 3. 28.
[Rust] Ubuntu20.04 Rust 최신 버전(Stable) 설치하기 Rust 설치 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 1번을 눌러 표준 설치를 진행합니다. (기본값 - Enter 키를 누르기만 하면 됩니다.) 필요에 따라서 설치 사용자 정의로 진행하셔도 됩니다. source $HOME/.cargo/env 환경 변수 추가 rustc --version 버전 확인 Rust 컴파일러 설치 sudo apt update sudo apt -y upgrade sudo apt -y install build-essential Rust 컴파일 및 실행 fn main() { println!("Hello, world!"); } "main.rs" 파일을 임시로 만듭니다. rustc ./main.rs 다음 "rustc ... 2024. 3. 28.
[MongoDB] Ubuntu MongoDB(몽고DB) Log(로그) logrotate 설정하기 logrotate 설정 파일 생성 sudo vi /etc/logrotate.d/mongodb 먼저, "/etc/logrotate.d/mongodb" 위치에 "mongodb"라는 파일을 만들어줍니다. /var/log/mongodb/*.log { # 로그 파일을 매일 회전시킵니다. daily # 로그 파일을 7개까지 보관합니다. rotate 7 # 압축을 사용하여 공간을 절약합니다. compress # 첫 번째 회전 후 로그 파일을 압축합니다. delaycompress # 로그 파일이 없어도 오류를 발생시키지 않습니다. missingok # 로그 파일이 비어 있지 않을 경우에만 로그 파일을 회전시킵니다. notifempty # 모든 파일이 처리된 후 단 한 번만 실행하도록 합니다. sharedscripts .. 2024. 2. 17.
[WSL] Ubuntu20.04 WSL 포트포워딩 설정하기 net-tools 설치 sudo apt install -y net-tools 먼저, `net-rools`를 설치해줘야 `ifconfig` 명령어를 사용할 수 있기 때문에 설치해줍니다. ports_wsl.ps1 파일 생성 # WSL 2에서 IP 주소 가져오기 $remote_ip = bash.exe -c "ifconfig eth0 | grep 'inet '" # WSL 2의 IP 주소 가져오기 $found = $remote_ip -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'; # IP 주소 매칭 확인 if ($found) { $remote_ip = $matches[0]; echo "Remote IP is $remote_ip"; # IP 주소 출력 } else { echo "T.. 2023. 12. 15.
[Redis] Ubuntu20.04 Redis 최신 버전(Stable) 설치하기 Redis의 GPG 키 다운로드 curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list Redis 설치 Download Redis You can download the last Redis source files here. For additional options, s.. 2023. 12. 12.
[Nginx] Ubuntu20.04 Nginx mainline or stable 설치하기 관련 패키지 설치 sudo apt install curl gnupg2 ca-certificates lsb-release dirmngr software-properties-common apt-transport-https -y 키 등록 curl -fSsL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg 레포지토리 등록 # Mainline e.. 2023. 12. 11.
[React] useContext 사용하기 React에서 useContext는 React 컴포넌트 트리 전반에 걸쳐 데이터를 공유하는 방법을 제공합니다. 이 훅을 사용하면 함수형 컴포넌트에서 Context의 값을 쉽게 읽을 수 있습니다. 또한, 하위 컴포넌트가 연속적으로 있는 경우에도 드릴링을 방지할 수 있습니다. useContext와 Context API를 활용한 전역 상태 관리 복잡한 컴포넌트 구조에서 props를 여러 계층에 걸쳐 전달하는 것은 비효율적일 수 있습니다. 이를 해결하기 위해 React의 Context API를 사용할 수 있습니다. useContext 훅을 사용하면 컴포넌트 트리 어디에서나 직접적으로 Context의 값을 읽고 업데이트할 수 있습니다. UserContext 생성 및 제공 export const UserContex.. 2023. 12. 10.
[TypeScript] keyof 인터페이스나 타입에서 키의 집합 추출 및 사용 keyof는 TypeScript에서 매우 유용한 연산자로, 주어진 타입의 모든 퍼블릭 키(속성 이름)들의 리터럴 유니온(합집합)을 생성합니다. 이를 통해 객체의 키에 접근하고 사용하는 방법을 타입 안전하게 만들 수 있습니다. keyof 사용하기 간단한 예를 들어보겠습니다. TypeScript에서 interface 또는 type을 정의할 때, 해당 타입의 모든 키를 추출하고 싶을 수 있습니다. 예를 들어, 다음과 같은 인터페이스가 있다고 가정해 봅시다. User Interface 정의 interface UserInterface { id: number; name: string; email: string; } 이 경우, keyof User는 'id' | 'name' | 'email'이 됩니다. 즉, keyof.. 2023. 12. 10.
[NodeJS] ubuntu 20.04 nvm 설치하기 nvm 설치 GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions - GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active nod... github.com curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/in.. 2023. 12. 8.
[Nginx] Ubuntu 20.04 Certbot Let's Encrypt 무료 인증서 발급받기 Certbot 설치하기 sudo apt install certbot python3-certbot-nginx Nginx 설정 변경하기 sudo vi /etc/nginx/sites-available/example.com or sudo vi /etc/nginx/conf.d/default.conf Nginx 버전에 따라서 폴더 및 파일 위치가 조금 다를 수 있습니다. server { listen 80; server_name example.com www.example.com; ... } `server_name`에 도메인 주소를 입력합니다. 앞에 `http`, `https`와 같은 부분은 입력하지 않습니다. 입력 후 `:wq`를 통해 저장하고 나옵니다. sudo service nginx restart `Nginx`.. 2023. 12. 7.
[TypeScript] 타입스크립트에서 Type vs Interface 어떤것을 써야할까? TypeScript에서는 객체 타입을 정의하는 데 두 가지 주요한 도구가 있습니다. 인터페이스와 타입 별칭. 이들의 차이점과 사용 사례에 대해 알아보겠습니다. 객체 상속에는 인터페이스 사용 `TypeScript`에서 인터페이스는 다른 객체에서 확장될 수 있는 객체 타입을 정의하는 데 사용됩니다. `extends` 키워드를 사용하여 상속을 지원합니다. 객체들이 상속 관계에 있는 경우 인터페이스를 사용하는 것이 권장됩니다. 이는 인터페이스를 `extends`를 사용하여 생성하면 `TypeScript`가 해당 인터페이스를 이름별로 캐시하여 유형 검사 성능을 향상시킬 수 있기 때문입니다. interface WithId { id: string; } interface User extends WithId { name.. 2023. 8. 11.
[NestJS] SWC 사용시 "Cannot find module" 오류 해결하기 `NestJS`에서 `SWC` 사용할때 모듈을 찾을 수 없는 문제들이 발생합니다. 따라서 아래와 같이 수정하면 되겠습니다. ES6 모듈 사양 준수 `tsconfig.json` "esModuleInterop": true `esModuleInterop` 옵션 활성화 import * 수정 `SWC` 실행시 `import * as` 형태로 가져오는 `namespace import` 방식의 경우도 오류가 난다면, 일반적인 `import` 방식으로 변경해줘야 합니다. 예로들면 import * as fs from 'fs'; -> import fs from 'fs'; Cannot find module 해결하기 `tsconfig.json` `@` 별칭을 추가해줍니다. "paths": { "@/*": ["src/*"] }.. 2023. 8. 11.
[NestJS] ".env" 대신 ".yaml" 환경변수 구성하기 설정 파일 만들기 저는 `src/utils/config` 위치에 `configuration.yaml.ts` 파일 이름으로 생성했습니다. const YAML_CONFIG_PRODUCTION = 'production.yaml'; const YAML_CONFIG_DEVELOPMENT = 'development.yaml'; export default function ConfigurationYaml(): Record { const config = jsyaml.load( process.env.NODE_ENV === 'production' ? readFileSync(join(__dirname, YAML_CONFIG_PRODUCTION), 'utf8') : readFileSync(join(__dirname, YAML_.. 2023. 8. 11.
[NestJS] 프로젝트 구조 및 Controllers 파악하기 프로젝트 구조 구조 설명 app.controller.ts 단일 라우트를 가진 기본 컨트롤러 app.controller.spec.ts 컨트롤러에 대한 유닛 테스트 app.module.ts 애플리케이션의 루트 모듈 app.service.ts 단일 메서드를 가진 기본 서비스 main.ts NestFactory라는 코어 함수를 사용하여 Nest 애플리케이션 인스턴스를 생성하는 애플리케이션의 진입 파일 컨트롤러 컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환하는 역할을 합니다. 컨트롤러의 목적은 응용 프로그램에 대한 특정 요청을 받는 것입니다. 라우팅 메커니즘은 어떤 컨트롤러가 어떤 요청을 받아야 하는지를 제어합니다. 일반적으로 각 컨트롤러에는 하나 이상의 라우트가 있으며, 각각의 라우트는 다른 동작.. 2023. 6. 9.
[NestJS] 표준모드와 모노레포 및 CLI 속성 살펴보기 프로젝트 구조 Nest에서는 표준 모드와 모노레포 모드 두 가지 구조로 프로젝트를 관리할 수 있습니다. 표준 모드는 "nest new"를 실행하여 생성된 기본 프로젝트 구조로, 컴포넌트를 추가하며 작업할 수 있습니다. 모노레포 모드는 여러 프로젝트와 라이브러리를 관리하기 위한 대체 구조로, 빌드 프로세스를 단순화하는 장점이 있습니다. 나머지 Nest 기능과 문서는 두 모드에 동일하게 적용되며, 필요에 따라 표준 모드에서 모노레포 모드로 전환할 수 있습니다. 기능 표준 모드 모노레포 모드 다중 프로젝트 별도의 파일 시스템 구조 단일 파일 시스템 구조 node_modules 및 package.json 별도의 인스턴스 모노레포 내에서 공유 기본 컴파일러 tsc webpack 컴파일러 설정 개별적으로 지정 모노.. 2023. 6. 7.
[NestJS] NestJS CLI 시작 및 실행 명령어 보기 NestJS CLI 설치하기 npm i -g @nestjs/cli NestJS CLI 전역 설치 NestJS New 명령어 새로운 (표준 모드) Nest 프로젝트를 생성합니다. nest new sample-nestjs Options 옵션 별칭 설명 --dry-run -d 파일 시스템을 변경하지는 않고 변경 사항을 보고합니다. --skip-git -g Git 저장소 초기화를 건너뜁니다. --skip-install -s 패키지 설치를 건너뜁니다. --package-manager -p 패키지 관리자를 지정합니다. npm, yarn, pnpm 중 하나를 사용할 수 있습니다. 패키지 관리자는 전역으로 설치되어 있어야 합니다. --language -l 프로젝트에 사용할 프로그래밍 언어를 지정합니다. TypeScri.. 2023. 6. 4.
[NextJS] Ubuntu Docker(도커) 이미지 빌드·컨테이너 실행 하기 간단 설명 목록 설명 Dockerfile Dockerfile은 도커 이미지를 빌드하기 위한 빌드 지시사항들을 포함한 텍스트 파일입니다. Dockerfile은 컨테이너 이미지를 구성하는 데 필요한 모든 단계와 명령을 정의합니다. .dockerignore 도커 빌드 과정에서 제외할 파일과 디렉토리를 지정하는 파일입니다. Dockerfile을 작성할 때 모든 파일이나 디렉토리를 이미지에 포함시키는 것은 필요하지 않을 수 있습니다. 특정 파일이나 디렉토리를 이미지 빌드 과정에서 제외할 수 있습니다. docker-compose 여러 컨테이너로 구성된 멀티 컨테이너 애플리케이션을 정의하고 구성하기 위해 사용되는 도구입니다. 애플리케이션의 서비스, 네트워크, 볼륨, 환경 변수 등을 정의할 수 있습니다. Docker .. 2023. 6. 1.
[MongoDB] Ubuntu MongoDB(몽고DB) 설치˙설정˙데이터베이스 및 사용자 생성˙완전삭제 하기 MongoDB 설치 sudo apt update sudo apt install -y wget curl gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release 종속성 설치 curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc|sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-7.gpg echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" | sudo tee /etc/ap.. 2023. 5. 27.
[Flutter] 모바일 앱을 보호하기 위한 몇가지 보안 난독화 코드 난독화는 역엔지니어링을 위해 코드를 읽기 어렵게 만드는 것입니다. 난독화 코드에 대한 방법은 넘어가겠습니다. 메모리 캐시 플러시 뱅킹 앱과 같은 안전을 중요시하는 앱의 경우 주기적으로 인메모리 캐시를 플러시해야 합니다. class CacheControl extends WidgetsBindingObserver { CacheControl() { WidgetsBinding.instance.addObserver(this); } void _cleanAllCache() { // Cleans all cache. } @override void didChangeAppLifecycleState(ApplifecycleState state) { // 앱이 일시 중지된 시점 체크 if (state == AppLif.. 2023. 5. 21.
[Flutter] Theme.of(context) 성능 이슈 Flutter에서 테마 오브(context)를 사용할 때 발생할 수 있는 성능 이슈에 대한 문제점을 알아보겠습니다. 중복 빌드 아래의 코드의 경우에는 `builder` 함수가 위젯 트리가 빌드될 때마다 호출되어 여러 번 빌드가 발생됩니다. 위젯 상태의 변경이나 애니메이션, 화면 리사이즈 등 다양한 이벤트가 발생할 때마다 호출됩니다. class Home extends StatefulWidget { @override _HomeState createState() => _HomeState(); } class _HomeState extends State { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: T.. 2023. 5. 10.