상황레디스는 각각의 명령어들은 원자적으로 실행이 되지만, 비즈니스로직을 작성하다 보면 여러 명령어들을 한 번에 처리해야 하는 경우가 생긴다. 이를 위해, 레디스를 루아스크립트를 이용해서 여러 명령어를 원자적으로 처리할 수 있도록 지원하고 있다.레디스에서 LuaScript 사용하기 127.0.0.1:6379> eval "return 'Hello world!'" 0"Hello world!"레디스로 스크립트를 실행하는 명령어는 EVAL 이며, 그 다임 인수로 “…”를 감싸서 루아스크립트를 작성하면 된다. 또한 그 다음 인수로는 이후 입력될 KEY 개수이고, 키 개수만큼 입력한 다음의 인수로는 인수를 입력받는다. EVAL [ , ..., , ...]정리하면 위와 같이 입력할 수 있다. 또한 위의 예제에서 ..
TIL ✍️
문제 @Bean(JOB_NAME + "_reader") public ItemReader itemReader() { return new JpaPagingItemReaderBuilder() .name(JOB_NAME + "_reader") .pageSize(CHUNK_SIZE) .entityManagerFactory(entityManagerFactory) .queryString("SELECT p FROM Product p") .build(); }이렇게 JpaPagingItemReader로 엔티티를 읽어오도록 하고, 각 Product 엔티티별로 price를 +1000 하는 작업을 하기로 했다. 9개를 가지고 작업을 ..
상황DB를 2개를 쓰고, 하나를 primary db로 읽기+쓰기 작업을, 나머지 하나는 replica db로 읽기 작업만 하는 DB로 구성이 되었을 때, 매번 기능을 만들 때마다 읽기/쓰기를 구분해서 데이터소스를 가져오기보다, 어노테이션의 readOnly 속성으로 알아서 데이터소스를 구분하도록 하고 싶었다. spring: datasource: hikari: main: driver-class-name: org.postgresql.Driver jdbc-url: jdbc:postgresql://localhost:54326/sample username: sample password: 1234 sub: driver-class..
문제멀티 데이터소스 환경에서, 스프링 배치 5 버전에서는 특별한 설정을 하지 않으면 @Primary 데이터소스를 가져온다. 하지만 나는 Primary가 아닌 다른 데이터소스를 가져오려고 설정을 했더니 Job이 실행이 되지 않고, 또 application.yml 파일에 적어둔 배치 설정도 적용이 되지 않던 문제가 있었다. 상황# application.ymlspring: batch: jdbc: platform: postgresql # DBMS, 안 적으면 자동으로 탐색 # 실행할 스키마, 배치 라이브러리 내부에 각 DBMS 별로 sql이 작성돼있다. schema: classpath:org/springframework/batch/core/s..
문제 스프링은 트랜잭션에 진입한 후에 커넥션을 점유하고, 이후에 데이터소스를 결정한다. 우리는 두 개의 데이터소스를 채택해서, 이중으로 커넥션을 점유하는 문제가 있었다. 상황spring: application: name: multi-source-service datasource: hikari: postgres: driver-class-name: org.postgresql.Driver jdbc-url: jdbc:postgresql://localhost:54326/sample username: sample password: 1234 postgres-two: driver-class-name: org.postgresq..
문제Jacoco로 테스트 커버리지를 검사하다 보면, lombok이 만들어준 getter, setter, 생성자 등등까지 테스트 항목에 포함되게 된다. getter, setter까지 테스트를 하는 것은 테스트를 작성하는 의미가 없다고 판단해서 이를 무시할 수 있는지 알아보았다. 해결// lombok.config# jacoco 테스트 커버리지 시, lombok이 생성한 코드는 제외lombok.addLombokGeneratedAnnotation = true 프로젝트 루트 디렉토리에 lombok.config 파일을 만들어서 위와 같이 작성해 주었다.
문제멀티 데이터소스를 채택하면서, 메인 데이터소스는 @Primary를 붙였고, 배치 데이터소스는 @Qualifier를 사용해서 가져오려고 했었다. 하지만 lombok의 @RequiredArgsConstructor 사용 시 @Qualifier 사용이 불가능했던 문제가 있다. @Slf4j@Service@RequiredArgsConstructorpublic class TestService { private final DataSource dataSource; @Qualifier("batchDataSource") private final DataSource batchDataSource; // ...}TestService는 2개의 DataSource를 주입받고 있다. @Servicepu..
스프링을 쓰다 보면, src클릭 main 클릭 java 클릭 com 클릭 ooo클릭 ooo 클릭해야만 드디어 스프링 애플리케이션을 볼 수 있다. 근데 이제 시작이다. 그 하위의 디렉터리를 또 하나하나 클릭하다 보면 화딱지가 난다... 그러다 클릭 한 번으로 하위 디렉토리를 모두 열 수 있는 방법을 알게 되었다. 우선 설정을 연다. (맥은 cmd + ,)왼쪽 메뉴에서 키맵(keymap)을 클릭 후트리 노드 전체 펼치기(Fully Expand Tree Node) 검색트리 노드 전체 펼치기 우클릭 후 마우스 단축키 추가 클릭편한 단축키 등록 (나는 cmd + 휠클릭으로 했다)정말 너무 편하다....
문제CI/CD를 구성하면서, CD 마지막 과정은 EC2 서버의 기존 도커 컴포즈를 down 하고 다시 up 하는 과정이 있다. 그리고 재시작하면서 스프링 컨테이너를 강제 종료하는데, 이때 진행 중인 로직도 그대로 강제 종료되는 문제가 있었다. 예를 들어, 주문 처리 중 재고는 감소시켰는데 강제 종료가 되어서 재고가 롤백되지 않는 문제가 있을 수 있다. (MSA 환경이다)또한 Eureka server에 설정된 Eviction timer가 종료되기 전까지 유레카에 남게되는 문제도 있다.해결Graceful shutdown을 적용했다. 스프링 부트spring: application: name: payment-service config: import: classpath:application-data..