JPA4 [QueryDsl] 대량으로 수정하기 사내 기기 재고 관리를 하는 프로젝트를 하게 되었다. 보통 재고가 들어오면 몇 천 단위로 들어오게 되는데 그 때 어떻게 신속하게 메모리를 사용하고 db 호출 횟수를 어떻게 처리할 것인지에 대한 고민이 생겼다. 고민 1. for문을 돌 때 마다 N+1 문제가 발생한다. for 문을 돌 때마다 성능이 선형적으로 저하될 것이다. 해결 1. QueryDSL 의 벌크 연산 기능을 활용해서 한 번의 쿼리로 대량 데이터를 처리 가능하다.JPAUpdateClause updateClause = phrJPAQueryFactory.update(bandManagement) .where(whereBandsLabelIn(deviceUpdateRequestDto.getBands())); 고민 2. update, delet.. 2025. 4. 8. [QueryDsl] 동적 접근이란 무엇일까 자바에서 코드가 동작하는 레이어를 보면 컴파일 다음 런타임이다. 런타임은 프로그램이 실행되고 있는 환경이나 동작하는 시간을 말한다. 우리가 코드를 다룰 때는 런타임에 접근 할 때와 컴파일에 접근 할 때 두가지 경우의 수가 생긴다. 컴파일때 접근하는 것을 정적 접근이라 하고 런타임을 동적 접근이라 한다. 예를 들어 설명하자면 1. 정적 접근 (QClass || EntityPath 사용)// 컴파일 시점에 모든 것이 결정 == 정적이다.Quser user = Quser.user;user.name // 자동 완성 되지 않는가? == 타입 안전성이 보장된다. 2. 동적 접근 (PathBuilder 사용)PathBuilder user = new PathBuilder(User.class, "user);String.. 2024. 10. 25. Open Session in View Open Session in View 패턴은 영속성 컨텍스트의 생존 범위를 HTTP 요청( Request) 범위로 한정하는 방식이다. 기본적으로 웹 애플리케이션에서는 요청 단위로 영속성 컨텍스트를 열고 닫는다. 하지만 이 방식에서는 *뷰 렌더링 과정에서 지연 로딩이 발생하면 예외가 발생할 수 있다. 왜냐하면 요청이 끝나면서 영속성 컨텍스트가 이미 닫혀있기 때문이다.* 뷰 렌더링 과정 : 서버 측에서 HTML 페이지를 생성하는 과정 Open Session in View 패턴은 이러한 문제를 해결하기 위해 등장했다. 이 패턴을 사용하면 영속성 컨텍스트를 뷰 렌더링이 완료될 때까지 유지할 수 있다. 이를 통해 뷰 렌더링 중에도 지연 로딩이 가능해진다. 하지만 이 패턴은 주의해야 할 점이 있다. 동시성 문제:.. 2024. 4. 25. [Relation] mappedBy 양방향 및 단방향 매핑 고민은 주로 JPA에서 발생하는 문제이다. RDBS에서는 join을 사용하여 연결(양방향 매핑)을 쉽게 구현할 수 있다. 이는 RDBS의 기능 중 하나이며, JPA는 이에 대해 직접적인 지원을 제공하지 않는다. 그렇다면, JPA에서도 RDBS처럼 양방향 매핑이 더 좋은 선택이 아닐까 생각할 수 있다. 그러나 다음과 같은 이유로 이는 적합하지 않을 수 있다. Entity의 복잡성이 증가할 수 있다. 코드의 가독성이 떨어질 수 있다. 따라서, 일반적으로 JPA에서는 단방향 매핑을 지향한다. 그러면 두 테이블 중 어느 쪽에서 매핑을 설정해야 하는가에 대한 문제가 생긴다. 이는 다시 말해, '연관관계의 주인은 누구인가?'에 대한 질문과 같다. 연관관계의 주인은 외래키 수정 권한을 가지게 .. 2023. 7. 27. 이전 1 다음