1. 트랜잭션 관리를 위한 TransactionTemplate의 활용[ 트랜잭션 관리를 위한 TransactionTemplate의 활용 ]스프링으로 개발을 하다 보면 선언적 트랜잭션을 자주 사용하게 된다. 선언적 트랜잭션(Declarative Transaction)이란 @Transactional 애노테이션을 기반으로 트랜잭션을 처리하는 방법을 의미한다.예를 들어 다음과 같이 포인트를 충전하기 위한 비즈니스 로직이 있다고 하자.@Componentclass PointCharger( private val fetchUserPort: FetchUserPort, private val chargePointPort: ChargePointPort, private val loadChargingTransac..
1. 비즈니스 정책과 입력 데이터, 서로 다른 데이터 검증 및 유효성 검사(Validation)[ 입력 데이터의 검증 및 유효성 검사 ]우리의 애플리케이션은 클라이언트로부터 받은 입력 데이터를 바탕으로 비즈니스 로직을 수행해야 한다. 이때 입력 데이터가 잘못되면 시스템에 문제를 일으킬 수 있으므로 클라이언트로부터 올바른 데이터가 전달되었는지 검증이 필요하다. 예를 들어 주식 주문을 위한 API가 존재하고, 다음과 같은 입력 데이터를 받고 있다고 하자.@Getter@NoArgsConstructor@AllArgsConstructorpublic class OrderStockRequest { private TradeType tradeType; // 거래 타입(매도, 매입) private String..
1. 헥사고날 아키텍처에 대하여[ 헥사고날 아키텍처의 도메인 엔티티(Domain Entity) ]우리는 소프트웨어를 개발할 때 어떠한 의미를 갖는 이론적 토대를 바탕으로 개발을 하게 된다. 예를 들어 우리가 헥사고날 아키텍처라는 아키텍처 패턴으로 시스템을 개발한다고 하자.헥사고날 아키텍처(Hexagonal Architecture)는 소프트웨어 설계 패턴 중 하나로, 포트와 어댑터 아키텍처(Ports and Adapters Architecture)라고도 불린다. 이 아키텍처의 주요 목표는 애플리케이션의 비즈니스 로직(핵심 도메인 로직)을 외부 의존성으로부터 분리하여 애플리케이션의 유지보수성, 테스트 용이성, 유연성을 높이는 것이다. 해당 포스팅은 헥사고날 아키텍처를 다루는 것이 아니기에, 단순히 “도메인을..
1. AttributeConverter registered multiple times 에러(JPA, Hibernate)[ 문제 상황 공유 ]문제가 발생했던 환경은 다음과 같다.Spring Boot 2.7Hibernate: 5.6.16.Final통합테스트에서만 발생 그리고 문제가 생겼던 코드는 다음의 부분이였다. YearMonth 타입의 필드를 데이터베이스에 저장하기 위해 String 타입으로 변환하도록 컨버터를 사용하는 부분이다.@Converterclass YearMonthConverter : AttributeConverter { override fun convertToDatabaseColumn(attribute: YearMonth?): String? { return attribute..
1. @Transactional에서 첫 쿼리 실행까지(실제 Connection이 필요할 때까지)커넥션 점유를 늦추는 LazyConnectionDataSourceProxy[ @Transactional의 동작 방식 ]스프링에서 개발을 하다 보면 @Transactional 애노테이션을 활용하게 된다. @Transactional은 AOP(Aspect-Oriented Programming) 기반으로 데이터베이스 커넥션으로부터 트랜잭션 관련 기능을 지원하도록 도와준다. 스프링의 트랜잭션에 대한 자세한 내용은 여기 링크를 참고하도록 하자.@Transactional 애노테이션을 선언하면, Transaction 처리를 위한 부가 기능(Advice) 클래스인 TransactionInterceptor 클래스에서 요청을 가로..