전체 글
-
[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 ..
-
2023년 회고록 - 1Etc/Diary 2023. 8. 16. 15:36
입사를 한 지도 어느덧 1년 반이 지났다. 올해의 반이 넘게 지난 시점에, 어느 정도 머릿속을 정리해야 할 필요를 느껴서 휴가를 3일동안 내게 되었고, 중간 정산(?)겸 회고록을 적고자 한다. 올해 초에는, 우리 팀의 핵심적인 역할을 맡던 분이 퇴사를 하셔서 그 분의 역할을 나와 다른 팀원이 나눠 갖게 되었다. 당시에는 그 분의 역할이 워낙 중추적이기도 했고, 또 고작 입사 1년만에 팀 내 최고참이 되어서 굉장히 멘붕이었다. 하지만 사내 클라우드 시스템을 만지면서 쿠버네티스에 대한 대략적인 경험도 할 수 있었고, Jenkins를 활용한 CI/CD도 인수인계 받아 스크립트를 분석하고, 프로젝트 진행 현황에 맞게 커스텀도 진행하면서 어려웠지만 매우 즐거운 경험이었고, 성장할 수 있었다. 4월에는 본부 차원에..
-
멀티 모듈 구현 시 발생했던 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개 이하로 사용하기를 권장한다고 한다.(쓰레싱..