본문 바로가기
반응형

Develop223

[Spring Batch] JobExecutionAlreadyRunningException 에러 🤯 에러 발생 Spring Batch에서 job을 실행하다가 아래와 같은 에러와 마주쳤다. java.lang.IllegalStateException: Failed to execute ApplicationRunner ... Caused by: org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobExecution: id=4223, version=1, startTime=2023-08-21 19:14:19.0, endTime=2023-08-22 15:38:48.0, lastUpdated=2023-08-21 19:14:19.0, st.. 2023. 10. 16.
[Mockito] Invalid use of argument matchers! 에러 😱 에러 발생 org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 2 matchers expected, 1 recorded 에러 아래와 같은 테스트 코드를 실행시키다 위와 같은 에러 로그를 만났다. var service = mock(MemberFindService.class); verify(service).findByIdAndName(anyLong(), "yeonlog"); 에러를 해석해보자면 argument matchers를 잘못 사용했다. 2개의 matcher가 예상되었지만, 1개만 존재한다. 이 의미를 이해하기 위해서는 argument matchers가 무엇인지 먼저 알아야한다... 2023. 9. 27.
[JPA] @Where 무시하기 DB에서 데이터 삭제를 하기 위해서는 크게 hard delete와 soft delete가 존재한다. hard delete: SQL의 DELETE문을 이용해 직접 데이터를 삭제하는 방법. soft delete: SQL의 UPDATE문을 이용해 삭제 여부를 저장하는 컬럼을 변경하는 방법. 표준으로 정해진 것은 아니지만 soft delete는 일반적으로 deleted라는 컬럼에 true/false를 알 수 있는 값을 저장한다. soft delete의 단점은 조회할 때마다 조회 조건을 추가하는게 매우 귀찮다. (일반적으로 조회는 삭제되지 않은 데이터들을 조회해야하니 where deleted = 0 같은 조건을 넣어야 한다.) 헌데 JPA에서는 정말 편리하게도 @Where라는 어노테이션을 제공해준다. @Where.. 2023. 9. 11.
[Git] 머지 커밋 revert 하기 🤔 git revert란? git revert란 일부 기존의 커밋들을 되돌리는 작업이다. git reset과는 다른 것이, git reset은 기존의 커밋을 아예 삭제해버린다. 하지만 git revert는 변경 사항을 되돌린 커밋을 하나 새로 생성한다. 예를 들어 아래와 같은 커밋 A, B, C가 있다고 가정해보자. (알파벳은 커밋을 구분하기 위해 임의로 붙인 이름이다.) 이 때 커밋 C의 변경 내역을 reset, revert를 통해 되돌린다면 어떻게 될까? 커밋 내역을 살펴보면 git reset은 커밋 C에 대한 기록이 아예 없어진다. git revert는 새로운 커밋 X가 생긴다. 커밋 X의 변경 내역을 살펴보면, 커밋 C에서 변경했던 코드들이 그 이전 상태로 돌아가있다. git reset을 사용하는.. 2023. 8. 13.
[Spring Batch] 개념부터 코드까지 목차 1. Spring Batch란? 2. Spring Batch 구조 3. 기본적인 세팅 4. Job, Step 5. ItemReader, ItemProcessor, ItemWriter 1. Spring Batch란? 배치란 언제, 왜 쓰는걸까? 비즈니스 로직을 작성하다 보면 대량 처리(bulk processing)가 필요한 경우가 많다. 이런 대량 처리가 반복적으로 일어나야 하는 경우, 배치 애플리케이션을 생성 및 실행하여 처리할 수 있다. 그 중에서도 Spring Batch는 엔터프라이즈 시스템에서 일상적인 운영에 필요한 배치 애플리케이션을 개발할 수 있도록 설계된 배치 프레임워크이다. 여기서 주의할 점은 배치는 대량의 데이터를 일괄적으로 처리할 뿐, 특정 주기마다 자동으로 돌아가는 스케줄링과는 .. 2023. 7. 21.
[Java] UnaryOperator란? 📚 UnaryOperator란? : Java에서 제공하는 함수형 인터페이스 인수(argument)와 반환 결과(return)가 동일한 타입을 가진 경우에 사용하는 특수한 Function Java 8 부터 사용 가능 함수형 인터페이스란? * = SAM Interface = Single Abstract Method Interface * 1개의 추상 메서드를 가진 인터페이스 * UnaryOperator 외에도 Predicate, Consumer, Function 등이 있다. UnaryOperator의 코드를 살펴보면 Function를 상속받고 있는 것을 볼 수 있다. 제네릭 부분을 살펴보면 인수와 반환 결과 모두 동일한 타입으로 취급하는 것을 볼 수 있다. @FunctionalInterface public .. 2023. 6. 26.
[DB] 'is not NULL'과 '!= NULL'은 다르다? 팀원분이 비슷해 보이는 두 쿼리문를 보내시며 둘의 결과가 서로 다르다고 보내주셨다. 두 쿼리의 차이점은 오직 NULL 체크를 is not NULL로 하냐, != NULL로 하냐의 차이였다. 쉬운 이해를 위해 사용자를 조회하는 쿼리가 있다고 가정해보겠다. -- 1: is not NULL 사용 (10 Results) select * from member where age is not NULL limit 1; -- 2: != NULL 사용 (0 Results) select * from member where age != NULL limit 1; is not NULL에서는 조회 결과가 있지만, != NULL에서는 조회 결과가 없었다. 왜 그럴까? SQL에서는 NULL 값을 =, 같은 비교 연산자를 이용해 비교할.. 2023. 6. 7.
[Spring] 스프링 캐시 간단하게 사용해보기 목차 1. 스프링의 캐싱 방법 2. 사전 준비 3. 예제 코드 1. 스프링의 캐싱 방법 캐싱 자주 사용하는 데이터를 어딘가 임시로 저장하고, 빠르게 꺼내 쓰기 위해 사용할 수 있게 하는 프로세스 서버의 부담을 줄여 성능을 높이기 위해 사용하기도 함 ex: DB에서 조회하는게 굉장히 오래 걸리는 데이터를 캐싱해두면, 다음에 조회할 때 DB의 조회 결과를 기다리지 않고 캐싱 영역에서 빠르게 가져다 쓸 수 있음 스프링의 캐싱 @Cacheable, @CacheEvict 같은 어노테이션을 통해 AOP 기반으로 동작 이를 위해서는 @EnableCaching 설정이 필수 2. 사전 준비 이 글에서는 Redis를 이용해 예제 코드를 작성하기 때문에 사전 준비가 필요하다. 별도의 Redis를 사용하지 않는 경우에는 생략.. 2023. 5. 31.
[Spring] '/', 문자열인가 경로인가 그것이 문제로다 🤔 문제의 시작 API를 호출하면 json이 아닌 html 코드로 응답이 오고 있다는 이슈를 제보받았습니다. 해당 html 코드를 열어보니 아래와 같이 HTTP 상태 코드 400을 보여주고 있었습니다. 상태 코드 400은 Bad Request라는 의미로, 클라이언트의 요청이 잘못되어 서버가 요청을 처리할 수 없거나 처리하지 않을 것임을 나타내는 코드입니다. 🧐 원인 분석 문제가 발생하는 정확한 케이스를 파악하기 위해 현상 재현을 시도하였습니다. API를 호출해봤더니 애플리케이션에 요청이 들어오지도 않는 것처럼 보였습니다. 400이라는 응답값만 생각해보면 어디선가 예외가 발생했을 것 같은데, 예외가 발생했다는 에러 로그가 남지 않았거든요. 어떤 API인지 설명하기 위해 가상의 예제 API를 만들어보았습니.. 2023. 5. 12.
반응형