스터디 ㅤㅤㅤㅤㅤ By crud JPA Batch 활용 Java에서 대량의 데이터를 DB에 삽입할때 JDBC Batch를 활용하면 성능이 대폭 향상됩니다. 정산과 같은 실시간 처리가 필요없고, 대량의 데이터를 다루는 배치성 작업은 위 기능을 활용하면 효율적인 처리가 가능한데요, 아쉽게도 JPA를 사용하는 경우 JDBC Batch 기능을 사용하는데 제약이 많습니다. 이번 글에서는 JPA 환경에서 삽입 성능을 향상할 수 있는 방법을 공유하겠습니다. JDBC Batch 란? JDBC는 Java에서 db를 다루기 위한 API 스펙으로 각 벤더사가 JDBC 스펙을 구현한 드라이버를 제공합니다. JDBC 스펙에는 대량의 데이터 처리를 위한 Batch Api를 제공하고 있고, 대량의 데이터 처리 시에는 꼭 해당 API를 활용해 효율적으로 처리해야합니다. 아래 코드는 JD.. 스터디/스프링 2023. 5. 8. ㅤㅤㅤㅤㅤ By crud Spring Scheduler Cluster 기능 추가해보기 Spring Scheduler는 여러 인스턴스가 떠 있을때 각 인스턴스의 job을 클러스터링하는 기능이 없다. 각 인스턴스 중 하나의 인스턴스에서만 job을 실행하고 싶은 경우 Scheduler를 커스텀화 해야한다. Scheduler에 Cluster 기능을 추가하는 방법을 알아보자. 코드예제 https://github.com/Java-Bom/bomscheduler/tree/team1 특정 시간마다 반복해서 돌아야하는 작업은 주로 Spring batch + jenkins 조합으로 많이 해결한다. 하지만 반복되는 주기가 1분 혹은 1분보다 짧아야 하는 경우 jenkins가 jar 파일을 실행하는 방법은 무거울 수 있다. 이런 경우는 Spring Scheduler를 사용하면 application이 계속 실행된.. 스터디/스프링 2022. 8. 23. ㅤㅤㅤㅤㅤ By ds_chanin fetch join 과 pagination 을 같이 쓸 때 [HHH000104: firstResult/maxResults specified with collection fetch; applying in memory] 결론부터 말하면 One에서 Many를 fetch 해야하는 경우 limit과 같은 절(Pagination을 위한)을 포함하면 원하는 대로 결과나 나오지 않는다. 예제코드(+ 테스트코드)는 Github에서 확인할 수 있다. LIMIT 그리고 SET_MAX_RESULT JPQL Pagination을 위해서는 MySQL 기준 limit (그리고 offset) 을 사용해야 한다. 그런데 JPA은 DB에 따라서 방언을 바꾸어 Query를 생성하기 때문에 MySQL 방언에 속하는 LIMIT 절을 JPQL에서 직접 사용할 수 없다. 따라서 아래와 같이 쿼리를 작성하면 QuerySyntaxException, IllegalArgumentException 이 발생한다. @Query("SELECT a FROM Article .. 스터디/스프링 2020. 10. 21. ㅤㅤㅤㅤㅤ By ds_chanin JPA 사용시 테스트 코드에서 @Transactional 주의하기 서비스 레이어(@Service)에 대해 테스트를 한다면 보통 DB와 관련된 테스트 코드를 작성하게 된다. 이러면 테스트 메서드 내부에서 사용했던 데이터들이 그대로 남아있게 되어서 실제 서비스에 영향을 미칠 수 있기 때문에 테스트가 끝나면 지워야 할 필요가 있다. 이러한 문제를 해결하기 위해 @Sql 애너테이션을 이용해서 직접 DB를 Truncate하는 Query를 직접 작성하는 방법도 있고, 테스트 메서드에 @Transactional 애너테이션을 이용해서 테스트 메서드가 종료될 때 테스트 메서드 내부에서 생성했던 데이터를 rollback하는 방법도 있다. @Sql 작성은 관련된 DB의 Truncate Query를 직접 작성해야하고 관련된 Table이 증가할 때마다 Query도 같이 수정해야 하는 번거로움.. 스터디/스프링 2020. 9. 23. ㅤㅤㅤㅤㅤ By crud HikariCp 설정 유의사항 HikariCp 설정 HikariCp를 설정할때 다양한 설정값들이 존재한다. 설정시 유의사항을 알아보자. HikariCp는 DB 커넥션들을 담아놓는 하나의 통이다. 매번 사용할 때마다 db에 연결할 시 많은 비용이 부담이 크니, 사용할 db 커넥션들을 미리 연결해놓고 풀안에서 관리한다. connectionTimeout Hikaricp의 커넥션 타임아웃은 풀에서 커넥션을 구할때까지 기다리는 시간이다. 흔히 jdbc의 커넥션 타임아웃과 헷갈려서 실제 DB의 커넥션을 구할때까지의 시간으로 착각하기도 하는데 실제 DB의 연결시간과는 관련없다. minimumIdle 커넥션 풀에 유지할 최소 유휴 커넥션의 최소 개수이다. 최적의 성능을 유지하려면 minimumIdle = maximumPoolSize 같게 설정하여 .. 스터디/자바 2020. 8. 10. ㅤㅤㅤㅤㅤ By 쟈 미 Long과 double의 원자성을 보장하기 위한 volatile 선언 https://github.com/Java-Bom/ReadingRecord/issues/152 [아이템 83] 짜릿한 단일검사(racy single-check) · Issue #152 · Java-Bom/ReadingRecord p.445 모든 스레드가 필드의 값을 다시 계산해도 상관없고 필드의 타입이 long과 double을 제외한 다른 기본 타입이라면, 단일 검사의 필드 선언에서 volatile 한정자를 없애도 된다. 질문 : 왜 long과 dou github.com 이펙티브 자바를 읽으면서 짜릿한 단일검사(racy single-check)에 대해 찾아보던 중, 알게된 내용이다. 동기화의 기능 자바의 쓰레드 프로그래밍을 해보았다면 synchronized 키워드를 몇번 접해볼 수 있을 것이다. 동기화에.. 스터디/자바 2020. 7. 15. ㅤㅤㅤㅤㅤ By 오늘의 개발 Java의 Future Interface 란? 이펙티브자바에서 동시성 부분을 다루다가 Future 인터페이스가 잠깐 언급됐었습니다. 실행자 서비스의 submit 메서드의 반환값이 Future 타입이었고, 이 반환값의 get 메서드를 호출하니 Runnable 또는 Callable 인자가 수행될 때까지 기다렸었습니다. Future submit(Runnable task); 당시에 "Future Interface는 get 메서드를 제공하는구나, 그리고 그 get 메서드를 사용하면 끝날때까지 기다리는구나" 라는 것까지만 알고 넘어갔었는데, 깔끔하게 정리되어있는 가이드 문서를 발견해서 정리해보고자 합니다. (추가로 가이드 문서와 더불어 도움이 될 수 있는 예제코드도 함께 추가합니다.) 이펙티브자바 동시성 파트 자바봄 포스팅을 먼저 읽으면 도움이 될 것 같습니다.. 스터디/자바 2020. 7. 14. ㅤㅤㅤㅤㅤ By crud Spring을 이용한 AWS Credentials 설정 Aws Credentials 설정 aws Credentials은 AWS를 사용할 권한을 어플리케이션에 부여하는 것이다. 자격을 부여하는 여러 정책을 사용해보고, 가장 좋은 정책에 대해 알아보자 Spring에서 Aws 서비스를 사용할 때 가장 쉽게 사용할 수 있는 방법은 spring-cloud를 사용하는 것이다. SpringCloud를 사용한 Sqs연동 예제로 credential설정 방법을 알아보자. 우선 스프링 빌드 그래들에 aws-messaging 의존성을 추가한다. plugins { id 'org.springframework.boot' version '2.2.6.RELEASE' id 'io.spring.dependency-management' version .. 스터디/스프링 2020. 7. 13. 이전 1 2 3 4 다음