👩🏻‍💻 Programming 88

@EntityListener와 @PostLoad의 이슈

목차findBy에서 왜 UPDATE 쿼리가 나가지?프로시저와 연관이 있을까?범인은 @EntityListeners일부 중요한 비즈니스 변수명은 임의의 값으로 변경했다는 점을 알아두자.1. findBy에서 왜 UPDATE 쿼리가 나가지?아래와 같은 비즈니스 로직이 있었다. @Override @MyProjectWriteTransactional // 커스텀 트랜잭션 어노테이션 public String changeMoney(ChangeMoneyCommand command) { // entity를 flush 하는 로직 // procedure를 콜 하는 로직 return MemberRatingQuery.getMemberRatingMandatory(command.memberId()).getMemb..

동기, 비동기, 그리고 Batch의 thread-pool : thread-pool은 다다익선이 아닐까? (2)

동기, 비동기, 그리고 Batch에서 사용되는 thread의 지식을 정리한 글 입니다.내용이 긴 관계로 part를 나누어 업로드합니다.부족한 부분, 또는 잘못된 부분이 있으면 피드백을 남겨주시면 감사드리겠습니다. 🙆🏻‍♀️🙇🏻‍♀목차ThreadPoolExecutor의 가용 스레드를 최대로?내장형 Tomcat(WAS)의 가용 스레드를 최대로?Batch의 thread-pool은 다를까?결론참고 자료1. ThreadPoolExecutor의 가용 스레드를 최대로?ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue)/*corePoolSize = 최초 ..

IntelliJ에서 Gradle Build가 실패할 때 해결책

가끔 Gradle 프로젝트를 IntelliJ로 불러올 때 Gradle이 정상작동하지 않을 때가 있다.build에 실패한 로그라도 남으면 좋을텐데, 저렇게 밑도 끝도 없이 failed만 나올 때가 있다.향로님의 IntelliJ에서 Gradle 프로젝트가 작동안될때에 언급된 해결책을 시도했으나, 잘 해결되지 않았다.그러다가 발견하게된 해결책을 공유한다.먼저 좌측 패키지 구조에서 보이는 .idea 디렉토리를 제거하자.직접 패키지 위치를 찾지 않고 아래와 같이 터미널에서 명령어를 통해서도 제거가 가능하다.// 프로젝트의 루트 디렉토리에서 명령어를 입력하자rm -rf ./.idea그런 다음 File > Project Structure에 들어가보자.좌측의 Module로 들어간 다음, 만약 현재 프로젝트가 그대로 잔..

ThreadPoolExecutor vs ThreadPoolTaskExecutor

목차ThreadPoolExecutor (from Java)(1) Executors.newFixedThreadPool(2) Executors.newCachedFixedThreadPool(3) Custom ThreadPoolExecutorThreadPoolTaskExecutor (from Spring)정리Java의 ThreadPoolExecutor에 대한 전반적인 내용은 pompitzz님의 Java의 ThreadPoolExecutor, Spring의 ThreadPoolTaskExecutor를 참고했다.1. ThreadPoolExecutor (from Java) ThreadPoolExecutor는 자바 표준 라이브러리(java.util.concurrent)에서 제공하는 기본적인 thread-pool 구현체Ja..

private 필드에 ReflectionUtils로 값을 셋팅해서 테스트 코드 작성

private 필드가 있는 클래스 @RequiredArgsConstructor @Service public class TestEventService { private final SomeClient someClient; @Value("${test.event.key}") private String key; @Value("${test.event.sequence}") private String sequence; 위와 같이 Service 클래스에 private 접근 제어자로 선언된 필드가 있었다.@Value 어노테이션을 통해 빌드 환경별 고유 값을 가져오고 있는 상황이다.어느 환경에서도 불변의 값이 아닌 환경에 따라 다른 값을 가져오는 상황이다보니, 유닛 테스트를 작성하는데 애로사항..

동기, 비동기, 그리고 Batch의 thread-pool : thread-pool은 다다익선이 아닐까? (1)

동기, 비동기, 그리고 Batch에서 사용되는 thread의 지식을 정리한 글 입니다. 내용이 긴 관계로 part를 나누어 업로드합니다. 부족한 부분, 또는 잘못된 부분이 있으면 피드백을 남겨주시면 감사드리겠습니다. 🙆🏻‍♀️🙇🏻‍♀️목차서두thread와 thread-poolThreadPoolExecutor와 Connector참고 자료0. 서두일반적으로 java를 사용하는 spring boot에서 동기 방식의 API 콜이 한 번 호출되고 결과값이 반환될 때 까지 thread 1개가 필요된다.비동기로 호출 될 경우, 비동기로 호출되는 메서드의 개수 만큼 thread이 더 필요된다.그렇다면 이왕이면 더 큰 값의 thread-pool을 설정하면 되지 않을까? 그런 호기심에서 thread pool에 ..

Java의 리플렉션(Reflection)

개요개념어떻게 특정 Class 인스턴스를 획득할 수 있을까?장점단점실무에서 사용할뻔했던 사례참고 자료1. 개념Java의 리플렉션(Reflection)은 런타임에 클래스, 메서드, 필드 등의 정보를 확인 및 변경 가능하도록 한다.쉽게 말해, 프로그램 실행 중에 객체의 구조나 메서드를 동적으로 사용할 수 있게 해주는 기술이다.보통 Java에서 객체를 사용할 때, 우리는 컴파일 시에 클래스와 메서드를 명시적으로 정의하고 호출한다.public class Hello { public void sayHello() { System.out.println("Hello, World!"); } public static void main(String[] args) { // Reflect..

QueryDSL과 H2 DB 연동해서 TC를 작성하다가 발생한 ScriptStatementFailedException

복잡한 join이 포함된 JPA를 작성하게되어 QueryDSL로 로직을 구현했다.join을 사용하다보니 결과 개수가 예상된 개수와 일치하는지 확인이 필요됐다.H2 DB와 연동하여 테스트 코드를 작성했는데, 테스트 코드 작성중 아래와 같은 에러가 발생했다.org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [maa/내-파일-입니다.sql]: INSERT INTO 내 테이블 입니다 (...); SQL statement:보통 이 경우엔 application.yml이나 application.properties에 설정된 ..