SQL COALESCE()
·
SQL
COALESCE()COALESCE(expr1, expr2, expr3, …)왼쪽부터 차례대로 평가하면서 최초 NULL이 아닌 값을 반환한다. 모든 값이 NULL인 경우 NULL을 반환하다 예시1. 기본SELECT COALESCE(NULL, NULL, 'Hello', 'World');결과는 NULL 2개 건너뛰고, 처음 나온 Hello를 반환한다. 2. NULL 값 대체SELECT name, COALESCE(phone, '전화번호 없음') AS phone_displayFROM customers;NULL값이 포함된 경우 특정 값으로 대체할 수 있다. 3. 숫자 컬럼SELECT id, COALESCE(discount, 0) AS discountFROM orders; 숫자 컬럼의 값이 NULL인 경우 0으로 대..
SSH Config 설정
·
Server
개요개발할 때 여러 서버에 SSH로 접속할 때 매번 입력하는 것은 번거롭고 비효율적이며 오타의 가능성도 높다.이때 ~/.ssh/config 파일에 접속 정보를 미리 등록하면 간단한 명령어로 접속할 수 있다. SSH Conig 설정~/.ssh/config 파일에 설정# 개발 서버Host dev HostName dev.example.com User devuser Port 2222 IdentityFile ~/.ssh/dev_id_rsa # 운영 서버Host prod HostName prod.example.com User root Port 22 IdentityFile ~/.ssh/prod_id_rsaHost: 접속 시 사용할 별칭HostName: 실제 서버 주소 (IP 또는 도메인)User: 접속 계정명P..
socat 소켓 프록시
·
Server
socat소켓을 연결해주는 파이프 드라이버로 TCP↔UNIX 형태로 프록싱해준다. 설치Ubuntu/Debiansudo apt update sudo apt install socat CentOS/RHELsudo yum install socat macOS (Homebrew)brew install socat 사용원격 서버에서 실행 (UNIX → TCP)socat TCP-LISTEN:12345,fork UNIX-CONNECT:/var/run/app.sock 원격 서버의 12345 포트에 들어오는 요청을 /var/run/app.sock에 연결. 로컬 서버에서 실행 (TCP → UNIX)socat UNIX-LISTEN:/tmp/app.sock,fork TCP:remote-server-ip:12345로컬 /tmp/a..
Git Tracking 파일명 대소문자 변경하기
·
Git
Git은 기본적으로 대소문자를 구분한다. Readme.md와 README.md는 서로 다른 파일이지만 일부 FAT와 같은 파일시스템은 대소문자를 구분하지 않는 경우있다. 이를 위해 Git은 core.ignoreCase 설정을 제공한다. Git config: core.ignoreCasecore.ignoreCase는 Git이 대소문자를 구분하지 않는 파일시스템에서 잘 동작하도록 도와주는 설정이다. # 대소문자 구분 무시git config core.ignoreCase true기본값인 false의 경우 대소문자를 구분하여 처리한다. # 대소문자 구분git config core.ignoreCase false하지만, true의 경우 파일명을 비교할 때 내부적으로 대소문자를 무시하여 수행한다.예를 들어, Makefi..
DBLock, 블로킹, DeadLock
·
SQL/MySQL
DBLockDB에 여러 트랜잭션이 동시에 동일한 데이터에 접근했을 때 정합성을 유지하고 충돌을 방지하여 순차적으로 처리될 수 있도록 지원하는 기능이다. 종류범위(Scope) 기준 (동시성 높은 순)Row-Level Lock (행 락)레코드(row)에 락을 설정작은 범위의 락으로 동시성을 높일 수 있지만 오버헤드가 발생할 수 있다Page-Level Lock (페이지 락)페이지(데이터 블록 단위)에 락을 설정페이지는 테이블을 구성하는 요소로 용량이 8kb로 제한되어 있다.Table-Level Lock (테이블 락)테이블 전체에 락을 설정동시성은 낮지만 간단하고 빠르게 구현할 수 있다Database-Level Lock (데이터베이스 락)데이터베이스 전체에 락을 설정주로 백업이나 복구 작업 등에서 사용된다.공유..
PHP-FPM vs RoadRunner (with Laravel)
·
Web/PHP
개요php 프로젝트를 개발하며 Nginx 웹 서버와 CGI(주로 FastCGI)를 사용하여 개발 및 운영했었다. Laravel 패키지들을 둘러보던 중 Octane을 읽어보며 php도 고성능 애플리케이션 서버가 있다는 것을 알게되었다. 그래서 Nginx/php-fpm 환경과 애플리케이션 서버(RoadRunner) 환경을 비교해보고자 간단한 테스트를 해봤다. php-fpm (FastCGI Process Manager)php의 기존 CGI보다 빠르고 효율적인 FastCGI 구현체로 웹 서버로부터 요청을 받아 php 프로세스를 관리한다. Master 프로세스가 초기에 Worker 프로세스들을 생성하여 웹 서버로부터 요청이 들어오면 적절히 분배해준다. Worker 프로세스는 요청 처리 후 idel 상태로 재활용되..
실시간 통신 Polling, Long Polling, SSE, WebSocket
·
Server
Polling ?클라이언트가 서버에 일정 간격을 두고 주기적으로 HTTP 요청을 보내 응답받는 형태의 단방향 실시간 통신이다. 쉽고 간단하게 구현할 수 있지만, 반복적인 요청이 발생하여 불필요한 트래픽이 발생한다. Long Polling ?Polling과 동일하게 동작하지만, 클라이언트가 주기적으로 요청하는 것이 아니라 요청 후 응답을 받을 때 까지 기다린다. 마찬가지로 구현은 쉽지만 연결이 많아질 경우 Polling 보다 서버 리소스(메모리) 사용량이 많아질 수 있다. WebSocket ?초기 HTTP로 핸드셰이크를 통해 연결 후 WebSocket 프로토콜로 업그레이드하여 연결되는 TCP 기반 양방향 통신이다. 클라이언트와 서버는 지속적인 양방향 통신이 가능하여 Polling(+Long Polling)..
badssl.com SSL/TLS 인증서 테스트
·
Tool
SSL/TLS 관련된 인증서 문제를 테스트하기 위한 웹사이트이다.HTTP 요청 시 SSL 설정마다 어떻게 응답되는지 확인할 수 있도록 다양한 서브도메인을 제공한다. 사설 CA가 적용된 환경에서 사용하는 것으로 추측되는 해외 유저로 부터 티켓을 받아 확인이 필요했는데, badssl.com에서 제공하는 서브 도메인 중 https://untrusted-root.badssl.com로 HTTP 요청을 보내 응답된 Error 객체를 확인할 수 있었다. https://badssl.com badssl.comYour Browser: 📋 Click to copybadssl.com https://github.com/chromium/badssl.com/tree/master GitHub - chromium/badssl.c..
Docker Compose로 PHP, Nginx, MySQL 개발환경 구성하기
·
Docker
목표Docker compose를 사용하여 각각의 Nginx, PHP, MySQL 컨테이너를 실행하고, php 개발환경을 구성한다. 파일구성docker-compose.ymlservices: php: build: ./docker/php container_name: php ports: - "9000:9000" expose: - "9000" volumes: - {앱 경로}:/home/app mysql: image: mysql:8.0 container_name: db restart: always environment: MYSQL_DATABASE: {DB} MYSQL_USER: {DB 유저} MYSQL_PASS..
비동기 프로그래밍 - Callback, Promise, async/await
·
Web/Javascript
비동기 프로그래밍?Javascript는 싱글 스레드로 동작하기 때문에 한 번에 하나의 작업만 실행할 수 있다. 하지만, Call Stack, Web API, Event Loop, Callback Queue와 함께 동작하여 비동기 프로그래밍이 가능하다.  Call Stack자바스크립트 엔진이 코드 실행을 위해 사용하는 메모리 구조로 실행 중인 함수들이 쌓인다. Web API브라우저에서 제공하는 API로 Call Stack에 있는 비동기 작업들을 위임받아 멀티 스레드로 처리한다. Callback QueueWeb API의 비동기 작업이 완료되고 실행을 대기하는 함수가 쌓인다.  Event Loop Call Stack이 비어있는 경우 Callback Queue에서 대기중인 함수를 Call Stack으로 옮겨 실..