반응형
반응형
문제 프로젝트를 진행하는 중에 특정 조건에 맞는 유저들을 검색하고, 해당 아이디들을 기준으로 특정 데이터를 업데이트 하려는 중에 에러를 마주했다. 'ORA-01795 maximum number of expressions in a list is 1000 in bi publisher' 확인해보니 Oracle은 9버전 이후부터 in 절에 1000개가 넘는 데이터를 허용하지 않고 있기 때문에 발생하는 에러였다. // in절에 다량의 데이터로 인한 에러 발생 jpaQueryFactory. select(member). from(member). where(member.id.in(1,2,3,4 ... 1001)). fetch(); 해당 에러에 대해서 서비스에서 QueryDSL 사용 예시로 해결하는 방법을 포스팅 하려고..
Introduction 보통 데이터를 정렬하고 싶을때 SQL 의 OrderBy를 사용하거나 프론트 테이블이 받은 행의 데이터를 원하는 기준으로 정렬한다. 보통의 웹사이트의 게시글들은 최신이 위로 오거나, 특정 테이블 헤더를 눌렀을 경우 그 데이터를 기준으로 정렬을 한다던지 말이다. '만약 페이지네이션이 걸려 있는 페이지에서 '제목'이라는 헤더를 눌렀을 경우 데이터는 어떻게 정렬되어야 할까?' 기존의 조회된 첫 번째 페이지의 데이터만 제목을 기준으로 정렬이 되면 될까 ? 아니면 모든 데이터를 기준으로 제목이 정렬되어야 할까 ? 물론 사람마다 원하는 바가 다르겠지만, 만약 후자라면 프론트 테이블에서 지원하는 정렬로는 해결할 수가 없기 때문에 결국 다시 서버로 요청을 해야한다. 그렇기 때문에 특정 정렬 조건..
Introduction 예전에 QueryDSL 를 통해 데이터를 조회할 때 바로 DTO 객체로 응답 받는 방법을 포스트(https://mokggang.tistory.com/68) 했었는데. 자식 객체 기준에서의 부모 객체를 조회하는(Object in Object) 것 말고, 부모 객체 기준으로 자식객체를 조회하는(ObjectList in Object) 데이터가 필요한 경우 '일대다 관계의 부모와 자식 엔티티를 Join 으로 모두 조회 할 경우에도 DTO 객체로 응답 받아서 사용할 순 없을까 ?' jpaQueryFactory. select( team.id, team.name )). from(team). join(team.memberList, member) fetch(); 위와 같이 TeamDTO 객체 ..
Introduction 서비스 로직에서 특정 데이터를 업데이트, 즉 변경 하기 위해서 JPA 를 사용할 경우 일반적으로 DirtyChecking 을 통해 업데이트를 진행한다. 하지만 다수의 데이터를 일괄적으로 변경을 해야하는 경우에는 다수의 조회 및 업데이트 쿼리가 발생하기 때문에 성능적으로 좋지 않다. 그런 경우 JPQL 을 통해 업데이트 쿼리를 직접 작성하여 Bulk 업데이트를 진행하기도 하는데. Querydsl를 통해 문자열로 이루어진 JPQL 업데이트 쿼리의 Set 파라미터를 동적으로 업데이트를 진행할 수 있다. Bulk update 1.JPQL JPQL을 통한 기본적은 Bulk Update는 단순한 문자열 형태로 진행된다. 아래 코드는 Repository에서 나이와 유저아이디로 해당 유저들의 ..
Introduction 특정 웹사이트를 보면 검색조건들이 존재한다. 회원검색을 예를 들자면, 회원 목록을 조회할 경우 여러가지 검색 옵션들을 지정해 리스트를 보여준다. 1. 이름 검색 2. 이름 + 나이 검색 3. 이름 + 나이 + 성별 검색 이렇게 여러가지 조건에 따라 그에 부합하는 회원 목록을 보여주기 위해서 해당 회원 조회 쿼리에 조건들을 추가한다. 단순히 Spring Data Jpa 만 사용할 경우에는 인터페이스를 통해 조건에 맞는 함수를 추가적으로 만들어 주어야한다. 하지만 검색조건들이 다양한 만큼 조건에 해당하는 함수를 모두 만드는 일은 쉽지 않다. 이를 QueryDsl 에서 동적으로 검색조건을 동작할 수 있게 지원한다. 조건 검색 1. Spring Data Jpa 인터페이스를 활용한 조..
Introduction 백엔드에서 일반적으로 서비스 로직을 구성할 때 매개변수와 전달인자로 DTO를 사용한다. 여러가지 이유가 있겠지만, 필자가 생각하는 기본적인 이유는 1. 데이터의 종류와 타입 등 클라이언트의 요구사항이 다르다. - 서비스에서 클라이언트의 요구사항에 맞는 데이터를 가공 및 추가하는 과정이 필요하고, 불필요한 데이터를 응답할 필요가 없다. 2. Entity 객체의 필드 값을 예상하기 힘들다. - Entity 객체는 특정조건에 따른 결과물일 수도 있기 때문에 특정 데이터에 관해 직관적이지 못하고, 코드 추적이 불가피하다. 3. Entity 객체의 데이터의 무결성 - 서비스 로직에서 전달인자와 매개변수로 Entity 객체를 사용하게 되면, 의도치 않게 Entity의 값이 변경될 경우 JPA..