본문 바로가기
728x90

개발31

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.
[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.
Spring security + JWT 구현 방식 개요 사이드 프로젝트를 진행하면서 사용자 API를 개발할때 Spring Security를 적용해 보고자 소스 분석 및 개발을 진행하며 글로 정리하게 되었다. 예제 소스는 여기(github)에서 확인 가능하다. Spring security 역할 Spring security는 filter을 통해 인증(Authenticatio)과 권한(Authorization)을 확인한다. Filter 개념 Spring Security를 적용하기에 앞서 filter를 알아야 이해와 적용이 쉬울 것이다. 아마 처음 프로젝트를 개발하는 개발자들에게 filter에 대한 개념이 없었을 수도 있다. (필자도 그랬다) filter는 클라이언트 요청에 대해 사전에 걸러낼 수 있는 역할을 수행하며 요청(Request)와 응답(Respons.. 2023. 3. 29.
if문 제거하기 코드를 작성할때 항상 클린코드로 작성하기 위해 고민을 했다면 한번 쯤은 고려해볼만한 작업이다. 이번에는 객체 기반 언어인 자바스크립트에서 가독성을 높이기 위해 if문을 객체의 리터럴로 표현해보자. (다양한 객체 생성 방식 중 객체 리터럴이란, 하나 이상의 속성과 속성값들을 중괄호{}를 사용하여 하나의 객체로 표현한 방식) 예제 소스 1 function executeApp(name) { if(name === "CALL"){ return "전화 앱 실행" }else if(name === "CAMERA"){ return "카메라 앱 실행" }else if(name === "MESSAGE"){ return "문자 앱 실행" }else if(name === "MUSIC"){ return "음악 앱 실행" } } .. 2022. 11. 14.
728x90