반응형 개발 이야기/Springboot29 JUnit 5, Mocking with ArgumentCaptor 목차1. ArgumentCaptor란?ArgumentCaptor는 Mockito에서 메소드에 전달된 Parameters를 캡처하는 기능입니다.Mock 객체에 전달된 Parameters를 캡처하여 검증을 도와줍니다.Mockito 라이브러리에 포함되어 있으며, 행위를 검증하는 테스트 코드에서 사용 할 수 있습니다. 기본적인 테스트 방법은 아래와 같습니다.특정 타입의 ArgumentCaptor를 생성합니다.이 캡처를 사용하여 인자를 캡처하도록 Mockito에 지시합니다.테스트 코드를 실행합니다.캡처된 인자를 검사합니다.위에서 말씀드렸다시피ArgumentCaptor는 행위 검증 테스트에서 사용됩니다.행위 검증 테스트는 무엇인지 알아 봅시다. 2. 상태(state) vs 행위(behavior) 검증 테스트상태 검.. 2025. 4. 24. JUnit 5에서 조건부 @Disabled 적용하기 목차1. @Disabled@Disabled는 JUnit에서 제공하는 테스트를 비활성화하는 기능을 가진 어노테이션입니다.아래와 같이 사용 될 수 있습니다.@Disabled@Testfun test() { Assertions.fail("not executed")} Disabled로 설정한 이유를 기입 할 수도 있습니다.@Disabled("This is disabled because of a bug ticket BUG-12345")@Testfun test() { Assertions.fail("not executed")} 2. 조건부로 Disabled 시켜야 하는 상황@Disabled를 사용하면 아래와 같은 시나리오로 사용 할 수 있습니다.특정 이슈로 인해 @Disabled 어노테이션을 붙여 테스트를 비활성화이.. 2025. 4. 20. httpclient thread limit exceeded replacing blocked worker 에러 에러 관련 경험을 포스팅합니다. 목차1. 이슈 및 운영 환경이슈 내용은 외부 API 호출 시, 간헐적으로 실패하는 이슈였습니다.서버 환경은 아래와 같았습니다.Springboot 2.5Java 11특히, 요청량이 과도한 경우에 잦은 빈도로 에러가 발생했습니다.에러 로그는 대략 아래와 같았습니다....(중략)Caused by: java.util.concurrent.RejectedExecutionException: Thread limit exceeded replacing blocked worker at java.util.concurrent.ForkJoinPool.tryCompensate(ForkJoinPool.java:1819) ~[?:?] at java.util.concurrent.ForkJoinPool.c.. 2025. 4. 17. TestContainers에서 Can't get Docker image: RemoteDockerImage에러 발생 시 얼마전 맥북을 한번 밀고새롭게 업무 환경 세팅을 하던 중 docker 관련 에러가 하나 발생했다.Springboot + TestContainers를 활용한 빌드 과정이었다.Could not find a valid Docker environment. Please see logs and check configurationjava.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configurationat org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClie.. 2025. 2. 2. Springboot App 시작, 종료시 로직 실행 Springboot Application을 시작하거나 종료 할때특정한 로직을 수행해야할 경우가 있습니다.로그를 찍는다거나, 백업을 한다거나 등등... 이번 포스팅에서는 Springboot에서 시작, 종료 시 이벤트를 받아 로직 수행을 처리하는 방법을 정리합니다.제 테스트 환경은 Kotlin + Springboot 3.1.4 입니다.목차1. Application 시작 이벤트 리스너import org.springframework.boot.context.event.ApplicationReadyEventimport org.springframework.context.ApplicationListenerimport org.springframework.stereotype.Component@Componentclass A.. 2024. 8. 31. Springboot 에서 Gzip으로 압축(with Kotlin) Gzip은 파일이나 데이터를 압축하기 위한 소프트웨어 기술을 의미합니다.간혹 .tar.gz이란 포맷을 가진 파일을 볼 수 있는데 여기에 사용된 압축 기술도 Gzip입니다.압축률이 준수하고, 속도도 빨라서 웹 환경에서도 자주 사용되곤 합니다. 이번 포스팅에서는 Springboot 프로젝트에서 Gzip을 사용한 압축/압축해제 하는 방법을 정리합니다. 목차1. 압축 하기아래와 같이 코드를 작성해줍니다.import java.io.BufferedReaderimport java.io.ByteArrayInputStreamimport java.io.ByteArrayOutputStreamimport java.io.InputStreamReaderimport java.util.*import java.util.zip.GZIP.. 2024. 7. 6. AWS S3 타계정의 버킷 업로드 시 BucketOwnerFullControl 설정 목차1. 서로 다른 AWS 계정에서 업로드 시 객체 소유권S3 버킷에 파일 객체를 업로드할 때, 버킷 생성 AWS 계정과 동일한 계정이라면 특별한 문제가 발생하지 않습니다. 그러나 다른 계정 간에 S3 버킷에 파일을 업로드하는 경우, 해당 객체에 대한 접근 권한 설정이 복잡해질 수 있습니다.이는 아래와 같은 AWS S3 소유권 정책 때문입니다. 2. AWS 콘솔을 통해 버킷 정책 변경아래와 같이 AWS 콘솔에 접근하여 버킷의 정책을 변경해줍니다.이는 애플리케이션 측에서 bucket-owner-full-control를 설정하여 객체를 업로드할 때해당 객체의 소유자를 버킷 소유자로 합니다. 3. 의존성 추가Springboot에서 S3 업로드 및 조회를 하려면 라이브러리 의존성을 먼저 추가해줘야합니다.//.. 2024. 6. 6. DTO에서 LocalDateTime 유효성 체크와 에러핸들링 방법 이번 포스팅에서는 실무에 많이 사용되는@RequestBody로 선언된 DTO의 LocalDateTime 활용시, 참고 할만한 정보를 소개합니다.목차먼저 제 피씨 환경은 아래와 같습니다.Springboot 3.1.4Java 17Kotlin 1.8.22IntellijLocalDateTime 타입의 날짜 포맷 허용 범위는?아래와 같은 데이터 클래스가 있습니다.data class MemberRequestDto( val id: Long?, val name: String, val email: String, val age: Int, val createdTime: LocalDateTime,) LocalDateTime의 Document를 봅시다.A date-time without a time-.. 2024. 6. 1. JdbcTemplate로 batchUpdate 사용해보기 목차1. BatchHelper 클래스아래와 같이 jdbcTemplate을 인자로하는 헬퍼 클래스를 하나 만들어 줍니다.import org.springframework.jdbc.core.BatchPreparedStatementSetterimport org.springframework.jdbc.core.JdbcTemplateimport java.sql.PreparedStatementobject BatchHelper { fun executeBatchUpdate( jdbcTemplate: JdbcTemplate, sql: String, list: List, setter: (ps: PreparedStatement, i: Int) -> Unit ) { .. 2024. 5. 28. Springbatch에서 메타테이블 없이 실행(Springbatch 5) 외부로부터 대량의 데이터를 가져와 주기적으로 가공 및 저장하는 기능 개발이 필요했습니다. 이에 Springbatch를 사용해서 배치 프로그램을 작성 해보기로 했습니다. 다만, 문제가 있었는데요. 자주 실행 되는 만큼 메타 테이블에 데이터가 너무 많이 쌓인다는 것이었어요. 메타 테이블이란 Springbatch 프레임워크에서 작업의 상태를 추적하고 관리하기 위해 메타데이터를 저장하는 장소입니다. BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_STEP_EXECUTION ... 등으로 구성되어 있습니다. 기본적으로 Job을 실행하면 해당 테이블에 관련 데이터들이 자동으로 생성 및 저장됩니다. 메타테이블을 사용한다면 거기에 따른 장점이 있겠지만 현시점에서 중요도는 떨어져서 메.. 2024. 3. 19. Multi-module에서 Domain 분리하기 Springboot로 API 서버 애플리케이션 등을 개발할 때 Multi-module을 채택 할 수 있습니다. (요즘 핫하다고는 못하겠네요. 주목 받은지 꽤 시간이 흐른듯합니다 ㅎㅎ) 아래와 같은 Multi-module로 된 프로젝트가 있습니다. Front API와 Backoffice API를 개발하다보면 같은 도메인(예: DB Entity 및 Repository)을 사용할 때가 생길 수 있습니다. 중복코드가 많아 질 수 있는 상황입니다. 아래와 같이 Domain 모듈로 분리해주면 좀 더 세련된 코딩을 할 수 있을 것 같습니다. 이번 포스팅에서는 Multi-module에서 Domain(DB 의존성) 모듈을 분리하여 세팅할 때 필요한 작업을 정리해봅니다. 1. 프로젝트 구조 Project의 각 Module.. 2024. 2. 21. Springboot Webflux에서 blocking 감지하기(with BlockHound) 1. BlockHound란? Webflux를 도입하고 로깅 관련 리서치를 하던 중 우연히 blocking을 감지하는 라이브러리가 있다는 것을 알게 되었습니다. 출처: https://stackoverflow.com/questions/63788067/spring-webflux-and-non-blocking-logging-with-log4j2 로깅 관련 Stackoverflow질문의 채택된 답변에서 처음 접하게 되었습니다. BlockHound란 리액티브 애플리케이션에서 Blocking 코드를 감지하고 식별하는 라이브러리입니다. Project Reactor와 호환되며, Blocking 코드를 감지하고 StackTrace를 통해 그 원인을 식별합니다. Project Reactor를 기반으로 하는 Webflux는 .. 2024. 2. 8. 이전 1 2 3 다음 반응형