전체 글

·FRAMEWORK/Spring
배경SpringBatch를 구현하면서, 아래와 같은 에러를 마주쳤다. WARN 87663 --- [] [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 25S03ERROR 87663 --- [] [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : (conn=3681042) Communications link failure with primary host XXX. unexpected end of stream, read 0 bytes from 4 (socket was closed by server)ERROR 87663 --- [] [ ..
·DB/Redis
Cluster Mode Disabled vs Enabled 차이가장 큰 차이는 데이터의 분산 저장 여부와 확장성이다. Cluster Mode DisabledCluster Mode Enabled구조하나의 Master(Primary)가 모든 데이터를 가지고 있고, Replica는 그 데이터를 그대로 복제만 함데이터를 여러 개의 샤드(Shard)로 쪼개서 저장함. 각 샤드마다 Master-Replica 세트가 존재함용량 제한Master 노드 1대의 메모리 용량이 곧 전체 Redis의 한계노드를 추가할 수록 메모리 용량이 늘어남주소 체계Primary Endpoint(쓰기/읽기)와 Reader Endpoint(읽기) 각각 제공개별 노드 주소가 아닌 클러스터 상태 관리하는 configuration endpoint ..
·DB/Redis
[INFO] Unable to connect to X.X.X.X/:6379Redis로 ElastiCache를 사용할 때, 위와 같은 내부망 주소가 적힌 INFO 로그가 발생한다면, RedisStandaloneConfiguration 대신 RedisStaticMasterReplicaConfiguration을 사용해야 합니다. 참고spring docs - Write to Master, Read from Replica
·FRAMEWORK/Spring
배경신규 프로젝트에 배치를 구성하고 젠킨스를 통해 실행 시, 에러가 던져져서 실패로 배치가 끝났음에도 마치 성공인 것처럼 보여졌습니다.원인Spring Batch에서 BATCH_JOB_EXECUTION 테이블에는 EXIT_CODE가 FAILED인데, 배치 애플리케이션 실행 후에 exit code 0으로 남는다면 이는 프레임워크가 인지하는 '시스템 상태'와 개발자가 정의한 '종료 코드'간 불일치가 발생한 것입니다. Spring Boot는 기본적으로 애플리케이션 실행 중 예외가 발생해 터지지 않는 한, 프로세스가 정상 종료되었다고 판단하여 Exit Code를 0으로 반환합니다.Spring Batch 작업이 내부적으로 FAILED 되더라도, Spring Boot 입장에서는 "배치 작업은 내부에서 에러가 났지만 ..
sealed class 개념 정리일반적인 부모 class를 자식 class에서 상속할 경우, 컴파일러는 해당 부모 class를 상속 받은 자식 class가 누구누구인지 알 수 없다.예를 들어, 아래와 같이 결과값(Result)을 클래스로 만들면, 아래와 같이 성공, 실패 각 종류에 따라 클래스가 생성될 수 있다.abstract class Resultdata class Success(val data: String) : Result()data class Failure(val error: Throwable) : Result() 이때, 각 Result별로 상태 메시지를 얻고 싶다고 하면, 아래와 같이 함수를 작성할 수 있는데 이때, when절에 Result를 직접 넣어도 else 구문을 넣지 않으면 compil..
·DB/Redis
AWS ElastiCache를 구축할 때 Cluster Mode 활성화 여부는 주로 데이터 규모와 확장성에 따라 결정됩니다.구분Standalone (클러스터 모드 비활성화)Cluster Mode (클러스터 모드 활성화)데이터 분산모든 데이터가 단일 노드(Primary)에 저장데이터를 여러 샤드(Shard)에 분산 저장쓰기 확장수직 확장(scale-up)만 가능수평 확장(scale-out) 가능 (샤드 추가)읽기 확장읽기 복제본(replica) 추가 (최대 5개)각 샤드별 복제본 추가 가능최대 용량선택한 노드 타입의 메모리 용량으로 제한수백 테라바이트까지 확장 가능관리 복잡도낮음보통 (클러스터 지원 라이브러리 필요)- 작게 시작하고 싶고, 데이터가 몇십 GB 수준인 경우 → Standalone을 사용- 초..
·FRAMEWORK/Spring
Blocking I/O + 멀티스레딩과 Non-Blocking I/O와 겉보기에 비슷하게 동작할 뿐, 내부 메커니즘과 효율성 측면에서는 완전히 다릅니다.Blocking I/O + 멀티스레딩 VS Non-Blocking I/OBlocking I/O + 멀티스레딩 (병렬처리)이 방식은 식당에서 손님이 올 때마다 전담 직원을 한 명씩 새로 고용하는 것과 같습니다.작동 방식:하나의 스레드가 I/O(데이터 읽기/쓰기)를 요청하면, 그 데이터가 올 때까지 그 스레드는 아무것도 하지 못하고 멈춰(Blocking)있습니다.대신 다른 스레드를 새로 만들어서 다른 일을 처리하므로 전체적으로는 여러 일을 동시에 하는 것처럼 보입니다.단점:손님(요청)이 1,000명이면 직원(스레드)도 1,000명이 필요합니다.스레드는 생성될..
·FRAMEWORK/Spring
Spring WebFluxSpring WebFlux 탄생 배경Spring WebFlux는 리액티브 웹 어플리케이션을 위해 Spring 5.0부터 지원하는 리액티브 웹 프레임워크입니다. 기존에 사용하던 Spring MVC 모델은 서블릿 기반의 Blocking I/O 방식이라 하나의 요청을 처리하기 위해 하나의 스레드를 사용하고 해당 스레드의 작업이 끝나기 전까지 스레드가 차단됩니다.기술이 발전함에 따라 대량의 요청 트래픽을 Spring MVC 방식이 처리하지 못하는 상황이 생김에 따라 적은 수의 스레드로 많은 요청을 처리할 수 있는 비동기 Non-Blocking I/O 방식의 Spring WebFlux가 등장했습니다.Spring WebFlux 프로그래밍 모델WebFlux는 기존 Spring MVC와 유사한..
EARTH_ROOPRETELCHAM
ROOPRETELCHAM