반응형

web/Spring

    lettuce pipeline코드 사용시 커넥션 풀 사용 필요

    lettuce를 사용해서 레디스를 사용을 하고 있었는데 어느날 갑자기 아래처럼 레디스 커넥션을 못잡는 이슈가 발생했다.org.springframework.data.redis.RedisSystemException: Redis exception; nested exception is io.lettuce.core.RedisException: Master is currently unknown: [RedisMasterReplicaNode [redisURI=redis://xxx.xxx.com?timeout=20s, role=REPLICA]] 처음에는 aws 레디스쪽 이슈일것으로 의심했으나 레디스쪽에는 별다른 지표가 없었고 애플리케이션에서 커넥션을 사용하지 못하는 것 같았다. 이번에 배포 하면서 들어간 코드는 비동기 ..

    spring batch에서 파라미터 시 - 사용 주의

    spring batch에서 job param을 전달할 때 관용적으로 -를 붙여서 사용했다. 문제가 된 시점은 프로젝트에서 중복으로 돌면 안되는 배치에 preventrestart를 붙히고 돌리고 있는데 주기적으로 already job param으로 동작한 배치가 있다면서 배치가 자꾸 죽는 이슈가 발생했다. 원인을 파악하기 위해 디버깅을 하던 중 spring batch에서 job의 unique를 판단하는 부분에서 job param으로 전달하고 있는 값들을 job instance에 유니크로 확인하는데 사용을 못하고 있는 부분을 발견했다.  그림을 보면 알겠지만 실제 parameter는 push라는 형태로 전달 되지만 identifying이 false로 되어있는걸 확인할 수 있다. 이러다보니 job instan..

    MapStruct의 mapping방식과 Lobmok 함께 사용 시 값이 mapping되지 않는 이유

    저번에 작성했던 MapStruct를 사용하면서 겪은 이야기를 정리해본다. MapStruct를 사용하면 값을 매핑해야하는 여러 경우에서 편리하게 값을 매핑할 수 있다. 특히 Entity값을 외부로 내보내려고 값객체에 값을 저장할 때 유용하게 사용된다. 객체 생성 및 값 주입 방법 기본적으로 MapStruct에 경우 setter, constructor, builder를 사용하여 객체를 생성하고 값을 넣는다. 먼저 setter를 사용하는 경우를 살펴보자. 1. setter package com.wedul.mapstructtest.entity; import lombok.Builder; import lombok.Getter; import java.util.List; @Getter public class Accou..

    Mapstruct 사용 시 collection 내부에 이름이 다른경우

    Mapstruct를 통해 편하게 응답값을 매핑할 수 있도록 도와주는 라이브러리를 살펴본적 있다. https://wedul.site/703 만들면서 배우는 아키텍처 그리고 매핑 프레임워크 MapStruct를 사용한 매핑 만들면서 배우는 아키텍처 (Get Your Hands Dirty on Clean Architecture) 요새 읽던 책중에 'Get Your Hands Dirty on Clean Architecture' 책이 인상 깊었다. 원서로 팀원들과 스터디 하고 나서 인상깊어서 '만들면서 배 wedul.site 값을 매핑할 때 필드의 이름이 다를 경우에는 아래 처럼 Mapping애노테이션을 사용해서 source, target에 이름을 명시하여 이를 해결 할 수 있었다. @Mapping(source =..

    dynamoDbEnhancedClient range query condition 사용 시 The provided starting key does not match the range key predicate 에러 발생

    이전글에서 QueryConditional에서 range로 requestDateTime의 값을 sortkey로 구간 조건으로 조회를 했었다. 근데 dynamodb 특성상 페이징을 하기 위해서는 exclusiveStartKey값을 이용해서 마지막 이후 부터 값을 읽도록 쿼리를 수행해야한다. 하지만 작성한 쿼리로 로직을 수행하던중 The provided starting key does not match the range key 에러가 발생했다. 삽질을 계속 하던 중 query condition에서 사용했던 sortkey range구간을 벗어나는 값을 넣었을 경우에 발생했다. 만약 range query condition을 사용할 경우 range구간을 벗어나는 값을 exclusiveStartKey값으로 넣지 않도..

    dynamoDbEnhancedClient에서 QueryConditional에서 sort key range 조회하기

    아래와 같이 데이터가 존재하는 상황을 가정해보자. import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSortKey; @Getter @Setter ..

    Dynamodb enhanced client

    dynamodb enhanced client 기존에 dynamodb를 조작하기 위해서 aws에서 제공되던 sdk를 사용할 때 DynamodbDBMapper를 사용해서 객체-테이블 매핑하여 질의해서 사용하였는데 생각보다 사용하기 번거로웠던 기억이 있었다. (마지막으로 프로젝트에서 사용한지 벌써 2년이 지나서 자세한 불편내용은 기억이 나진 않지만 사용에 편리하지 않았던 기억은 명확하게 남아있다.) 그래서 이번에 dynamodb를 프로젝트에서 사용하게 되었을 때 조금 더 편하게 사용할 수 있는 방법이 없을까 찾아봤고 dynamodb sdk for Java version 2에서 제공되는 DynamoDb Enhanced를 사용해보기로 했다. 사용법 gradle import plugins { id 'org.spri..

    lombok에서 @builder annotation 사용 후 static 접근 시 cannot find symbol 에러 문제

    문제상황 개발하면서 특정 정보를 필터링할 Predicate를 동적으로 생성하고 싶은 마음에 다음과 같이 개발을 진행했었다. WedulFilterPredicate - 필터로 사용할 조건을 보관하고 Predicate를 반환하는 클래스 package com.wedul.springtest; import lombok.Builder; import lombok.Getter; import java.util.function.Predicate; @Getter public class WedulFilterPredicate { private Boolean hasName; private Boolean hasPicture; private String teamNo; @Builder public WedulFilterPredicate(..

    Gradle build 시 node js 버전을 지정하여 빌드하기

    어드민 프로젝트를 만들 때 spring project 내부에 static 위치에 front 관련 코드를 위치시켜서 화면과 api를 하나의 프로젝트에서 진행하는 경우가 있다. 이 경우 gradle를 통해서 npm build를 진행하게되는데 같이 개발을 진행하는 개발자들 로컬 node.js 버전과 서버 node.js 버전에 따라서 프론트에서 사용하는 일부 라이브러리등이 build시 지원되지 않는 경우가 있다. 나같은 경우에는 서버는 node js버전이 12이었고 node-sass 버전을 4.x를 쓰고 있었다. 그러나 회사에서 제공하는 서버의 node 버전이 16으로 업그레이드 되면서 nodes-sass 6.x 이상으로 올려야했다. 근데 node-sass를 올릴 경우 사용되고 있는 script-ext-html..

    S3Mock을 사용한 S3 테스트 방법

    s3를 로컬에서 테스트 진행하기 위해서는 별도의 mock 서버가 필요하다. 이를 대신해서 AWS s3에서 사용하는 api 구현체를 제공해주는 s3Mock이라는 라이브러리가 있어 사용해봤는데 괜찮아서 정리해본다. Gradle Import https://github.com/findify/s3mock GitHub - findify/s3mock: Embedded S3 server for easy mocking Embedded S3 server for easy mocking. Contribute to findify/s3mock development by creating an account on GitHub. github.com dependencies{ api 'org.springframework.cloud:spr..

반응형