본문 바로가기

빈수 개발자 개발 일기

(876)
[Spring Batch 에러] Caused by:org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAMEFROM BATCH_JOB_INSTANCEWHERE JOB_NAME = ? and JOB_KEY = ?] Spring Batch 시작 후 어플리케이션 기동 하니 바로 에러 발생했습니다. java.lang.IllegalStateException: Failed to execute CommandLineRunner at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:777) ~[spring-boot-3.1.4.jar:3.1.4] at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:758) ~[spring-boot-3.1.4.jar:3.1.4] at org.springframework.boot.SpringApplication.run(S..
SocketException의 수수께끼: 첫 번째 API 호출에서만 왜 실패할까? ( retrofit java.net.socketexception connection reset ) 우리 프로젝트에 내가 Retrofit 설정을 했는데, 이상한 현상 (?) 이 나타났다. 프론트 개발자분께서 이슈를 전달해주기를 아래와 같이 ... 컴퓨터를 껏다가 키고 최초로 웹 프로젝트를 기동시 아래와 같은 에러가 나요. 근데 2, 3, 4 ... 번째는 이런 에러가 안나요. !!!!!!!!! 😡 참고로 java.net.SocketException: Connection reset by peer 이라는 예외는 네트워크 연결 중에 원격 피어(peer)가 연결을 강제로 닫았음을 나타냅니다. 의심할 수 있는 상황은 아래의 상황들이었습니다. 의심해볼 만한 사항 테스트 결과 원격 서버가 과부하 상태거나 다운되어 있음 개발 서버이고 부하 상태가 전혀 없었기 때문에 제외 네트워크 이슈가 발생하여 데이터 전송이 중단됨..
@RequiredArgsConstructor 와 @Autowired 의 차이점 @RequiredArgsConstructor와 @Autowired는 둘 다 Spring Framework와 관련된 주석(annotations)이지만, 주로 Lombok과 Spring Framework에서 사용되며, 각각의 목적과 작동 방식이 다릅니다. RequiredArgsConstructor (Lombok) 이 주석은 Lombok 라이브러리에서 제공합니다. 클래스 내에 final 또는 @NonNull로 선언된 필드에 대한 생성자를 자동으로 생성해 줍니다. 이렇게 생성된 생성자는 필요한 의존성을 주입 받는 데 사용될 수 있습니다. Spring에서 이 생성자를 사용하여 생성자 기반의 의존성 주입을 할 수 있습니다. @RequiredArgsConstructor public class MyService { p..
로컬에서는 Spring Session, 배포에서는 Redis: 세션 저장소 분리 전략 이슈개발자들이 로컬 환경에서 각각 Redis를 설정하는 것은 번거로운 작업입니다. (아마도 ? web 팀에서는 이러한 결론이 나왔습니다!) 이러한 문제를 해결하기 위해, 로컬 개발 환경에서는 Spring Session Storage를 사용하고, 실제 배포 환경에서는 Redis Session Storage를 사용하는 방법을 채택했습니다. 이렇게 하면 개발자는 로컬에서 별도의 Redis 설정 없이도 작업을 진행할 수 있고, 실제 운영 환경에서는 Redis의 뛰어난 성능과 안정성을 활용할 수 있습니다.  해결 방안Spring의 Profile 기능을 이용해 로컬과 배포 환경에서 세션 저장소를 분리하는 방법을 구현했습니다. /** * dev / prod 환경에서는 Redis Session Storage 를 사용합..
Spring Security에서 Redis를 사용하면서 겪은 SessionRegistry 문제 조건시스템은 중복 로그인이 2회까지 가능합니다.Api pod 는 2개가 실행중입니다. 실패 시나리오 1. Pod A 에 test@com 계정이 로그인을 시도했고 성공했습니다. 2. Pod A 에 test@com 계정이 로그인을 시도했고 성공했습니다. ( 이 때 까지는  중복 로그인이 허용되는 범위입니다. )3. Pod B 에 test@com 계정이 로그인을 시도했고 중복 로그인이 허용되는 범위를 초과했습니다.( 하지만 로그인 성공했습니다. )  이슈Redis 에서 통합적인 session 관리를 하므로 Pod B 에서 시도한 3회차 로그인 시도에서는 중복로그인이 허용되는 범위를 초과했기 때문에 중복 로그인이 실패해야합니다.Pod 2 에서 로그인된 계정을 판단할 때 Pod 1 에 있는 두 개의 계정에 대한 ..
[트러블 슈팅] Headless Service 에 대한 오해 (1) 아래와 같은 설정을 하는 와중에 오해한 부분을 찾았습니다. 고성능을 위한 Redis (High Availability, HA)와 Kubernetes 구축 마스터 가이드 (Spring Session storage 설정까지) 목표 1. Redis k8s 구성 이해 Redis Sentinel 고가용성(High Availability, HA) 클러스터 구성 방식으로 설계하였습니다. Master Redis Server 실제 데이터를 저장하고 처리하는 주 서버입니다. Slave Redis Server Master soobindeveloper8.tistory.com Headless service Headless service는 Kubernetes에서 특별한 유형의 서비스입니다. 일반적인 Kubernetes 서비스는 ..
고성능을 위한 Redis (High Availability, HA)와 Kubernetes 구축 마스터 가이드 (Spring Session storage 설정까지) 목표 1. Redis k8s 구성 이해 Redis Sentinel 고가용성(High Availability, HA) 클러스터 구성 방식으로 설계하였습니다. Master Redis Server 실제 데이터를 저장하고 처리하는 주 서버입니다. Slave Redis Server Master 서버의 데이터를 복제합니다. 이는 고가용성을 높이고 읽기 쿼리의 부하 분산에 사용될 수 있습니다. Sentinel Nodes 클러스터의 상태를 모니터링하고, Master가 다운되면 새로운 Master를 선출하는 등의 작업을 수행합니다. 목표 2. Redis k8s 구축하기 Helm helm 에서 chart 내려 받습니다. helm install lucy3-redis oci://registry-1.docker.io/bitna..
[Spring - Redis] RedisReadOnlyException: READONLY You can't write against a read only replica. Master kill 시 에러 ( master / slave 구조임 ) 에러 내용 ## master 죽였을 때Caused by: io.lettuce.core.RedisReadOnlyException: READONLY You can't write against a read only replica. at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:144) ~[lettuce-core-6.1.10.RELEASE.jar!/:6.1.10.RELEASE] at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:116) ~[lettuce-core-6.1.10.RELE..