본문 바로가기

소프트웨어 이야기

Domain services vs Application services 본 글에서는 도메인 서비스에 대해서 정리하고자 한다. 도메인 서비스와 애플리케이션 서비스의 차이점, 도메인 서비스를 사용할 때의 이점에 대해서도 설명하고자 한다. 1. Domain services와 Application services의 차이점 도메인 서비스는 entity와 VO에 자연스럽게 맞지 않는 도메인 지식을 제공하는 경우가 있다. 하지만 도메인 서비스를 도입하는 또다른 이유가 있다. 이는 도메인 모델 격리 (isolation)과 관련있다. Domain Service, Application Service는 entity, VO를 상위에서 다루는 stateless한 클래스를 의미한다. 이렇게 보면 둘은 꽤 유사해 보인다. 그러나 도메인 서비스는 도메인 로직을 갖고 있지만, 애플리케이션 서비스는 그렇지..
(PostgreSQL) Temporary Table과 Autovacuum Temporary Table은 Autovacuum 대상이 아니다. Temporary Table은 임시 테이블을 생성한 Connection에서만 조회할 수 있기 때문에 Autovacuum 데몬은 Temporary Table을 볼 수 없다. Temporary Table이 사용중인 공간은 Connection이 닫히면 저절로 회수된다. 그러나 만약, Transaction이 장기간 지속된다면 자원이 회수되지 않아 문제가 될 수 있다. Temporary Table에서 XID를 오랜시간 점유하고 있다면, Temporary Table을 생성한 세션을 종료하여 자원을 반환시켜야한다. 참고 What is autovacuum doing to my temporary tables? - Cybertec Did you know t..
(PostgreSQL) PostgreSQL autovacuum을 튜닝할 때 유용한 Tip 💡 이번 글에서는 Working with PostgreSQL autovacuum on Amazon RDS을 정리한 내용을 다루고자 한다. Autovacuum은 자동으로 VACUUM과 ANALYZE 명령문을 실행한다. Autovacuum은 추가/수정/삭제된 튜플이 많은 테이블을 찾는다. 그리고 데이터베이스에서 더 이상 사용되지 않는 데이터를 정리하여 저장공간을 확보한다. 기본적으로 AWS RDS PostgreSQL에서 Autovacuum이 활성화되어있다. 그리고 autovacuum과 관련된 설정들을 적절한 값을 기본값으로 설정해준다. 이 기본값들은 일반적인 기준으로 설정한 값이다. 때문에 시스템 특성에 맞는 적절한 값으로 설정값을 튜닝하면 성능상 이점을 얻을 수 있다. 해당 포스팅에서는 autovacuum 튜..
(PostgreSQL) AWS PostgreSQL RDS에 Transaction ID Wraparound 알럿 설정하기 본 글에서는 Amazon RDS for PostgreSQL에서 transaction ID의 상태를 모니터링하는 방법과 주요 문제를 해결하는 일반적인 방법에 대해서 설명하고자 한다. 이 글은 AWS Database blog에 포스팅된 Implement an Early Warning System for Transaction ID Wraparound in Amazon RDS for PostgreSQL 을 번역하여 정리한 글이다. transaction ID란? PostgreSQL은 vacuum 없이 21억여 개의 트랜잭션까지 처리할 수 있다. 만약 vacuum 없이 처리된 트랜잭션의 수가 2^31 - 10,000,000에 도달하게 되면, Postgresql은 베큠이 필요하다는 로그를 남기기 시작한다. 그리고 (..
(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..