본문 바로가기

빈수 개발자 개발 일기

(876)
Spring Boot vs Fluentd vs ElasticSearch ✨ 구성 요소 Spring Boot Pods 여기서 실행되는 애플리케이션 로그를 생성합니다. DaemonSet Fluentd Kubernetes 클러스터의 각 노드에 Fluentd를 실행하여 로그를 수집합니다. 이는 각 노드에 자동으로 배포되어 노드에 생성된 로그를 수집하는 역할을 합니다. 로그 전송 Fluentd는 수집한 로그를 Elasticsearch로 전송합니다. Elasticsearch Fluentd로부터 수신한 로그 데이터를 저장하고 인덱싱하여 검색이 가능하게 만듭니다. LogStash 와 Fluentd 중에서 Fluentd 를 선택한 이유 경량성 Fluentd는 Ruby와 C로 작성되어 있어 리소스 사용이 더 효율적일 수 있습니다. 반면, Logstash는 JRuby로 작성되었고 JVM 위에서 실..
Spring 환경에서 프로파일 별 효율적 코드 관리 전략 안녕하세요, 여러분! 오늘은 Spring 환경에서 프로파일(Profile)을 활용하여 코드를 효율적으로 관리하는 전략에 대해 이야기하려 합니다. 특히, 코드 유틸리티 클래스를 활용하여 다양한 환경(로컬, 프로덕션 등)에 맞게 유연하게 설정을 관리하는 방법을 중점적으로 다룰 것입니다. 공통적인 내용의 중앙화 개발 과정에서 중복되는 코드 관리는 큰 골칫거리가 될 수 있습니다. 이를 해결하기 위해 CodeUtils라는 추상 클래스를 정의했습니다. 이 클래스는 공통적으로 사용되는 코드 목록(initCodeList)을 정의하고, 실제 코드를 조회하는 getCode 메소드를 추상 메소드로 선언함으로써, 구체적인 구현을 상속받는 클래스에 위임합니다. @Component public abstract class Code..
Docker / k8s 환경에서 cookie (JSESSIONID) 가 발급되지 않았을 때 해결 방법 ( server.xml Alias 추가로 해결 ) 기존에 일반 서버에서 관리되던 웹을 k8s 에 업로드 해야하는 일이 생겼습니다. 대상 프로젝트는 Spring Core 프로젝트로써 Spring Boot 기반 프로젝트 들과 쿠키 설정하는 방식도 달랐습니다. 문제 1 로그인 관리를 JSESSIONID 쿠키를 사용하여 관리를 하는데, JESSEIONID 가 발급되지 않는다 (?) Api 요청은 정상적으로 이뤄지나 쿠키 발급이 되지 않았다. 정리 1 프로세스들을 아래와 같이 정리해봤습니다. 각각의 파드가 로딩 될 때는 localhost 로 로딩이 되어야 합니다. ( 외장 톰캣이므로 server.xml 에 host 를 적어줘야함 ) 후에 생성된 pod 들에게 접근 할 수 있는 service 를 생성하고 istio 를 이용해 service 에 접근할 수 있는데 이..
클래스 변경과 직렬화: Spring Redis 환경에서의 serialVersionUID 관리 k8s depolyment 의 이미지 버전을 업그레이드 시키니 이런 에러가 발생했습니다. org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: co..
java.lang.IllegalArgumentException: Attempting to write a row[2] in the range [0,3] that is already written to disk. 잘 돌아가던 액셀 데몬이 오늘은 에러가 나면서 동작하지 않았습니다. ( 매우당황 ) 처음에 발생한 에러는 NullException 이었습니다. row = sheet.getRow(rowLocation); 그래서 혹시 null 이면 row 생성하라는 로직을 추가했습니다. row = sheet.getRow(rowLocation); if (row == null) { row = sheet.createRow(rowLocation); } 그랬더니 생전 처음보는 에러가 났습니다. java.lang.IllegalArgumentException: Attempting to write a row[2] in the range [0,3] that is already written to disk. 아래와 같은 방법으로 해결했습니다..
[SQLNonTransientConnectionException] Could not create connection to database server. Attempted reconnect 3 times. Giving up. 다중 db 를 연결하는 스프링 부트 프로젝트인데 db 정보를 3 개까지 연결할 때는 아무런 이상 없이 잘 도착했습니다. 근데 네번째 db 를 연결하는 순간 아래와 같은 에러가 발생했습니다. java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. ... The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. ... org.springframework.tr..
Spring Batch 로 대용량 일괄처리하기. (대용량 데이터 조회 > 액셀 생성 > 메일 발송) 이슈 Web 에서 대용량 액셀을 생성하는 로직이 있었는데 응답 시간이 지연이 되어 에러가 발생하는 이슈에 부딫쳤습니다. 대안으로 java daemon 을 활용하라는 이야기가 있었지만 (?) 사실 써보고 싶기도 했던 Spring Batch 에 도전해보게 되었습니다 ! 하하하 ... Spring Batch 를 처음 사용해보니 Spring Batch 에 대해 뭔지 알아봐야 했습니다. Spring Batch는 대량의 데이터 처리를 위한 경량화된 프레임워크로, 반복적인 작업을 수행하는 일괄 처리(Batch Processing) 작업을 효율적으로 처리할 수 있는 기능을 제공합니다. 제가 하려고 하는 업무에 딱 ! 이라는 생각이 들어서 Batch 로 프로세스 개발을 시작해보겠습니다. ( 자기 합리화가 시작 .. ? ..
Spring Batch 처음 실행해봅니다. 👨‍💻 ( 완전 간단 예제 ) 전체 코드 입니다. package com.rsn.dic.RsnDictionaryBatch.datamailsend; import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.launch.JobLauncher; ..