본문 바로가기
반응형

Develop/Java70

[Java] compiler message file broken 에러 compiler message file broken: key=compiler.misc.msg.bug arguments=11.0.13, {1}, {2}, {3}, {4}, {5}, {6}, {7} java.lang.AssertionError: Incorrect number of arguments; expected 4, found 0 에러 에러 발생 코드 에러가 발생한 코드를 살펴보자면 아래와 같다. REST API 호출 시 발생하는 예외를 executeApi() 메서드를 통해 공통적으로 처리했다. 이 코드 중에서 ParameterizedTypeReference(){} 부분에서 에러가 발생했다. @Slf4j @RequiredArgsConstructor @Service public class AuthUserA.. 2024. 3. 17.
[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.
[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.
[Java] replaceAll 대신 replace 사용하기 🙂 개요 String에서 흔히 사용하는 메서드 중에서는 replaceAll라는게 있다. 다들 알다시피 replaceAll은 특정 문자를 다른 문자로 대치할 수 있게 해주는 아주 편리한 메서드이다. 그러다 replaceAll보다는 replace를 사용하는 것이 좋다는 이야기를 듣게 되어 사실인지 살펴보기 위해 해당 포스팅을 작성하게 되었다. 🤓 간단 테스트 먼저 replace에 대해 흔히 하는 오해를 바로 잡고 가야한다. replaceAll 메서드가 따로 있다보니 replace는 일치하는 첫 부분 또는 일부만 대체해 주는건가? 라고 착각할 수 있다. 예를 들어 A를 B로 대체한다고 가정할 때, AA가 BA로 대체될 거라고 착각한다. 하지만 실제로는 BB로 대체된다. (참고로 여러 일치하는 문자열 중 첫 부.. 2023. 1. 22.
[Java] 동시성 이슈 해결하기 (1) 같은 계좌를 이용하는 A와 B라는 이용자가 있다고 가정한다. 동일한 시간에 A는 카드를 이용해 상품을 결제했고, B는 은행 어플을 통해 계좌이체를 했다. 대략의 플로우를 상상해보면 아래와 같다. A와 B는 같은 시간에 잔액을 조회했다. A는 40,000원을 결제하여 계좌에 남은 잔액인 60,000원을 반영하였다. 같은 시각, B는 20,000원을 계좌 이체하였다. B의 처리 속도가 약간 늦어져 A가 계산된 금액 반영을 한 뒤에야 B의 계산된 금액을 반영했다. 한 계좌에서 각각 40,000원과 20,000원이 결제되었으니 잔액은 40,000원이 남아야한다. 하지만 현재 80,000원이 남은 상태임을 확인할 수 있다. 이는 계좌라는 같은 자원에 여러 사람이 동시에 접근하기 때문에 발생하는 문제이다. 다양한 .. 2022. 12. 9.
[JPA] delete문이 N개가 발생한다고요?😱 💥 원인 발생 현재 진행중인 프로젝트에서 deleteAllByXXX를 호출하자 delete가 N개 나가는 현상이 발생했다. 왜 여러개가 나갈까? 왜 한번에 삭제되지 않는걸까?를 찾아보게 되었다. 📝 원인 분석 deleteAll이 어떤 식으로 동작하는지 확인하기 위해 아래와 같은 과정을 거쳤다. 일단 저희 Repository에서는 Repository를 extends하고 있기 때문에 해당 클래스로 살펴보았다. 구현체를 찾아 따라가다보니 SimpleJpaRepository 다다르게 되었다. 내부 구현을 확인해보니 delete를 for문을 돌면서 호출했다.😱 반면에 deleteAllInBatch는 여러번 호출하는 것이 아닌 한번에 호출하고 있었다. @Repository @Transactional(readOnly.. 2022. 11. 13.
[Java] volatile 키워드 (feat. Atomic & Concurrent) 😵 서론 멀티 스레드로 인한 동시성 문제를 해결하기 위해 Java는 synchronized 키워드와 Atomic 타입이 있다고 알려져있다. 그런데 Atomic 타입은 왜 Thread-safe하다고 할까? 이 이유에 대해서 찾다가 volatile이라는 키워드에 대해 알게 되었다. 이번 포스팅에서는 해당 키워드에 대해 파헤쳐보려고 한다. 😎 Atomic & Concurrent & volatile 예제를 살펴보기 위해 AtomicInteger의 내부 코드를 가져왔다. 특별할 것 없어 보이지만 value에 volatile이라는 키워드가 붙는다는 점이 눈에 띈다. AtomicBoolean, AtomicLong도 살펴봤는데 모두 volatile 키워드가 붙었다. public class AtomicInteger ex.. 2022. 11. 9.
[Java] Thread Pool 이해하기 📚 함께 읽으면 좋은 글 프로세스와 스레드 Thread 이해하기 📑 목차 Green Thread vs Native Thread Java는 어떤 스레드를 사용하는가 Thread Pool 💥 Green Thread vs Native Thread 🔸 Green Thread = Virtual Thread User Level Thread OS가 아닌 library 또는 Virtual Machine에 의해 다뤄지는 스레드 기본 OS 기능에 의존하지 않고 다중 스레드 환경을 모방 실제로 여러 코어에서 사용하는 것은 불가능 차단 시스템 호출 시 같은 프로세스 내의 모든 스레드가 차단됨 🔸 Native Thread = Non-Green Thread Kernel Level Thread OS에 의해 다뤄지는 스레드 ❓ Ja.. 2022. 9. 12.
[Java] Thread 이해하기 이 글에서는 Thread 클래스는 'Thread', 개념적 의미의 스레드는 '스레드'로 표기한다. 먼저 프로세스와 스레드의 차이에 대해 잘 모르는 사람들은 이 글을 읽기 바란다. [OS] 프로세스와 스레드 프로그램 어떤 작업을 위해 실행할 수 있는 파일 메모리에 올라가지 않은 Windows의 *.exe 같은 정적 파일 (메모리에 올라가다: 실행을 하려면 OS가 독립적인 메모리 공간을 할당해줘야 함) 프로세스 yeonyeon.tistory.com 스레드를 생성하는 방법으로는 두 가지가 있다. implements Runnable extends Thread 🔻 Runnable vs Thread 더보기 어느 것을 이용해 스레드를 생성하는 것이 좋을까? 어느 쪽이든간에 별 차이는 없지만 Thread 클래스를 상속.. 2022. 9. 8.
반응형