springboot 56

[Springboot] Mac에서 TestContainers Docker 감지 못할 때 해결 방법

개요Docker Desktop이 실행 중임에도 불구하고 테스트 코드를 실행할 때 다음과 같은 에러가 발생했습니다. 해결 방법Mac OS의 경우 다음 명령어를 터미널에 입력하면 문제가 해결됩니다. 출처https://java.testcontainers.org/supported_docker_environment/ General Container runtime requirements - Testcontainers for JavaGeneral Container runtime requirements Overview To run Testcontainers-based tests, you need a Docker-API compatible container runtime, such as using Testcontain..

[DEV] 기록 2025.04.24

[SpringBoot] RDS 자격 증명 AWS Secrets Manager 적용

서론고객의 보안 정책에 따라 주기적으로 데이터베이스(DB) 계정 비밀번호를 변경해야 합니다.그러나 현재 시스템에서는 비밀번호를 변경할 때마다 서버를 재기동해야 하며, MSA 서비스 특성상 관리해야 하는 DB가 여러 개입니다.이러한 불편함을 해결하기 위해 모든 DB의 자격 증명을 AWS Secrets Manager로 관리하고, 서버 재기동 없이 적용하고자 하는 요구사항이 생겼습니다. 프로젝트 환경SpringBoot 2.6.3 + MavenRDS (MariaDB 10.11.0 버전)Secrets ManagerIAMAWS CLI 1. RDS 생성 및 설정연동 테스트를 위해 프리티어 RDS를 생성하고 자격 증명 관리를 AWS Secrets Manager로 관리하도록 설정하겠습니다.단순 테스트 용도이기 때문에 외..

[DEV] 기록 2024.07.30

[SpringBoot] parallel stream 버그 해결

개요Hibernate의 CurrentTenantIdentifierResolver와 AbstractDataSourceBasedMultiTenantConnectionProviderImpl를 이용해 멀티 테넌시를 적용한 서비스에서, 시간이 비교적 오래 걸리는 import 기능을 제공합니다.이는 RDBMS 특성상 테이블들이 정규화되어 있어, 여러 테이블에 데이터를 넣어줘야 하고 넣을 때 외래키 제한에 걸리지 않도록 순서를 맞춰야 하기 때문입니다.저희 팀은 처리 시간을 단축시키기 위해 연관되어 있지 않은 테이블끼리 묶어서 parallel stream을 적용해 병렬 처리를 시도했으나, 간헐적으로 ThreadLocal에서 다른 테넌트, 즉 다른 스키마로 요청을 보내는 문제가 발생하여 foreign key constr..

[DEV] 기록 2024.07.07

[SpringBoot] Springdoc Swagger 적용

서론현재 진행 중인 프로젝트에 Spring Rest Docs를 적용하려 했으나, 팀원들이 각 API마다 테스트 코드를 작성하는 데 부담을 느끼는 것 같아 우선 Swagger를 적용하기로 했습니다.프로젝트에는 Spring Security가 적용되어 있고, 멀티 테넌시를 위해 커스텀 헤더를 전달해야 했기 때문에 Swagger 적용이 쉽지 않았습니다.비슷한 환경에 계신 분들께 도움이 되길 바라며, 부족하지만 Springdoc Swagger 적용기를 공유합니다. 개발 환경SpringBoot 2.6.3java 1.8springdoc-openapi-ui 1.6.11 빨리 SpringBoot 3.2.X 버전 + JDK 21로 넘어가서 Virtual Thread 다루어 보고 싶다.... Springfox vs Spri..

리서치 2024.05.28

[SpringBoot] JPA 쿼리 성능 감시 가이드

개요팀 내 JPA 쿼리 성능 감시 가이드를 작성하는 업무를 맡은 김에 간단하게 다음 항목을 정리해 보겠습니다.JPA slow 쿼리 검출JPA N + 1 문제가 의심되는 api 검출 JPA N + 1 문제가 의심되는 api의 경우 범고래님 블로그를 많이 참고했습니다! 감사합니다. 프로젝트 환경SpringBoot 2.6.3Java 1.8 Jpa slow 쿼리 검출application.yml에 다음과 같이 설정을 하면 Hibernate에서 slow query를 로깅해 줍니다.  테스트 삼아 100ms를 기준으로 잡았고 그 결과 실행시간이 205ms인 SELECT 쿼리가 아래와 같이 로깅되었습니다.  오래 걸린 쿼리를 로깅하는 것 자체는 좋았지만 구현한 JpaRepository가 워낙 많다 보니 검출된 쿼리들이..

