목록전체 글 (584)
우당탕탕
systemd 서비스 유닛 파일에서 Restart=와 StartLimit 관련 옵션을 활용하면 서비스의 재시작 동작과 재시작 루프를 효과적으로 제어할 수 있습니다.Restart= 옵션Restart=는 서비스 프로세스가 종료되었을 때 systemd가 자동으로 재시작할지 여부를 지정합니다. 가능한 값으로는 no (기본값), on-success, on-failure, on-abnormal, on-watchdog, on-abort, always 등이 있습니다. 예를 들어 Restart=on-failure로 설정하면 서비스가 비정상 종료되었을 때만 재시작합니다.StartLimit 관련 옵션재시작 루프 방지를 위해 systemd는 StartLimitIntervalSec=와 StartLimitBurst= 옵션을 제공..
MySQL 8.4 버전 기준, EXPLAIN 명령은 SELECT, DELETE, INSERT, REPLACE, UPDATE 문에 대해 실행 계획 정보를 제공합니다. 각 테이블별로 한 행씩 결과를 반환하며, MySQL이 쿼리를 처리하는 순서대로 테이블을 나열합니다.EXPLAIN 출력에서 확인할 주요 컬럼id (select_id): 쿼리 내 SELECT 문 식별자 번호입니다.select_type: SELECT 문의 유형으로 SIMPLE, PRIMARY, UNION, SUBQUERY 등 다양한 값이 있습니다.table (table_name): 해당 행이 참조하는 테이블 이름 또는 파생 테이블, 서브쿼리 결과 등을 나타냅니다.partitions: 쿼리가 접근하는 파티션 정보이며, 비파티션 테이블은 NULL입니다..
TypeScript 4.9 버전부터 도입된 satisfies 연산자는 타입 주석(type annotation)과는 달리, 표현식의 타입이 특정 타입과 호환되는지 검증하면서도 표현식의 구체적인 타입 정보를 유지할 수 있게 해준다. 이는 타입 주석을 사용할 때 발생하는 타입 정보 손실 문제를 해결한다.satisfies 연산자와 타입 주석의 차이타입 주석: 변수나 상수에 타입을 명시하면, 해당 타입으로 타입이 고정되어 표현식의 구체적인 타입 정보가 축소될 수 있다. 예를 들어, Record 타입 주석을 사용하면 각 프로퍼티가 string | RGB 타입으로 제한되어, 구체적인 타입 추론이 어려워진다.satisfies 연산자: 표현식이 특정 타입을 만족하는지 검증하지만, 표현식의 구체적인 타입 정보는 그대로 유..
MySQL 8.4에서는 SELECT ... FOR UPDATE 또는 SELECT ... FOR SHARE 구문에 SKIP LOCKED 옵션을 사용할 수 있습니다. 이 옵션은 잠긴 행(row)이 있을 때 해당 행을 건너뛰고 즉시 결과를 반환하도록 하여, 잠금 대기(lock wait)를 피할 수 있게 합니다.SKIP LOCKED의 동작 조건잠긴 행이 존재할 경우, 해당 행을 결과 집합에서 제외하고 나머지 잠기지 않은 행만 반환합니다.잠금이 걸린 행에 대해 대기하지 않고 즉시 쿼리를 완료합니다.이 기능은 행 수준 잠금(row-level lock)에만 적용됩니다.잠긴 행을 건너뛰므로 결과가 일관적이지 않을 수 있습니다.트랜잭션이 시작된 상태에서(autocommit이 비활성화된 상태)만 사용할 수 있습니다.SKI..
Spring Framework 6.2 기준으로, @TransactionalEventListener는 트랜잭션의 특정 단계에 이벤트 리스너를 바인딩할 수 있는 기능을 제공한다. 기본적으로 이 어노테이션은 트랜잭션이 성공적으로 커밋된 AFTER_COMMIT 단계에 리스너를 실행하도록 설정되어 있다.AFTER_COMMIT 단계AFTER_COMMIT는 트랜잭션이 정상적으로 커밋된 이후에 이벤트 리스너가 호출되는 시점을 의미한다. 이 시점에서 트랜잭션은 이미 커밋되었으나, 트랜잭션 관련 리소스는 여전히 활성 상태일 수 있다. 따라서 이 단계에서 데이터 접근 코드를 실행하면 원래 트랜잭션에 참여하지만, 변경 사항은 커밋되지 않는다.fallbackExecution 속성기본적으로 @TransactionalEventLi..
제가 직접 Redis 캐싱을 Spring Boot에 연동해보면서 생각보다 삽질했던 부분들이 많았어요. 데이터베이스 쿼리 최적화를 위해 캐시를 도입했는데, 이 과정에서 설정부터 실제 코드 작성, 테스트까지 모든 단계를 하나씩 기록해봤습니다.이 글에서는 Redis 캐시를 Spring Boot 프로젝트에 연동하는 절차, 캐시 적용 후 쿼리 성능 변화, 그리고 주의할 점까지 실제 경험을 중심으로 단계별로 안내할게요. 저처럼 직접 구현하는 동안 참고가 되셨으면 해요.개발 환경 / 버전 정보우선 제가 사용한 환경부터 공유드릴게요. Java 17, Spring Boot 3.1.4 버전 기준입니다. Redis는 Redis 7.0 로 로컬에 설치했어요.또한 의존성은 spring-boot-starter-data-redis..
