본문 바로가기

소프트웨어-이야기

(PostgreSQL) Truncate TABLE VS delete TRUNCATE란? TRUNCATE는 대용량 테이블을 빠르게 지울 수 있는 명령문이다. Truncate VS Delete DELETE 쿼리는 테이블의 데이터를 제거할 때 사용하는 쿼리이다. 그런데 전체 데이터를 삭제할 때에는 DELETE 쿼리는 효율적이지 않다. 이때에는 TRUNCATE TABLE을 사용하는 것이 좋다. TRUNCATE TABLE는 테이블 스캐닝 없이 전체 데이터를 지우기 때문에 DELETE 쿼리보다 빠르다. 그리고 스토리지를 바로 회수하기 때문에 VACUMM 작업을 수행할 필요가 없어서, 대용량 데이터를 제거할 때 유용하다. 사용법 TRUNCATE TABLE public.recommend_products; 테이블 식별 값(Primary Key)을 리셋시키고 싶은 경우에는 아래와 같이 질..
[쿠버네티스] uWsgi Graceful Shutdown 발단 회사 시스템에서 API 요청이 비정상적으로 종료되는 오류가 있어서 원인을 분석하게 되었다. 그러다 이 오류는 배포 타이밍과 비슷한 패턴으로 발생한다는 것을 발견하게 되었다. 즉, 이 문제는 Pod이 죽을 때, uWsgi 컨테이너가 Graceful Shutdown을 하고있지 않아서 발생한 문제였다. 이번 글에서는 이 경험에서 학습했던 uWsgi의 특징과 쿠버네티스 파드의 종료 방식에 대해서 정리해보고자 한다. Graceful Shutdown이란? 프로그램이 종료될 때, 최대한 사이드 이펙트 없이 로직을 잘 처리하고 종료하는 것을 말한다. 예를 들어, 열심히 PPT를 작성하던 도중에 파워포인트가 꺼지는 모습을 상상해보자. 이 때, 아무런 조치없이 프로그램이 종료되고, 이전의 작업 내용이 유실된다면 이는..
[uWsgi] harakiri 옵션 - 지나치게 오래걸리는 요청 제어하기 harakiri 하라키리는 워커의 Request 처리 지연을 예방할 수 있는 uWsgi의 기능이다. Request 처리 시간이 uWsgi에 설정한 값보다 오래 소요되는 경우, 해당 Request는 제거되고, 워커는 재사용된다. 사용법 uwsgi 설정 [uwsgi] http = 0.0.0.0:80 harakiri = 30 ...nginx 설정 nginx의 timeout은 harakiri 설정과 동일해야, 각 기능이 기대한대로 동작하게 된다. 예를 들어, harakiri 값이 더 높으면, nginx timeout 설정이 의미 없게 된다. 반면, harakiri 설정값이 더 낮으면, harakiri 설정이 의미 없게 된다. location / { proxy\_pass http://my\_uwsgi\_upstr..
Hibernate-type-52 - Entity에 Postgresql Jsonb 타입 선언하기 Note Hibernate는 Postgresql의 Jsonb 타입을 지원하지 않는다. Jsonb 타입을 엔터티의 속성으로 적용하고 싶은 경우 hibernate-types-52 오픈 소스를 적용하거나, Hibernate의 UserType을 사용하여 커스텀한 Jsonb 타입을 구현해야한다. Code (1) 의존성 추가하기 dependencies { compile('com.vladmihalcea:hibernate-types-52:2.10.0') } (2) Entity Class에 TypeDef 어노테이션 선언하기 (3) 프로퍼티에 jsonb Type, Column 어노테이션 선언하기 (4-1) 샘플 - JsonBinary 타입 선언하기 @Entity(name = "Event") @Table(name = "ev..
ElasticSearch Remote Reindex - ES 버전업과 마이그레이트 Remote Reindex란?Elasticsearch의 Reindex API를 사용하면 도큐먼트를 새로운 인덱스로 복사할 수 있다. Remote Reindex를 사용하면, 도큐먼트를 원격 클러스터의 인덱스로 복사할 수 있다. 때문에 이 기능을 사용하면 Elasticsearch 버전업을 수월하게 할 수 있다. Rolling Upgrade가 불가능한 버전 업을 해야하는 경우, 실시간으로 구 클러스터와 신규 클러스터의 인덱스를 동기화해야하는 경우에 유용하게 쓰일 수 있다. POST _reindex { "source": { "remote": { "host": "http://oldhost:9200", "username": "user", "password": "pass" }, "index": "source", "q..
Chrome의 기본 레퍼러 정책 변화 - strict-origin-when-cross-origin (2020.07 / Chrome v.85) 요약 크롬은 85 버전 (2020.07 출시)부터 strict-origin-when-cross-origin 정책의 기본값을 enable으로 설정하기 시작했다. 이 영향으로 referer의 origin이 다른 경우, url path, parameter를 수집할 수 없는 경우가 발생하게 된다. 웹사이트에 referer 정책을 meta 태그로 설정해둔 경우, 이와 같은 문제는 발생하지 않는다. 크롬에서는 웹사이트에 referer 정책이 선언되어있지 않은 경우에만 브라우저의 referer 정책을 따른다. 각 브라우저의 referer 정책 설정은 chrome://flags/#reduced-referrer-granularity 에서 확인할 수 있다. Chrome 85의 Referer 정책 변화 referer hea..
HTTP 리소스 출처 확인하기 - origin, site, Sec-Fetch-Site Header Origin이란?origin은 URL에서 스키마, 호스트, 포트를 합한 것을 말한다. https://www.example.com/foo Url이 있다면, https://www.example.com:443 이 origin이다. same origin 식별 샘플 Sitesite는 TLD(Top-level domains. ex. .com / .kr )과 TLD 이전 도메인의 조합을 말한다.예를 들어, https://www.example.com/foo URL에서 site는 example.com 이다. schemeful same-sitesame-site는 schema를 보지 않는다. 그러나 http가 취약 채널을 통해 사용되는 것을 막아야하는 경우, same-site보다 더 엄격한 기준인 schemeful same..
Cursor Pagination - 대용량 데이터에 페이지네이션 적용하기 이 글에서는 Offset Pagination의 단점과 Cursor Pagination의 장점에 대해서 설명하고자 합니다. Pagination은 가장 대중적으로 사용되는 Offset Pagination과 Cursor Pagination으로 나뉩니다. Offset Pagination offset pagination이란, page 혹은 offset/limit을 지정하여 데이터에서 pagination 된 결과를 조회하는 방식을 의미합니다. /article/?offset=10&limit=10 /article/?page=1 이와 같은 쿼리 파라미터를 전달하는 경우, 아래와 같이 쿼리로 데이터를 조회합니다. select * from article limit 10 offset 20 offset pagination 방식..