리서치 2024.03.12

[SpringBoot] yml 파일로 메세지 다국어 처리

개요진행 중인 프로젝트에 다국어 처리를 추가해야 하는데, 공식 문서에서 제시한 properties 파일 대신 yml 파일을 사용하고 싶었고, 조사 결과 이를 가능하게 하는 라이브러리가 존재했습니다.https://github.com/akkinoc/yaml-resource-bundle?tab=readme-ov-file GitHub - akkinoc/yaml-resource-bundle: Java ResourceBundle for YAML format.Java ResourceBundle for YAML format. Contribute to akkinoc/yaml-resource-bundle development by creating an account on GitHub.github.com 이 게시글에서는 스..

리서치 2024.02.14

[Springboot] Jpa 프로젝트에 jOOQ 도입

jOOQ를 도입하게 된 배경 현재 진행하고 있는 프로젝트의 기술스택 중 이번 게시글과 연관된 기술들과 버전은 아래와 같습니다. Springboot 2.6.3 Java 1.8 spring-boot-starter-data-jpa (기본 키 생성 전략: IDENTITY) MariaDB 10.9.2 버전 QueryDSL 5.0.0 버전 Maven 프로젝트 내 기능 중 대용량 엑셀 업로드 기능과 json import 기능이 있는데 데이터가 커질수록 병목현상이 심해지는 것을 발견할 수 있었습니다. (json import의 경우 멀티 쓰레드 방식으로 과장님이 어느 정도 해결하시긴 하셨습니다.) 대용량으로 업로드할 때 entity를 하나하나 저장할 경우 불필요한 DB 커넥션이 많이 생기므로 1000개씩 묶어서 bulk..

리서치 2023.10.03

[SpringBoot 2.6.X] QueryDSL Unable to load class 'com.mysema.codegen.model.Type'

개요 SpringBoot 2.7.12 버전에 QueryDSL 디펜더시를 추가한 후 QClass 생성을 위해 compileQuerydsl 명령을 호출하니 아래와 같은 에러가 발생했습니다. QueryDSL Unable to load class 'com.mysema.codegen.model.Type' External Libraries에 추가된 라이브러리 목록은 아래와 같습니다. 원인 SpringBoot 2.6.X 버전 이상부터는 build.gradle에 QueryDSL 버전을 직접 명시해야 하고, querydsl-jpa 및 querydsl-apt를 추가하도록 변경이 되었습니다. 해결 방법 아래 build.gradle 파일과 같이 querydsl 세팅을 변경하면 정상적으로 compileQuerydsl 명령이 실..

[DEV] 기록 2023.06.20

[Spring] @Transactional 적용 시 주의 사항

개요 앞선 포스팅에서 @Transactional 애노테이션 적용 시 프록시 방식의 AOP를 통해 트랜잭션이 적용되는 내용을 정리했습니다. https://jaimemin.tistory.com/2271 @Transactional 동작 원리 용어 정리 트랜잭션 관리에는 크게 두 가지 방법이 있습니다. 선언 방식의 트랜잭션 관리 프로그래밍 방식의 트랜잭션 관리 선언적 트랜잭션 관리 @Transactional 애노테이션 하나만 선언해서 편리 jaimemin.tistory.com 이번 게시글에서는 @Transactional 적용 시 주의할 사항을 정리해 보겠습니다. @Transactional 적용 시 주의 사항 @Transactional을 적용 시 주의할 점이 크게 세 가지가 있습니다. 트랜잭션을 적용하기 위해서는..

Spring 2023.04.18

@Transactional 동작 원리

용어 정리 트랜잭션 관리에는 크게 두 가지 방법이 있습니다. 선언 방식의 트랜잭션 관리 프로그래밍 방식의 트랜잭션 관리 선언적 트랜잭션 관리 @Transactional 애노테이션 하나만 선언해서 편리하게 트랜잭션을 적용하는 방법 "트랜잭션을 적용하겠다"라고 메서드나 서비스에 선언하기만 하면 AOP를 통해 트랜잭션이 적용되는 방식 프로그래밍 방식의 트랜잭션 관리 PlatformTransactionManager 또는 TransactionTemplate 등을 통해 트랜잭션 관련 코드를 직접 작성하는 방법 이번 게시글에서는 선언적 트랜잭션 관리의 동작 원리에 대해 알아보겠습니다. Transaction AOP 전체 흐름 @Transactional 애노테이션이 선언되면 AOP를 통해 트랜잭션이 적용되므로 Trans..

Spring 2023.03.29