1. 스프링이 제공하는 레디스 직렬화/역직렬화(Redis Serializer/Deserializer)의 종류와 한계 및 개선법서비스를 개발하다 보면 레디스(Redis)는 사실상 필수불가결한 구성 요소라고 볼 수 있다. 따라서 스프링 진영 역시 레디스를 손쉽게 사용할 수 있도록 캐시 추상화를 해줄 뿐만 아니라, 레디스의 자동 구성(AutoConfiguration) 등을 제공한다. 뿐만 아니라 레디스는 기본적으로 byte 배열을 사용해 데이터를 저장하기 때문에, 스프링 데이터 레디스(spring-data-redis) 에서는 데이터를 직렬화하여 레디스에 저장하고, 필요 시에 역직렬화하는 직렬화/역직렬화 도구까지 기본적으로 제공한다.하지만 스프링이 제공하는 레디스 직렬화/역직렬화(Redis Serializer/..
1. 트랜잭션 관리를 위한 TransactionTemplate의 활용[ 트랜잭션 관리를 위한 TransactionTemplate의 활용 ]스프링으로 개발을 하다 보면 선언적 트랜잭션을 자주 사용하게 된다. 선언적 트랜잭션(Declarative Transaction)이란 @Transactional 애노테이션을 기반으로 트랜잭션을 처리하는 방법을 의미한다.예를 들어 다음과 같이 포인트를 충전하기 위한 비즈니스 로직이 있다고 하자.@Componentclass PointCharger( private val fetchUserPort: FetchUserPort, private val chargePointPort: ChargePointPort, private val loadChargingTransac..
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 클래스에서 요청을 가로..
1. @PostConstruct 내부에서 @Bean 메서드 호출로 인해 발생하는 circular dependencies 문제 해결하기[ 문제 상황 공유 ]예를 들어 다음과 같은 코드가 있다고 하자.@Configuration@Slf4jpublic class ProfileConfiguration { @Value("spring.profiles.active") private String profile; @PostConstruct void init() { ServerProfile serverProfile = serverProfile(); if (serverProfile != null) { log.info("Using server profile: {..