Back-End
-
[Spring-kafka] MSA 환경에서 토픽 이름에 맞게 KafkaMessage 역직렬화하여 수신하기Back-End/Kafka 2024. 10. 13. 21:15
개요 Spring-kafka에서, @KafkaListener 를 활용하여 Consumer Record를 수신 하는 방법은 다양하다. 특히, 내가 원하는 메세지포멧에 맞게 serialize 및 deserialize 하는 과정을 잘 설정하여 비즈니스 로직 단에서의 내가 원하는 타입의 dto를 바로 사용하는 것은 생산성 향상에 아주 큰 도움이 된다. 그래서 공식문서와 레퍼런스들을 참고해 가면서 찾아낸 몇 가지 방법들을 소개해보려 한다. 1. KafkaListenerContainerFactory 설정값에서, 내가 원하는 클래스의 deserializer를 직접 설정하기 가장 간단한 방법이다. @Configurationclass KafkaConsumerConfigV1 { @Bean fun ka..
-
Project Reactor와 Spring WebfluxBack-End 2024. 7. 16. 00:05
Project Reactor란? Project Reactor 사이트에서는 다음과 같이 소개가 되어 있다.Reactor is a fourth-generation reactive library, based on the Reactive Streams specification, for building non-blocking applications on the JVM 즉, Java와 같은 JVM 기반 언어 어플리케이션의 반응형 스트림 명세를 구현한 리액티브 프로그래밍 라이브러리이다. 좀 더 자세히 여러 가지 특징을 살펴보면 Project Reactor는 비동기식으로 데이터를 처리하고, 블로킹이 발생하지 않도록 설계되어있다. 이를 통해 높은 처리량과 낮은 대기시간을 유지할 수 있다.데이터 스트림을 손쉽게 생성, ..
-
Spring AOP가 적용된 커스텀 어노테이션 및 Bean 사용 시 유의점Back-End/Spring 2024. 4. 12. 18:11
개요 현재 진행하는 프로젝트에서, 스케줄러를 사용하고자 하였다. 스케줄러를 사용하기 위해서, 다음과 같은 어노테이션을 사용했다. @Configuration과 @EnableScheduling을 통해 해당 클래스를 빈으로 등록 및 스케줄러로써 사용하도록 하고,@EnableRetry를 통해 스케줄러의 실행에 실패했을 때의 재시도 등을 진행할 수 있도록 하였다. 추가로, 다음과 같이 스케줄과 관련된 구체적인 설정들을 메서드에 적용하였다. 이슈 1 하지만, 여러 개의 스케줄러를 구현하다보니 다음과 같은 이슈(또는 고치고 싶은 부분?)가 생기게 되었다. 1. 스케줄러 클래스에 적용된 어노테이션의 갯수가 너무 많음(가독성이 떨어짐)2. 스케줄러의 시작과 끝에 로그를 찍고자 함 따라서, 2가지 이슈를 어떻게 해..
-
분산락을 활용한 동시성 문제 대비하기 (with Redis) - 1Back-End/Redis 2024. 2. 5. 09:26
분산락이란? Redis 공식 문서를 들어가보면, 다음과 같이 설명이 되어있다. Distributed locks are a very useful primitive in many environments where different processes must operate with shared resources in a mutually exclusive way. 즉, 다중 프로세스가 공유 자원에 접근 할 때, 데이터의 결함이 발생하지 않도록 상호 배타적인 방식으로 자원을 이용할 수 있도록 하는 기법이라고 할 수 있다. 자바에서 제공하는 동시성 문제 해결 방안 자바에서는 sychronized 기능을 제공한다. 즉, 멀티스레드 프로세스 환경에서 A스레드가 작업을 진행 하던 중 B스레드에게 제어권이 넘어가고, B ..
-
멀티 모듈 구현 시 발생했던 git 관련 이슈Back-End/Spring 2023. 8. 6. 15:38
문제 N-surfer는 단일 모듈 구조로 이루어져있었다. 하지만 프로젝트에 기능이 추가되면서, 유저의 뱃지 획득과 관련하여 batch 작업을 적용해야 할 필요성이 생겼고 결과적으로 프로젝트 간 엔티티의 정합성을 쉽게 맞출 수 있고, 하나의 레포지토리에서 편리하게 두 프로젝트를 관리할 수 있는 멀티 모듈을 사용하기로 했다. (멀티 모듈이란?? -> https://hudi.blog/why-use-multi-module/ ) 멀티 모듈, 그거 왜 쓰는건데? 🤷 멀티 모듈이란 Java에서 모듈이란 패키지의 한 단계 위의 집합체이며, 독립적으로 배포될 수 있는 코드의 단위를 이야기한다. 멀티 모듈 프로젝트는 상호 연결된 여러개의 모듈로 구성된 프로젝 hudi.blog 따라서, 다음과 같이 프로젝트를 구성하였다. ..
-
Stream을 List로 변환하는 2가지의 방법(Collectors.toList(), Stream.toList())Back-End/Spring 2023. 4. 18. 06:46
개요 사이드 프로젝트에서, 작성한 글에 대한 이미지 업로드 로직에서 이슈가 터지게 되었다. 사진 업로드 기능은 이미지를 업로드 창에 올리거나, 기존의 것을 삭제하거나, 업로드 창에 올린 것을 다시 삭제하는 등 다양한 경우의 수가 있어서 이를 잘 고려해서 설계해야한다. 우리는 2개의 배열을 두어 (업로드 할 이미지, 삭제 될 이미지) 서버로 전달받도록 하였고, 삭제할 이미지는 해당 포스트의 기존에 존재하던 이미지인 경우만 삭제하도록 구현하였다. 문제점 문제는 해당 메서드에서 발생했다. 해당 메서드는 List를 받아 element 1개를 제외한 List를 만들어 반환 해 주는 메서드인데 기존에는 주석처리 된 부분으로 코드 로직을 진행하였다. 하지만 java16 부터 등장한 toList() 메서드는 해당 메서..
-
nGrinder를 활용한 어플리케이션 성능테스트Back-End/Spring 2023. 1. 6. 16:59
nGrinder란? 네이버에서 The grinder라는 오픈소스를 참고하여 자바 언어를 기반으로 개발한 성능 측정 오픈소스이다. nGrinder에서 사용되는 용어들 Controller 부하 테스트를 위한 GUI를 제공한다. 부하 테스트를 모니터링 할 수 있다. Agent Controller가 전달한 script를 기반으로 target 서버에 부하를 발생시킨다. 각 Agent마다 사용 할 Process 및 Thread를 선택할 수 있다. 만약 2개의 프로세스와 4개의 스레드를 사용한다면, agent당 vUser의 수는 8이 된다. nGrinder 공식 위키에 따르면, single 4GB 미만의 메모리 및 2개의 CPU core를 사용한다면 프로세스의 개수를 10개 이하로 사용하기를 권장한다고 한다.(쓰레싱..
-
엔티티의 1:N 관계에서의 QueryDsl fetch Join - (2) 페이지네이션 해결 방법Back-End/Querydsl 2022. 12. 27. 16:00
사실, 이 문제에 대한 해결법에 대해서 많이 구글링을 해 보았지만, 상황에 따라 굉장히 해결법이 다양했다. 그 중에서도 가장 확실하고, 보편적으로 쓰일 만 한 방법을 소개한다. fetch Join + @BatchSize 활용하기 먼저, fetch Join을 통해 ToOne 관계에 있는 모든 entity를 fetch join 한다. ToOne관계의 경우, row수를 증가시키지 않기 때문에 페이징 쿼리에 영향을 주지 않기 때문이다. 이 후, 컬렉션은 지연 로딩으로 조회를 한다. 여기서, 지연 로딩 성능을 최적화하기 위해서 @BatchSize를 사용하게 된다. BatchSize의 경우, 어노테이션을 사용하여 개별로 적용할 수도 있고 application.yml 파일 내에 설정을 통해서 글로벌 적용도 가능하다...