백엔드

상황에 따른 Hikari CP의 커넥션 풀 상태가 궁금해졌습니다.@Transactional 어노테이션에 따라 active 가 되고 언제 다시 idle로 돌아가는지 알아보기 위해 모니터링을 위한 준비를 했습니다.다음과 같은 클래스 구조에서 확인해 보겠습니다.다음과 같이 테스트 합니다.1. 먼저 facade 클래스의 메서드가 실행되면 Thread.sleep으로 많은 일을 처리했다고 가정합니다.2. @Transactional 어노테이션이 걸려있는 서비스의 메서드를 호출합니다. 각 과정 사이에 HikariCP 로그를 찍어 Connection pool 상태를 확인합니다.자세한 소스코드는 다음 github를 참고해 주세요. 먼저 HikariCP를 모니터링하기 위해 application.yml 에 다음 설정을 추가합..
같은 팀원의 코드리뷰 중 JPA 변경감지를 사용하지 않고 명시적으로 saveAll 메서드를 호출하고 있는 코드를 발견하였습니다.변경감지를 사용하여 처리하는 게 어떻겠냐고 제안하였고 팀원 분께서는 변경감지가 동작하지 않는다고 하였습니다.메서드에는 @Transactional 어노테이션이 걸려있었고 트랜잭션 커밋 시 영속성 컨텍스트가 flush 되기 때문에 저는 동작할 것이라고 예상했는데 말이죠. 팀원 분께 괜찮다면 제가 한 번 실행해 봐도 되냐고 여쭤본 후 실행해 보니 정말 변경감지가 동작하지 않았습니다!🫨계속 확인해 보다가 이상한 점을 발견했습니다.팀원 분이 작성하신 코드는 다음과 같은 구조를 가지고 있었습니다.@Servicepublic class SelfInvocation { public Stri..
@Trasactional 어노테이션의 propagation에 대해 알아보고 중첩된 트랜잭션을 사용하게 될 때 생기는 문제에 대해 알아보겠습니다. @Transactional 어노테이션의 propagation 속성에는 총 7가지의 속성이 있습니다. public enum Propagation { REQUIRED(0), SUPPORTS(1), MANDATORY(2), REQUIRES_NEW(3), NOT_SUPPORTED(4), NEVER(5), NESTED(6); private final int value; private Propagation(int value) { this.value = value; } public int value() { return this.value; } } Propagtaion 속성 ..
스프링부트 3.x부터 Spring cloud sleuth로 트레이싱 기능을 추가할 수 없게 되었습니다. 마이그레이션 가이드 https://github.com/micrometer-metrics/tracing/wiki/Spring-Cloud-Sleuth-3.1-Migration-Guide Spring Cloud Sleuth 3.1 Migration Guide Provides tracing abstractions over tracers and tracing system reporters. - micrometer-metrics/tracing github.com 앞으로는 Micrometer 의 brave 의존성을 추가해 트레이싱 기능을 사용할 수 있습니다. 적용해 볼 환경은 아래와 같습니다. Spring boo..
코드리뷰를 하던 중 동료 개발자 분 코드에서 1건 저장 행위만 하는 Service 레이어 메서드의 @Transactional 이 없는 것을 발견했습니다. 나: "어? 이게 있어야하지 않을까요?" 동료 개발자 : "1개 만 저장하는 건데 있어야 하나요?" 생각해 보니 딱히 이유를 찾지 못했습니다. 어차피 spring-data-jpa 구현체인 SimpleJpaRepository의 save 메서드에서 @Transactional 이 걸려있습니다. 분명 제가 본 강의에서는 서비스 레이어의 클래스에는 @Transactional(readOnly=true) 어노테이션을 붙이고 쓰기 메서드에는 @Transactional을 붙이는 방식을 많이 활용한다고 했는데 이유가 기억나지 않았습니다. 조금 더 검색해 본 결과 다음과 ..
본 글은 Spring 6.0.8 Spring Boot 3.0.6 Spring batch 5.0.1 으로 작성되었습니다. 스프링 배치에 대한 전반적인 지식이 부족하신 분은 스프링 배치 이론을 참고해 주세요. 이 글은 어느 정도 스프링에 익숙한 분들을 위한 글입니다. 본 글에서는 Job, Step 작성 및 실행까지만 다룹니다. 각 소스코드에 대한 설명은 없습니다. 각 메서드 및 소스코드에 대한 설명을 다음 편에서 하나씩 진행하도록 하겠습니다. Spring Initializr에 방문하여 Spring Batch를 추가하고 그 외 필요한 것들을 추가하여 다운로드합니다. 해당 배치에서 접속할 DataSource 설정을 합니다. 스프링 배치 이론에 있는 메타테이블이 생성되어있어야 합니다. 기존 스프링 배치 4.x 버..
Spring Batch 이론에 대해 알아보겠습니다. 이 글은 Spring Boot 3.0.6 Spring Batch 5.0.1 Spring 6.0.8 Java 17 기준으로 작성되었습니다. Spring Batch 4.x 와 Spring Boot 2.x 와는 다른 점이 많으니 해당 버전은 다른 글을 참고해 주세요~! Spring 배치란? Spring Batch는 대용량의 데이터 처리를 위한 오픈소스 배치 프레임워크로, 스프링 프레임워크와 통합되어 사용됩니다. Spring Batch는 성능, 확장성, 안정성, 재시작 기능 등 배치 작업에서 요구되는 다양한 기능들을 제공합니다. 또한, 스프링 프레임워크와 함께 사용되면 스프링의 다양한 기능들과 연동이 가능해져 배치 작업을 보다 효과적으로 구현할 수 있습니다. ..
이 글은 스프링 배치에 대한 기본적인 지식은 알고 있다고 가정한 후 작성되었습니다. 스프링 배치 기본적인 지식에 대한 이해 후 읽어주세요! 회사에서 스프링 배치에 대해 사용할 일이 생겼습니다. 기존 스프링 배치 4.x 버전 하위 버전에 대한 예제는 많으나, 스프링 부트 2.x 버전은 버그수정, 보안 업데이트를 2023년 말까지 지원합니다. 또한, 스프링 부트 3.x 는 Java 17 부터 지원하고 Java EE 대신 Jakarta EE를 사용하여 패키지 명이 전면적으로 수정되었습니다. 때문에 5.x 버전과 스프링 부트 3.x 버전을 선택하였습니다. 스프링 부트 3.x 에서는 스프링 6.x 기반으로 작성되었습니다. 스프링 6.x 에서는 스프링 배치 5.x 를 사용합니다. 기존 스프링 배치와 많은 부분이 달..
HikariCP와 JPA로 프로젝트를 구성했는데, 갑자기 에러가 발생하였습니다. o.h.engine.jdbc.spi.SqlExceptionHelper : hikari-pool-1 – Connection is not available, request timed out after 30000ms. hikariCP의 옵션 중 connectionTimeout의 default 가 30000ms 인 것을 확인하고 왜 이런 일이 발생했는지 찾기 시작했습니다. hikariCP 의 Pool에 유지시킬 수 있는 connection 개수인 maximumPoolSize의 default는 10입니다. 에러의 발생 원인은 HikariCP 데이터베이스 커넥션 풀에서 커넥션을 가져오려고 시도했지만 사용 가능한 커넥션이 없거나, 요청이..
내장 H2 DB로 Repository 테스트 코드 작성하는 방법에 대해 알아보겠습니다. TestJpaConfig.class를 생성하여 @EnableJpaAuditing 을 통해 JpaAuditing을 활성화합니다. (JpaAuditing 을 안 쓰시면 필요 없습니다.) TestJpaConfig.class 에는 다른 코드는 없고 클래스 위에 어노테이션만 추가합니다. @EnableJpaAuditing @TestConfiguration 테스트할 XxxxTest.java 클래스 위에 하단 어노테이션을 추가합니다. @DataJpaTest @Import({TestJpaConfig.class}) @AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H..
infitry
'백엔드' 카테고리의 글 목록