본문 바로가기
728x90

분류 전체보기62

[Kafka] Consumer Group 삭제하기 Consumer를 개발서버에서 테스트하며 생성했던 현재는 불필요한 Consumer Group 정리를 진행하였습니다. 개발서버에서 Kafka Consumer의 Group을 삭제하기 위해 명령어를 입력했더니 다음과 같은 에러 메세지와 함께 실패하였습니다.Kafka Consumer group 삭제 명령어 & Error message./kafka-consumer-groups.sh --bootstrap-server {ip}:{port} --delete --group {group-name}Error: Deletion of some consumer groups failed:* Group '{group-name}' could not be deleted due to: java.util.concurrent.Executio.. 2024. 5. 7.
RecoverableDataAccessException 해결한 경험 1. 들어가며 어느 순간부터 특정 배치 스케줄러가 돌면 RecoverableDataAccessException이 발생하기 시작하였다. RecoverableDataAccessException은 JDBC 커밋 도중에 문제가 있을 경우 예외를 발생시킨다. 커넥션을 반환해줄때 이미 끊어져버린 커넥션을 사용하도록 반환해주어 DB와 통신하지 못했기 때문에 발생한다고 한다. 그럼 해당 Exception을 해결해보자. 2. 소스 분석하기 먼저, 다음 1시간 동안 배치가 도는 예시 소스이다. 아래 예시 소스를 보면서 문제가 될만한 부분이 있는지 생각해보자. # Controller@PostMapping("/batch/example")public ResponseEntity> fetchExample( @Reque.. 2024. 4. 28.
객체 지향 5원칙을 준수하여 리팩토링 하기 (with. Kafka Consumer) 23년도 회고에서 언급했던 Kafka Consumer를 리팩토링하며 새로 개발한 경험에 대해 포스팅 해보자. 먼저 글을 작성하기 전에 이번 Consumer 개발 당시 매우 많은 도움을 주신, 저를 성장할 수 있게 해주신 같은팀 대리님께 감사드립니다! 😌 해당 포스팅에서는 Consumer에 OCP(Open Closed Principle)를 만족하기 위한 팩토리 메서드 패턴 적용, ThreadSafe 보장을 synchronized 대신하는 방법 적용, 동시에 요청이 들어올 경우 메모리 경합을 줄여준 방법에 대해 기술하였습니다. 1. 들어가며 이번에 영상 광고 송출 서비스를 새로 시작하게 되며 프로젝트 일정 상 기존에 담당한 동료 개발자분들이 통계 파트까지 개발하기에는 힘든 상황이었습니다. 제가 급히 프로젝트.. 2024. 3. 16.
2023년 회고 및 앞으로의 계획 조금 늦은감이 있지만 23년도를 회고해보자. 글은 길지 않고 딱 할 말만 작성해보자.. 1. 서비스 회사로 이직 23년도에는 자사 서비스를 개발하는 경험을 하기 위해 이직을 결심했다. 결국 6월에 온라인 광고 플랫폼 회사로 이직할 수 있었고 결론부터 말하자면 이직에 대한 만족도는 높은 편이었다. 가장 큰 이유는 경험해보지 못해본 기술을 사용하여 개발할 수 있었고, 나의 개발 능력이 꾸준하게 성장하는데 많은 도움이 되고 있다. 2. 강의 수강 출퇴근 시간 혹은 퇴근 이후 시간에 공부한 내용을 정리해보았다. 2월 : 자바 ORM 표준 JPA 프로그래밍 - 기본편 4월 : 스프링 시큐리티 (이직 전 회사 동료분과 스터디) 5월 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 6월 .. 2024. 1. 30.
[Spring Security] SecurityContextHolder와 Authentication 알아보기 스프링 시큐리티 아키텍쳐 스프링 시큐리티 아키텍쳐가 복잡하고 쉽지 않다. 부분별로 살펴보고 전체 그림을 맞춰본다 - (Divide and Conquer) SecurityContextHolder와 Authentication 위와 같이 Authentication객체 안에서 principal를 담고 SecurityContext으로 감싸고 한번 더 SecurityContextHolder로 감싼 구조이다. SecurityContextHolder : Authentication를 SecurityContext로 담고 있는 객체 SecurityContext : Authentication을 담고 있는 객체 Authentication : principal, authorities, credentials을 담고 있는 객체 pr.. 2023. 4. 19.
[다시 공부하는 Java] Stream API 개요 '아는 만큼 보인다' 라는 말을 Java와 Spring을 다시 공부하면서 매우 공감했다. 처음 습득하는 지식은 이해도 쉽지 않고 기억에 남기 어렵다. 하지만 여러번 반복해서 접하다보면 '이게 그때 그 말이었구나' 하고 깨닫게 된다. 그래서 내가 놓치고 있고 부족한 부분을 채우기 위해 다시 Java와 Spring을 공부하기 시작했다. 오늘 주인공은 Stream이다. Java 8부터 람다식, 함수형 인터페이스 등을 지원하면서 데이터를 처리하는데 자주 사용되는 함수들을 추상화한 Stream부터 복습해보자. Stream 개념 Stream이란, Collection의 담겨진 요소들을 하나씩 람다식을 수행하는 일회성 반복자이다. 소개한 그대로 Stream의 내부 메서드를 통해 반복적인 일처리가 가능하며 일회성이.. 2023. 4. 18.
메모리 누수 분석 및 개선 경험 개요 클라우드 서비스 어플리케이션 개발하면서 같은 페이지를 반복해서 이동할 경우 Detached HTML 요소들이 쌓여 Heap과 node가 증가하고 줄어들지 않는 현상을 발견하였다. 한마디로 메모리 누수가 발생하여 프로파일링을 통해 개선시킨 경험을 글로 정리하게 되었습니다. 메모리 누수가 발생할 수 있는 범위가 방대하고 누수가 발생한 객체나 DOM 요소가 프로파일링과 스냅샷을 사용해도 명확히 표시되는 것이 아니라 소스 분석을 통해 많은 정보를 수집해야 했습니다. 이 글에서는 프로파일링 방법과 개선 방법에 대해 다루겠습니다. 메모리 누수 메모리 누수란 더 이상 사용하지 않는 메모리가 반환되지 않고 계속 남아 있는 현상으로 브라우저에서는 GC(가비지 컬렉터)가 동작했음에도 불구하고 남아있는 메모리가 남아있.. 2023. 4. 10.
프로젝트에 Vue.js를 적용한 경험 개요 프로젝트 소스 중 문자열을 가지고 화면을 그리던 레거시 소스를 발견하여 직접 DOM을 조작하지 않고 화면을 구성하도록 Vue.js를 입혀 3300라인을 900라인으로 줄였다. 해당 경험을 간단히 정리해보았다. 화면 요구 사항 상품 리스트의 각 상품 정보가 다르다. 상품 리스트에 있는 상품 상태에 따라 뱃지가 달라져야 한다. 상품 케이스에 따라 버튼 UI가 다르다. 변경 전 소스 script에서 각 상품별 정보를 DOM에 문자열을 직접 수정한다. 상품 리스트 소스 중 스크립트 일부 ... if(contentItem.linkCd == 'APP_MN_KD30'){ content += '' var cnt = 0; if(item.newLaunched == 1 && cnt = 100) ? '' : '' con.. 2023. 4. 3.
Spring boot에 Swagger 적용하기 개요 API 인터페이스 관리는 스펙이 변할때 마다 일일이 수정하게 되면 생각보다 많은 비용이 드는데 Swagger를 이용하면 불필요한 비용을 줄일 수 있도록 API 문서화를 도와 단순하게 관리할 수 있다. 여기서 Swagge란, OAS(Open Api Specification)를 위한 프레임워크로 API 문서 자동화 및 테스트 기능이 있다. Swagger 적용 방법 우리는 많이 사용되는 Springfox를 이용해 swagger를 적용할 것이다. 프로젝트 버전 java : 11 spring-boot : 2.7.9 springfox-swagger : 3.0.0 1. 의존성 추가 dependencies{ implementation 'io.springfox:springfox-boot-starter:3.0.0' .. 2023. 3. 31.
728x90