
1. 데이터베이스 커넥션 풀 및 JPA, 하이버네이트 설정 최적화(Database Connection Pool and JPA, Hibernate properties optimization) [ 데이터베이스 커넥션 풀 설정 최적화 ]기본 정보들데이터베이스에 연결하기 위한 기본 정보들로는 url, username, password, driver-class-name과 같은 것들이 있다. 여기서 중요한 것은 url에 접속 파라미터 부분이다.spring.datasource.url=jdbc:mysql://com.mangkyu.database:3306?\\ rewriteBatchedStatements=true\\ &zeroDateTimeBehavior=convertToNull\\ &useUnicode..
이전 포스팅에서는 스프링이 제공하는 레디스 직렬화/역직렬화(Redis Serializer/Deserializer)이 갖는 한계점에 대해서 살펴보았다. 일반적인 현대의 애플리케이션에서는 CPU 사용량보다는 메모리 사용량이 높기 때문에, 압축 기능을 통해 CPU를 조금 더 사용하더라도 저장 공간의 사용량을 줄이는 것이 합리적이라고 볼 수 있다. 따라서 이번 포스팅에서는 Gzip 압축 기능이 적용된 레디스 직렬화/역직렬화(Redis Serializer/Deserializer)를 구현하고, 스프링에서의 설정을 고도화 해보도록 하자. 1. 스프링에서 레디스 설정 및 직렬화/역직렬화(Redis Serializer/Deserializer) 고도화하기스프링 프레임워크에서 레디스를 활용할 때, 크게 @Cacheable..
1. 스프링이 제공하는 레디스 직렬화/역직렬화(Redis Serializer/Deserializer)의 종류와 한계서비스를 개발하다 보면 레디스(Redis)는 사실상 필수불가결한 구성 요소라고 볼 수 있다. 따라서 스프링 진영 역시 레디스를 손쉽게 사용할 수 있도록 캐시 추상화를 해줄 뿐만 아니라, 레디스의 자동 구성(AutoConfiguration) 등을 제공한다. 뿐만 아니라 레디스는 기본적으로 byte 배열을 사용해 데이터를 저장하기 때문에, 스프링 데이터 레디스(spring-data-redis) 에서는 데이터를 직렬화하여 레디스에 저장하고, 필요 시에 역직렬화하는 직렬화/역직렬화 도구까지 기본적으로 제공한다.하지만 스프링이 제공하는 레디스 직렬화/역직렬화(Redis Serializer/Deseri..
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..