안녕세계

DriverManagerDriverManager는 JDBC API(Java Database Connectivity API)에서 제공하는 클래스로 데이터베이스와 연결을 직접 생성하고 관리하는 역할을 합니다. (JDBC API에 포함되어있어 별도 설정이 불필요)Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mydb", "username", "password");DriverManager는 구체적인 클래스 기반의 API를 통해 데이터베이스와 직접 상호작용합니다. DB 연결 요청 시 매번 새로운 Connection이 생성되고 직접 관리해야합니다. 매 요청마다 새로운 Connection을 하기 때문에 오버헤..

1차 캐시 작동 조건JPA의 1차 캐시는 엔티티를 메모리에 임시로 저장하여 불필요한 DB 쿼리를 줄이고 성능을 향상시키는 중요한 기능입니다. 1차 캐시는 EntityManager가 관리하는 영속성 컨텍스트(persistence context) 내에서 엔티티를 보관하는 저장소로, 주로 트랜잭션 범위 내에서 작동합니다. 즉, 한 트랜잭션 내에서 처음 조회한 엔티티는 두 번째부터 DB에 접근하지 않고 1차 캐시를 통해 데이터를 가져올 수 있게 됩니다. 1차 캐시가 제대로 작동하기 위해서는 몇 가지 조건이 필요합니다. 영속성 컨텍스트 존재1차 캐시는 영속성 컨텍스트 내부에 있으므로, 영속성 컨텍스트가 반드시 존재해야합니다.각 영속성 컨텍스트는 독립적인 1차 캐시를 가지므로, 다른 영속성 컨텍스트에서는 동일 엔티..

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

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)..

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

ArchUnit이란?보통 팀마다 정해져있는 아키텍처가 문서로 작성되어 있거나 기존 코드의 아키텍처를 참조해가며, 개발을 진행하는 경우가 많을 것 입니다. 아키텍처에 위배되는 개발이 되는 것을 미연에 방지하기 위해서는 어떤 방법이 좋을까요? 팀에서 정의한 아키텍처를 위배했을때 코드리뷰를 통해서 잘못된 아키텍처를 바로 잡을 수도 있겠지만, 코드리뷰에서는 비즈니스 로직에 대한 검증을 중점적으로 하고 아키텍처와 관련된 부분은 자동화하는 편이 더 효율적일 것입니다. ArchUnit은 Java 애플리케이션의 아키텍처 규칙을 코드로 정의하고 테스트할 수 있게 해주는 오픈 소스 라이브러리입니다. 애플리케이션의 아키텍처가 복잡해지고 방대해질수록 각 계층 간의 의존성을 유지하고 코드의 일관성을 보장하는 것이 중요해집니다...