안녕세계
지난, 2024년 10월 8일 Amazon ElastiCache에서 Valkey 버전 7.2에 대한 지원이 발표되었습니다. Valkey 캐시 리소스의 Serverless 가격은 Redis OSS 대비 33% 낮은 가격, 자체 설계(노드 기반)의 Cluster 가격은 Redis OSS 대비 20% 낮은 가격으로 이용할 수 있다고 합니다. Valkey에 대해 처음들어 보시는 분들도 있을 것 같은데요. Valkey는 Linux Foundation에서 구축한 오픈 소스이며, Redis OSS 7.2 버전과 완벽하게 호환됩니다. Valkey는 Redis OSS를 대체하는 제품으로 Valkey 전환시 캐시 비용을 절감하고, 최신 ElastiCache 기능의 이점을 누릴 수 있다고 합니다. 캐시 비용 절감을 위해 ..

JPA에서 논리적 삭제(Soft Delete)를 구현할 때 자주 사용하는 방법으로 Hibnerate의 @Where와 @SQLRestriction 어노테이션이 있습니다. 두 어노테이션 모두 특정 컬럼 값을 기준으로 데이터를 자동으로 필터링할 수 있도록 지원합니다. 하지만, 각 어노테이션은 Hibernate 버전에 따라 지원 여부와 동작 방식에 차이가 있으며, 특히 Hibernate 5.x의 @Where는 JOIN 연산 시 전역 조건이 제대로 적용되지 않는 한계가 있습니다. 본 글에서는 실제 테스트 사례를 통해 @Where 어노테이션의 한계를 분석하고, 이를 해결할 수 있는 Hibernate 6.x의 @SQLRestriction 어노테이션을 소개합니다.@Where 어노테이션과 한계@Where는 엔티티 클래스..

Transaction IsolationTransaction Isolation은 데이터베이스에서 여러 트랜잭션이 동시에 실행될 때, 한 트랜잭션이 다른 트랜잭션의 변경 사항을 언제, 어떻게 볼 수 있는지를 결정하는 규칙입니다. 그리고 Transaction Isolation은 여러 트랜잭션이 동시에 실행될 때 서로의 작업에 영향을 주지 않도록 하는 역할을 합니다.Transaction Isolation LevelTransaction Isolation Level은 ANSI SQL 표준으로 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE로 4가지가 있으며, MySQL에서 현재 세션에 설정된 Isolation Level을 확인하고 싶은 경우 다음 쿼..

Transaction PropagationTransaction Propagation은 트랜잭션이 다른 트랜잭션을 호출할 때, 그 트랜잭션이 어떻게 전파될지를 정의하는 개념입니다. 즉, 하나의 트랜잭션이 다른 메서드나 서비스에서 실행되는 트랜잭션에 참여할지, 새로운 트랜잭션을 생성할지 등을 결정하는 것입니다. Propagation은 애플리케이션 내부에서 트랜잭션의 전파 방식을 관리하며, 이를 Spring의 트랜잭션 매니저가 제어합니다. 참고로, Transaction Propagation은 애플리케이션 단(예: Spring Framework)에서 제공하는 개념이며, DB 트랜잭션은 단일 connection에서 시작과 종료로 관리되기 때문에 DB 자체에는 Propagation이 존재하지 않습니다. DB는 단순..

ProxyFactorySpring의 ProxyFactory는 AOP를 구현할 때 핵심 역할을 하는 도구입니다. ProxyFactory를 사용하면 target 객체를 감싸는 proxy 객체를 동적으로 생성할 수 있으며, 이 proxy 객체를 통해 메서드 호출 시 부가적인 행동(예: 로깅, 트랜잭션 관리 등)을 추가할 수 있습니다. Spring에서 ProxyFactory를 활용해서 동적 proxy를 만드는 방법은 JDK 동적 프록시와 CLIB이 존재합니다.JDK 동적 proxy: 인터페이스를 기반으로 동적 proxy 생성 (리플렉션 사용)JDK 동적 proxy는 인터페이스 기반으로 만들었기 때문에, 구현 클래스로 타입 캐스팅이 불가능합니다.CGLIB: 인터페이스 없이 구체 클래스만으로도 동적 proxy 생성..

Spring Bean은 Spring IoC Container에 의해 관리되는 객체를 의미합니다. Spring IoC Container가 생성, 의존성 주입, 초기화, 사용, 소멸 과정을 책임지게 되는데, 이때 Spring Bean Life Cycle은 다음과 같습니다. 1. 객체 생성: IoC Continaer가 Bean을 생성2. 의존성 주입: Bean 의존성 주입3. 초기화: Bean을 사용 가능한 상태로 초기화 작업 실행4. 사용: 애플리케이션에서 Bean을 사용5. 소멸: 애플리케이션이 종료되거나 Bean 수명이 끝나면 소멸 작업 실행1. 객체 생성Spring IoC Container는 애플리케이션의 Bean 정의에 따라 객체를 생성합니다. Bean 정의 방법은 (1) XML Config, (2)..

Life수영 배우기올해 처음으로 수영을 배웠습니다. 작년에 친구들과 베트남 여행에서 저만 수영을 못해 물놀이를 제대로 즐기지 못한 아쉬움이 남아, 새해 계획으로 수영을 배우기로 결심했습니다. 마침 집 근처에 수영장이 있어 주 3회 새벽 6시에 수영을 다녔습니다. 와이프와 함께 시작했던 덕분에 서로 독려하며 꾸준히 이어갈 수 있었습니다.반 년 동안 발차기부터 시작해 접영까지 배울 수 있어 의미있는 시간이었습니다. (완벽한 접영이라기보다는 흉내에 가까웠지만) 물에 뜨는 방법조차 몰랐던 제가 네 가지 영법(자유형, 배영, 평영, 접영)을 배웠다는 사실이 뿌듯합니다. 특히 자유형과 평영이 배워가는 재미가 컸고, 매일 조금씩 성장하는 스스로를 보며 자존감도 많이 올랐습니다.수영을 통해 체중도 자연스럽게 줄고, 몸..

헥사고날 아키턱처란?헥사고날 아키텍처는 애플리케이션 코어(비즈니스 로직)와 외부 요소(예: 웹, 데이터베이스, 외부 시스템)를 분리하기 위해 설계된 아키텍처입니다. 헥사고날 아키텍처는 시스템을 애플리케이션 코어와 외부 요소로 나누고, 포트(Ports)와 어댑터(Adapters)를 통해 애플리케이션 코어와 외부 요소를 연결합니다. 따라서, 포트와 어댑터 아키텍처(ports-and-adapters architecture)라고도 불립니다.계층형 아키텍처와 헥사고날 아키텍처계층형 아키텍처(Layered Architecture)계층형 아키텍처는 웹, 도메인, 영속성 계층으로 구성된 애플리케이션 구조를 의미합니다. 계층형 아키텍처는 의존성이 상위 계층에서 하위 계층으로만 흐릅니다. 즉, 웹 계층은 도메인 계층에 의..