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: {..
0. 사전 준비 사항[ SpringBoot 3.X 마이그레이션 사전 준비 사항 ]2.7.x 최신 버전으로 사전 업데이트하기버전업에 따른 의존성 변경 검토하기2.7 버전의 의존성3.x 버전의 의존성Spring Security 준비하기스프링 부트 3에서는 스프링 시큐리티 6을 사용함스프링 시큐리티는 6으로의 안전한 전환을 위해 5.8 버전을 제공하므로, 먼저 5.8로 버전업 필요스프링 시큐리티 6은 모든 dispatch type에 대해 authorization을 적용하는데, 해당 타입을 지정하려면 spring.security.filter.dispatcher-types 프로퍼티를 사용하면 됨시스팀 요구사항자바 17 (자바 8은 더 이상 지원하지 않음)스프링 프레임워크 6 [ IntelliJ 업데이트 ]스프링..