본문 바로가기

전체 글87

Java 23 : Structured Concurrency 개요Structured Concurrency는 서로 다른 스레드에서 실행되는 관련된 작업 그룹을 하나의 작업 단위로 처리하여 오류 처리와 작업 취소를 간소화하고, 안정성을 향상하며, 관찰성을 강화하는 방식이다. Java에서는 Structured concurrency를 위한 API를 도입하여 동시성 프로그래밍을 간소화함을 목표로 한다. Kotlin에서는 코루틴 구문을 사용하여 Structured Concurrency(구조적 동시성)을 지원하지만 자바에서는 아직 Preview 상태이고 Java 23에서도 아직 Preview 상태다. 하지만 이후 버전에서는 정식 기능으로 나오기를 희망한다. Motivation개발자는 task를 여러 개의 subtask로 나눠서 복잡성을 관리한다. 일반적인 단일 스레드 코드에서.. 2024. 9. 28.
[Kotlin] REST Assured로 통합 테스트 작성하기 개요Java 프로젝트에서 자주 사용하던 REST Assured(https://rest-assured.io/)를 사용하여 Kotlin 프로젝트에서요 실제 API를 호출하는 Integraion Test를 작성한다 Java REST Assured 참고 : https://blog.igooo.org/119  Why Kotlin?Java Java로 Junit 테스트를 작성하는 경우 여러 줄의 검증 코드가 있을 때 특정줄의 검증 코드에서 오류가 발생하면 아래 검증 코드는 실행되지 않고 사용자에게 오류 라인수를 리포팅해 준다.......then(). statusCode(200). body("size", is(3)). body("name.any { it == 'Ervin Howell' }", is(tru.. 2024. 9. 25.
[Spring] Rest service with Hexagonal architecture 개요Hexagonal Architecture의 아이디어는 입력과 출력을 시스템 아키텍처의 가장자리에 두는 것이다. 또한 비즈니스 로직은 어떤 형태의 API를(REST, GraphQL API,...) 제공하는지 여부에 따라 달라져서는 안 되며, 변경이 가능한 경우는 비즈니스 로직이 변경된 경우에만 변경이 가능하다. 또한 서비스에서 필요한 데이터를 Database, 마이크로 서비스 API 또는 CSV 파일 등 어디서 가져오는지에 따라 비즈니스 로직이 변경되지 않아야 한다.위 패턴을 사용하면 애플리케이션의 핵심 로직을 외부 환경으로부터 격리할 수 있고, 핵심 로직을 격리하면 코드 베이스에 큰 영향을 주거나 주요 코드를 다시 작성하지 않고도 Data Source를 쉽게 변경할 수 있다.경계를 명확히 구분하면 주.. 2024. 9. 22.
[Spring] @Async와 Virtual Thread 개요Java 21에 Virtual Thread와 Spring @Async 어노테이션을 조합하여 비동기 프로그래밍 방법을 알아본다. Spring @Async@Async 어노테이션을 Spring의 AOP를 사용하여 비동기 메서드 실행을 제공한다.@Async는 기본적으로 AOP로 실행되며 Proxy Parttern의 한계점을 가진다.public 메서드로만 사용가능self-invocation 불가메서드 리턴 타입은 void로 설정하거나, Future / ListenableFuture / CompletableFuture로 설정하여 비동기 처리를 할 수 있다.void 리턴 타압의 경우 Exception 처리를 위하여 AsyncUncaughtExceptionHandler를 사용하여 처리할 수 있다. 프로젝트 구조HT.. 2024. 9. 14.
[Spring Batch] On K8S with Jenkins 개요배치 작업이 필요한 서비스에 대하여 Spring Batch를 사용하여 배치 프로그램을 자주 개발하는데 배치 작업 특성상 실행 주기가 짧거나 오랜 시간 동안 실행되며 자원을(Network, CPU) 많이 사용하는 경우가 많다. VM 서버를 사용하여 배치 작업을 구성하는 경우 배치를 실행하지 않는 경우에는 사용하지 않는 리소스를 낭비하게 되고, 동시에 많은 배치를 실행해야 하는 경우에는 리소스가 부족하여 배치를 실행하지 못하는 경우가 발생할 수 있다.K8S를 사용하면 위에 단점들을 극복할 수 있는데 Spring Batch를 K8S에서 사용하는 방법에 대하여 알아본다.Spring BatchKubernates JobsSpring Batch on Kubernates Spring Batch간단한  Spring .. 2024. 9. 12.
[Spring Boot] Virtual Threads vs Reactive vs Kotlin Coroutines 성능 비교 개요Spring Boot의 Java 21의 Virtual Thread, Spring Reactive, Kotlin Coroutiones를 사용한 API 서버를 구현하고 각각의 프로젝트의 성능 테스트를 진행하여 성능을 비교한다. 테스트 방법Spring Reactive로 임의의 지연을(30ms) 추가한 API를 3번씩 호출하고, 3번의 호출결과를 모두 합하여 응답하는 API 서버를 Virtual Thread, Spring Reactive, Kotlin Coroutiones, Blocking 3개의 프로젝트로 만들어 성능 테스트한다. /delay/v1.0/api                 Virtual Thread(30ms 지연)                           Spring Reactive .. 2024. 9. 10.
Spring Boot + vue, react 환경 구성 개요Spring Boot와 Front-end를(vue, react) 하나의 프로젝트로 구성하여 배포하는 방법에 대하여 알아본다. PrerequisitesNode.js 설치사용할 Node.js 버전에 맞게 설치해 준다.Node.js : https://nodejs.org/en Spring Boot 3.x 프로젝트 생성Spring Web Starter를 사용하여 프로젝트를 생성한다.build.gradle 파일plugins { id 'java' id 'org.springframework.boot' version '3.3.3' id 'io.spring.dependency-management' version '1.1.6'}group = 'org.igooo'version = '0.0.1-SNAPSHOT'java { .. 2024. 9. 5.
[Spring] Data Commons Auditing MongoDB 개요Spring Data는 엔티티를 만든 사람이나 변경한 사람, 변경이 발생한 시점을 추적하기 위한 Auditing 기능을 제공한다. Spring Data의 Auditing 기능을 사용하면 Entity 변경 데이터에 대하여 별도의 코드를 작성하지 않아도 Spring Data에서 해당 데이터를 추가해 준다. Example게시글을 저장하는 간단한 web application을 작성하여 Auditing 기능을 살펴본다. EntitySpring Data에서는 @CreatedBy, @CreatedDate, @LastModifiedBy, @LastModifiedDate 어노테이션을 제공한다. 시간 Type은 사용하려는 타입에 맞춰서 변경 가능하다.@Document("artices")public class Artic.. 2024. 8. 26.
[Spring Batch] - AbstractPagingItemReader 조심하기 개요Spring Batch 데이터 수집 중 보통은 ItemReader에서 데이터를 조작하는 작업을 하지 않지만 특수한 케이스에서 페이징 한 데이터를 기반으로 추가로 데이터를 수집해야 하는 경우(join이 불가능하거나...) AbstractPagingItemReader를 구현한 객체를 사용하는데 이때 주의해서 사용할 점에 대하여 정리한다. PagingItemReader 동작 방식AbstractPagingItemReader의 맴벼 변수(protected volaatitle List results)는  AbstractPagingItemReader의 doRead() 메서드에서 AbstractPagingItemReader를 상속하는 구현체의 doReadPage()의 호출 결과로 값이 정해진다. PagingItem.. 2024. 8. 21.