요약@WithMockUser는 기본적인 인증만 제공한다. 하지만 우리는 도메인에 맞는 커스텀 UserDetails를 사용하는 상황이고, 이럴 경우 @WithMockUser만으로는 인증 객체의 테스트가 어렵다. 이 글에서는 그런 상황에서 커스텀 인증 어노테이션을 만들어 중복 없이 테스트하는 방법을 정리한다. 문제 @RestController@RequestMapping("/users")@RequiredArgsConstructorpublic class UserController { private final UserService userService; @GetMapping public UserRes getUser(@AuthenticationPrincipal UserDetails userDetai..
Spring

상황레디스는 각각의 명령어들은 원자적으로 실행이 되지만, 비즈니스로직을 작성하다 보면 여러 명령어들을 한 번에 처리해야 하는 경우가 생긴다. 이를 위해, 레디스를 루아스크립트를 이용해서 여러 명령어를 원자적으로 처리할 수 있도록 지원하고 있다.레디스에서 LuaScript 사용하기 127.0.0.1:6379> eval "return 'Hello world!'" 0"Hello world!"레디스로 스크립트를 실행하는 명령어는 EVAL 이며, 그 다임 인수로 “…”를 감싸서 루아스크립트를 작성하면 된다. 또한 그 다음 인수로는 이후 입력될 KEY 개수이고, 키 개수만큼 입력한 다음의 인수로는 인수를 입력받는다. EVAL [ , ..., , ...]정리하면 위와 같이 입력할 수 있다. 또한 위의 예제에서 ..

문제 @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 + 휠클릭으로 했다)정말 너무 편하다....