본문 바로가기

Java & Kotlin100

[QueryDSL] Spring Data JPA와 QueryDSL 사용하기 Spring Data JPA와 QueryDSL 사용하기 지금까지 본 QueryDSL은 EntityManager을 직접 받아 개별적으로 JPA 환경에서 사용하는 것이였다. 이제 Spring Data JPA와 함께 사용하여 더 효율적으로 QueryDSL을 사용해보자. 사용자 정의 리포지토리 사용자 정의 리포지토리의 구성 기존 Spring Data Repository는 MemberRepository interface가 JpaRepository interface를 상속받는다. QueryDSL 사용을 위한 MemberRepositoryCustom interface를 생성하고, QueryDSL을 사용할 메서드를 생성한다. MemberRepository interface는 MemberRepositoryCustom i.. 2022. 5. 15.
[QueryDSL] 벌크연산과 SQL Funtion 벌크연산과 SQL Function 쿼리를 이용하면 일정한 조건에 해당하는 데이터에 공통적으로 수정해야 하는 일이 있다. 이 때 벌크 연산을 이용한다. 벌크연산 long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); member의 age가 28 이하인 경우 username를 비회원으로 수정하는 벌크연산이다. query와 동일하게 update, delete등을 이용한다. 벌크연산의 주의할 점은 spring data jpa와 다르게 영속성 컨텍스트에 있는 엔티티를 무시하고 데이터베이스에 직접 실행된다. 그렇기 때문에 배치 쿼리를 실행하고 나면 영속성 컨텍스트를 초기화 하는.. 2022. 5. 15.
[QueryDSL] 동적쿼리 동적쿼리 QueryDSL에서 동적 쿼리를 이용하는 방식에는 BooleanBuilder과 Where 다중 파라미터 사용 방법이 있다. BooleanBuilder 사용 BooleanBuilder builder = new BooleanBuilder(); if (usernameCond != null) { builder.and(member.username.eq(usernameCond)); } if (ageCond != null) { builder.and(member.age.eq(ageCond)); } return queryFactory .selectFrom(member) .where(builder) .fetch(); BooleanBuilder을 이용하면 where절에 들어갈 값을 미리 생성할 수 있다. 이 때 동.. 2022. 5. 14.
[QueryDSL] 프로젝션 프로젝션 QueryDSL에서 프로젝션을 사용하는 방법을 알아보자. 프로젝션: select 절에 조회 대상을 지정하는 것 ex) Dto로 조회 기본 List result = queryFactory .select(member.username) .from(member) .fetch(); 프로젝션: select 대상 지정 프로젝션 대상이 하나면 리턴되는 타입이 해당 타입으로 반환된다. 튜플 조회 List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); 여러 컬럼을 조회할 때에는 com.mysema.query.Tuple 타입을 사용해서 반환된다. 조회 결과는 result.get(member.username)과 같은.. 2022. 5. 14.
[QueryDSL] QueryDSL 기본문법 QueryDSL 기본문법 기본적인 조회 Member findMember = queryFactory .select(member) .from(member) .where(member.username.eq("member1")) .fetchOne(); QueryDSL을 이용한 기본적인 where절을 이용한 조회이다. QMember와 같이 QType 클래스를 static import하여 사용하면 간결한 코드를 구성할 수 있다. 별칭을 다르게 두어야 한다면 새로 선언하자. 검색조건 Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1").and(member.age.between(10, 30))) .fetchOne(.. 2022. 5. 11.
[QueryDSL] QueryDSL 시작하기 QueryDSL 시작하기 JPA와 Spring Data Jpa를 사용하면서 동적인 쿼리를 더 잘 사용하기 위해 QueryDSL을 배우기로 했다. JPQL을 사용하는 것과 다르게 QueryDSL을 사용하면 몇가지 이점이 있다. 쿼리를 문자가 아닌 코드로 작성하기 때문에 compile시점에 에러를 잡을 수 있다. 쉽고 간결하다. 형태가 쿼리와 비슷하다. 쿼리(데이터)를 조회하는 데 기능이 특화되어 있다. 프로젝트 설정하기 build.gradle buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.6.7' id 'io.spring.dependency-management' versio.. 2022. 5. 10.
[JPA] UniqueConstraint와 Embedded field UniqueConstraint와 Embedded field JPA를 이용해 Entity 구성 중 Embedded로 구성된 필드와 함께 Unique 제약조건을 사용해야 하는 상황이 생겼다. 문제 발생 2022-05-07 15:03:12.463 ERROR 9907 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create unique key constraint (work_date, staff_id) on table work: database column 'work_date' not found. Make sure that you use the.. 2022. 5. 7.
[Spring] IDE에서 잘 접근되던 페이지가 서버에서는 접속되지 않을 때 IDE에서 잘 접근되던 페이지가 서버에서는 접속되지 않을 때 간간히 활동하고 있던 Holix라는 커뮤니티에서 나온 질문 spring boot로 만든 게시판 프로젝트를 ncloud에 올려서 빌드를 했더니 400 에러 뜨면서 MethodArgumentTypemismatchException이 발생하네요 로컬에선 잘 되는데 클라우드에 올리면 에러가 생깁니다 왜 이런가요 ?? 문제 질문자의 상황은 인텔리제이에서는 template 디렉토리 아래의 html이 잘 접근되는데 클라우드 서버에서 실행하면 에러가 발생하는 현상이였다. 문제가 발생한 이유 질문자의 현재 상황 @GetMaping("~~~") public String ... { ... return "/aaa/bbb" } 위 코드를 보고 첫번째로 든 생각은 왜 r.. 2022. 4. 30.
[JPA]영속성 전이 CASCADE 영속성 전이 CASCADE JPA를 사용하면서 CASCADE 옵션은 repository의 save, delete 메서드를 한번이라도 덜 쓰게 해주기에 최대한 활용할 수 있게 노력하는 편이다. 매번 책으로 확인하기보다 한번 제대로 정리하려 한다. CASCADE란? 영속성 전이(CASCADE): 특정 엔티티를 영속상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때에 사용하는 기능 CascadeType으로 ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH가 존재한다. ALL: 모두 적용 PERSIST: 영속 MERGE: 병합 REMOVE: 삭제 REFRESH: REFRESH DETACH: DETACH 주로 @OneToXXX연관관계에 사용한다. @OneToXXX(Ca.. 2022. 4. 21.