본문 바로가기

개발 이야기/Springboot20

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.
Springboot에서 P6Spy 통해 쿼리 로깅 1. 문제 & 도입 배경 Springboot + JPA를 사용하여 피처를 개발하다보면 실제 DB에 어떤 쿼리가 실행되는지 표시하고 싶을 때가 있습니다. JPA 사용 시 아래와 같이 옵션을 주면 쿼리가 표시됩니다. ## application.yml spring: jpa: properties: hibernate: show_sql: true 아래와 같이 Hibernate: {SQL} 형식으로 표시됨을 확인 할 수 있습니다. 2024-02-03T10:11:16,918 INFO [http-nio-8080-exec-1] o.s.w.s.FrameworkServlet: Completed initialization in 1 ms Hibernate: select tblmember0_.id as id1_1_0_, tblme.. 2024. 2. 3.
Springboot에서 ArchUnit 사용해서 아키텍처 테스트 ArchUnit은 어플리케이션의 아키텍처를 테스트하고 검증하기 위한 라이브러리입니다. https://www.archunit.org/getting-started ArchUnit을 사용하면 코드에서 특정 패키지, 네이밍 규칙 등이 잘 지켜지는지 테스트 해볼 수 있습니다. 예를 들면 아래와 같은 것들 말입니다. 패키지 구조 클래스 의존성 네이밍 어노테이션 ... Spring 개발자라면 아래 그림이 어떤걸 뜻하는지 한 눈에 알아볼 수 있습니다. 마치 관성처럼 아래와 같이 개발을 할 것입니다. +-------------------------+ +-----------------+ +-----------------+ | Controller | ----> | Service | ----> | Repository | | .. 2024. 1. 27.
Springboot에서 AWS SQS 사용 (with Kotlin) Springboot 버전별로 AWS SDK 버전을 잘 선택해야 합니다. 아래 캡쳐에 따라 그에 맞는 버전을 사용합니다. - 참고: https://github.com/awspring/spring-cloud-aws 이번 포스팅에서는 AWS의 SQS(Simple Queue Service)를 Springboot에서 사용하는 방법을 기술합니다. 로컬 환경은 아래와 같습니다. JDK 17 Kotlin 1.8.22 Springboot 3.1.4 SpringCloudAws 3.0.4 1. 의존성 추가 dependencies { implementation("org.springframework.boot:spring-boot-starter-webflux:3.1.4") ...(중략) implementation(platform.. 2024. 1. 18.
Testcontainers로 테스트 코드 만들기 2(with Kotlin) 앞서 Java로 작성했던 Testcontainers로 테스트 코드 만들기를 Kotlin으로도 작성해봅시다. 이번에는 Mysql이 아닌 Redis를 사용한다고 가정합니다. 또한 Webflux 기반 테스트 환경 구축방법에 대해 포스팅합니다. 로컬환경은 아래와 같습니다. Windows 10 JDK 17 Kotlin 1.8 Springboot 3.1.4 Testcontainers 1.17.7 1. 의존성 추가 아래와 같이 build.gradle.kts에 의존성을 추가해줍니다. /* build.gradle.kts */ dependencies { ...(중략) testImplementation("io.mockk:mockk:1.10.4") testImplementation("org.junit.jupiter:junit.. 2024. 1. 18.
Testcontainers로 테스트 코드 만들기 좋은 테스트 코드는 제품을 더욱 신뢰성 있고 견고하게 만듭니다. 주목할 점은 '좋은' 테스트 코드일 것입니다. 잘못 작성 된 테스트 코드는 되려 해로울 수 있습니다. '좋은' 테스트 코드는 일반적으로 아래와 같은 특징을 가집니다. 리팩터링 시, 테스트 코드는 수정되지 않음 버그 수정 시, 테스트 코드는 수정되지 않음 테스트 코드 내에 조건문, 순환문은 없음 메서드 보다는 행위를 테스트 딱히 실행할수 없는 상황이 아니라면 실제 의존성을 끊지 않도록 함 여기서 "딱히 실행할수 없는 상황이 아니라면 실제 의존성을 끊지 않도록 함"에 주목 해봅니다. 대부분 Springboot를 통해 Web Application 만들 때에는 데이터를 보관할 DB를 사용하게 될 것입니다. DB는 Web Application 입장에.. 2024. 1. 7.
Springboot Application 로드 시 외부 파일 읽기 & 환경 설정 Springboot는 application.yml을 통해 환경 설정을 관리합니다. 아래와 같은 코드는 흔히 접할 수 있습니다. server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/testdb username: password: driver-class-name: com.mysql.cj.jdbc.Driver jpa: database: mysql database-platform: org.hibernate.dialect.MySQL5InnoDBDialect - src/resources/application.yml 만약 데이터베이스의 Username / Password를 소스코드 상에 입력하여 관리한다면 심각한 보안 문제를 야기합니다. 이.. 2024. 1. 7.
Springboot에서 ResourceTransformer 적용하여 뷰 페이지 렌더링 Springboot로 모놀리틱한 서비스(프론트+백엔드)를 구성하려고 할때 아래와 같은 코드는 정석적인 방법은 아닐 것 입니다. 아마도 보통은 Thymeleaf와 같은 뷰 템플릿 엔진 기술을 사용할 것입니다. 다음에 소개할 내용은 JSP나 Thymeleaf 사용 없이 순수 html,js,css 등을 렌더링 할 때 직면하는 문제 중 하나를 다룹니다. Springboot로 정적 리소스를 렌더링 할 때 아래와 같이 WebMvc 관련 설정을 해주면 됩니다. @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry.. 2024. 1. 7.
[Kotlin] Spring Batch를 사용한 배치 애플리케이션 작성 언젠가 한번은 만나게 될 Spring batch라고 생각했습니다. 그간 배치 기능은 Crontab + Nodejs 또는 CI/CD 도구 + Python Script로 작성 해왔었고, 레거시 시스템에서는 Spring에서 제공하는 Scheduler를 사용해 배치 기능을 개발 했었습니다. 최근 새로운 배치 애플리케이션을 만들 일이 생겨 스프링 배치를 학습하고, Kotlin + Spring batch 애플리케이션을 작성하는 방법에 대해서 정리합니다. 01. 기본 개념 Job: Spring batch의 가장 큰 작업의 단위이며, 실행의 단위가 됩니다. Step: Job안에 속하게 되는 작업으로 하나의 Job은 1개 이상의 Step으로 구성 될 수 있습니다. Tasklet: Step안에 속하는 작업입니다. 아래 그.. 2021. 4. 5.
[Kotlin] Springboot, Mock을 활용한 유닛 테스트(feat. Method Stub) Springboot 기반의 애플리케이션을 개발할 때, 주로 JUnit으로 테스트 코드를 작성하게 될겁니다. (Springboot 2.2 버전 이후 부터는 JUnit 4가 아닌 5버전을 디폴트로 사용하게 됩니다.) 자바 개발자의 대다수가 JUnit을 사용해 테스트를 하기 때문에 기본적인 사용법에 대해선 너무나 잘 알려져 있기도 합니다. JUnit은 다음과 같은 Annotation을 제공합니다. @SpringBootTest : Spring이 기본적으로 사용하는 의존성 추가 해줌( + JUnit 5에서는 추가해주지 않아도 된다고하네요.) @Test : 테스트 메서드 수행 @BeforeAll : 각 테스트 메서드들 수행 전 실행 @Mock : 더미객체를 만듬 etc... 그리고 Assertion을 통해서 작성한.. 2021. 2. 27.