반응형

JPA 25

[kotlin] Querydsl-JPA GroupBy 사용했을 경우 Paging처리 방법

들어가기 전에 Querydsl-JPA를 사용할 때 Query에 GroupBy 절이 포함된다면 fetchCount(), fetchResults() 메서드를 사용할 수 없습니다. 정확히 count() 를 사용할 수 없습니다. 이럴 경우 PageImpl을 사용하여 Paging 처리해야 하는 경우에 대해서 정리해보겠습니다. 모든 소스는 Github에 올려두었습니다. 에러발생 GroupBy절을 포함하고 fetchCount(), fetchResults() 메서드를 사용하면 아래와 같은 에러가 발생합니다. Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: having near line 5, column 1 GroupBy를..

Develop/spring-data 2021.08.06

[JPA] deleteAll() vs deleteAllInBatch()

이번 글은 본인이 프로젝트하던 중 크게 착각하여 데이터를 깔끔하게 지워버린 경험을 토대로 작성합니다. ( 팀원분들 다 죄송합니다.... 그나마 개발 DB여서 천만 다행이었습니다. ) 절대 저와 같은 실수를 하지 않기를 바라면서 작성합니다. 먼저 결론부터 작성하자면 deleteAll(), deleteAllInBatch()는 되도록이면 쓰지말자. 두 메서드 모두 Repository와 매핑되어있는 테이블의 데이터를 깔끔하게 지우는 명령입니다. 두 메서드가 어떻게 다른지 구현 코드를 살펴보겠습니다. deleteAll() @Repository @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepositoryImpleme..

Daily Develop 2021.07.28

Querydsl-JPA 코틀린스럽게 작성하기 ( 설정 포함 )

글 작성 목차는 아래와 같습니다. Kotlin Project에 Querydsl-JPA 설정 Kotlin스럽게 작성하기 Kotlin Project Querydsl-JPA 설정 먼저 Spring Initializer를 이용하여 Kotlin 프로젝트를 생성해보자! Build Script : Gradle Language : Kotlin Packaging : Jar Spring Web : Web Project를 위한 디펜던시 ( @RestController, @Service ... ) Spring Data JPA : JPA를 설정을 위한 디펜던시 ( Entity, Repository ) H2 Database : Entity기반으로 테이블을 생성할 메모리형 데이터베이스 코틀린 프로젝트를 만들고 build.gradl..

Develop/kotlin 2021.04.29

[Kotlin] Spring-Batch 적용

이 글은 Kotlin으로 Spring Batch를 구현한 내용을 정리한 내용입니다. 코드의 양이 많아 중요한 부분 위주로만 작성하였습니다. 모든 코드는 Github에 있습니다. 참조해주세요. 글을 작성하기에 앞서 작업한 내용은 지난번 작성한 글을 기준으로 작성하였습니다. 함께보시면 이해하시기 편할 것 입니다. 이 글에서는 Spring-Batch가 무엇인지에 대해서는 다루지 않겠습니다. Spring-Batch를 Java, Querydsl-JPA로 구현이 가능해야 이해하는 데 무리가 없을 것입니다. build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { val kotlinVersion = "1.4.31" id("org..

[Querydsl] 성능개선 - 2편 ( N + 1 )

이 글은 우아한 형제들 콘서트에서 이동욱님의 영상을 보고 정리를 위한 글입니다. 이 글에 작성된 예시는 모두 Github에 올려두었습니다. N + 1 Entity 기반인 Jpa, Querydsl 을 사용하다 보면 N + 1은 한번 씩 겪는 문제라고 생각합니다. N + 1이 무엇이고 왜 발생하는지 알아보겠습니다. 먼저 아래의 코드를 살펴보겠습니다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @DynamicUpdate @DynamicInsert public class House { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String n..

Develop/spring-data 2021.02.01

[Querydsl-JPA] Querydsl JPA를 사용하며.. "*" 아스타리스크 사용방법

개발할 때 테이블의 모든 컬럼을 조회할 경우가 있습니다. 그때 Querydsl-JPA를 사용할 때 어떻게 사용할 수 있는지 작성해보겠습니다. 모든 소스는 github에 올려두었습니다. 먼저 하고 싶은 쿼리가 어떤 것인지 작성해보겠습니다. select s.* , etc_option from staff s join store st on s.store_id = st.id where s.name = 'staffV' limit 1 이것과 동일한 Querydsl을 작성해보겠습니다. 먼저 Vo를 생성합니다. @Getter @Setter @ToString public class StaffEtcVo { private Staff staff; private String address; } 필드에 Staff Entity를 선..

Develop/spring-data 2020.12.20

[Querydsl] Querydsl을 적용하며.. class 파일명 주의

querydsl을 적용한 프로젝트를 진행하면서 나온 이슈를 정리해보겠습니다. JPARepository에서 Querydsl을 사용할 수 있게 Custom(interface), impl 로 세팅이 되어있었습니다. 세팅방법은 여기를 참조해주세요. 데일리 미팅 도중 Custom Interface의 naming을 변경이 확정되었습니다. AS-IS : CustomizedDomainRepository TO-BE : DomainQueryRepository Customized란 단어는 너무 포괄적이어서 변경하기로 결정! 증상 Class명을 변경하고 Application을 실행하자 에러가 발생하였습니다. No property search found for type Staff! Staff는 Entity 객체입니다. 구현 된..

Develop/spring-data 2020.12.18

[Querydsl] Querydsl 사용방법 3가지

직장 동료의 조언 덕분에 Querydsl 설정 방법에도 여러가지가 있다는 것을 알았습니다. 지난번에 작성한 Spring Data JPA 기반 Querydsl 사용해보자. ( Entity 관계 매핑 편, 테스트 코드 포함 )글에서는 QuerydslRepositorySupport를 상속받아 사용하는 방법에 대해서 작성하였습니다. 이번글에서는 이 것외에도 2가지가 더 있고 어떤 것을 선택했는지까지 작성하겠습니다. 모든 소스는 Github에 있습니다. 이동욱님의 티스토리를 참조해서 작성하였습니다. (https://jojoldu.tistory.com/372) Querydsl 사용방법 3가지 QuerydslRepositorySupport 상속받아 사용 JpaRepistory에서 Querldsl 사용 가능하도록 설정..

Develop/spring-data 2020.12.07

org.springframework.dao.InvalidDataAccessApiUsageException

오늘도 어김없이 등장하는 Exception!! org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query 증상 Querydsl로 Update, Delete하던 중 에러가 발생하였습니다. 에러가 발생한 코드는 다음과 같습니다. public Long deleteQuery(Long id) { // JpaQueryFactory 사용 시 // return jpaQueryFactory.delete(store) // .where(s..

TroubleShooting 2020.12.05

[JPA] JPA를 적용하며.. ( field convert 편 )

오늘도 JPA를 적용한 프로젝트를 진행 중입니다. 지난글 [JPA] JPA를 적용하며.. ( insert, update 분기 편 ) 에서는 insert, update 분기를 if문 없이 처리하는 유틸리티 함수를 적용했습니다. 이번글에서는 Entity의 field를 convert하는 방법에 대해서 정리하겠습니다. 사건 전말 Database Table 컬럼 중 동적으로 변하는 데이터가 있었습니다. 우리는 해당 컬럼을 varchar 타입으로 주고 Json 방식으로 저장하기로 하였습니다. 아래에 관련 table과 필드 ddl입니다. create table staff ( id bigint auto_increment primary key, age int null, name varchar(255) null, meta..

Develop/spring-data 2020.11.30

[JPA] JPA를 적용하며.. ( insert, update 분기 편 )

프로젝트를 진행하면서 JPA를 도입하였습니다. 지난글( [JPA] 프로젝트에 JPA를 적용하며.... ( save편 ) )에서는 JPA의 영속성을 이용하여 insert, update를 처리하는 방법에 대해서 정리하였습니다. 도입 배경 및 JPA 적용방법에 대해서 궁금하시면 제 블로그에 "JPA" 로 검색하시면 Querydsl, 로깅 처리방법까지 정리해두었습니다. insert, update를 메소드로 분리하여 각각 처리하였습니다. 그런데 한 메소드에서 처리할 수 없을까? 하고 고민하고 적용한 내용을 정리하겠습니다. 같은 API로 데이터가 있으면 update하고 없으면 insert하는 메소드 예제를 작성해보겠습니다. @Service @RequiredArgsConstructor // 의존성 주입 public ..

Develop/spring-data 2020.11.27

[JPA] 프로젝트에 JPA를 적용하며.... ( save편 )

이번 프로젝트를 진행하면서 JPA와 Querydsl을 도입하였습니다. SI 회사에서 근무했을 당시에는 mybatis를 사용했었습니다. SI 프로젝트는 90%이상이 mybatis일 것입니다. 그리고 스타트업으로 이직한 후 첫 프로젝트에서도 역시 mybatis를 사용했습니다. 미리 공부해뒀다면 jpa를 썼을텐데... 아쉬운 마음에 학습하고 이번 프로젝트를 진행할 떄 도입하기로 결정이 났습니다. ( 드디어..! ) Repository를 이용하여 findById(), save(), 그외 등등.. 을 사용하였습니다. 혹시나 프로젝트 기술스택에 대해서 궁금해하시는 분들을 위해서 적어봅니다. - - Querydsl-jpa - p6spy ( log설정 ) - pinpoint ( 모니터링 ) - flyway ( 기술검토..

Develop/spring-data 2020.11.26

Spring Data JPA, Querydsl 로깅처리. p6spy 원하는 로그만 출력하기

바로 여기로 오셨다면 이전 글을 참조해주세요. 왜 p6spy를 선택했는지와 분석하는 이유에 대해서 정리해놓았습니다. jpa, querydsl 적용 시 로깅 비교. querydsl로 작성한 쿼리 DBMS에서 쉽게 돌리는 방법. 1탄! jpa, querydsl을 사용했을 때 불편한 점과 해결 방법(로깅) 및 로깅의 종류에 간략하게 알아보았습니다. jpa, querydsl 적용 시 로깅 비교. querydsl로 작성한 쿼리 DBMS에서 쉽게 돌리는 방법. 2탄! p6spy 적용방법을 알아보았습니다. Spring Data JPA, Querydsl 로깅처리. p6spy pretty하게 설정하기 p6spy 로깅 출력을 pretty 적용 이번 글에서는 p6spy를 사용하는데에 편리한 설정들이 뭐가 있는지 알아보는 과..

Develop/spring-data 2020.11.16

Spring Data JPA, Querydsl 로깅처리. p6spy pretty하게 설정하기

바로 여기로 오셨다면 이전 글을 참조해주세요. 왜 p6spy를 선택했는지와 분석하는 이유에 대해서 정리해놓았습니다. jpa, querydsl 적용 시 로깅 비교. querydsl로 작성한 쿼리 DBMS에서 쉽게 돌리는 방법. 1탄! jpa, querydsl을 사용했을 때 불편한 점과 해결 방법(로깅) 및 로깅의 종류에 간략하게 알아보았습니다. jpa, querydsl 적용 시 로깅 비교. querydsl로 작성한 쿼리 DBMS에서 쉽게 돌리는 방법. 2탄! p6spy 적용방법을 알아보았습니다. 이번 글에서는 p6spy를 사용하는데에 편리한 설정들이 뭐가 있는지 알아보는 과정과 적용하는 것까지 정리하겠습니다. 작성된 글의 소스 코드는 github에 올려두었습니다. JPA, Querydsl 설정 방법은 아래..

Develop/spring-data 2020.11.13

jpa, querydsl 적용 시 로깅 비교. querydsl로 작성한 쿼리 DBMS에서 쉽게 돌리는 방법. 2탄!

이전 글 ( jpa, querydsl 적용 시 로깅 비교. querydsl로 작성한 쿼리 DBMS에서 쉽게 돌리는 방법. 1탄! ) 에서 jpa, querydsl을 사용했을 때 불편한 점과 해결 방법(로깅) 및 로깅의 종류에 간략하게 알아보았습니다. 이번 글에서는 최종적으로 선택된 로깅 방법인 p6spy에 대해서 정리하겠습니다. 작성된 글의 소스 코드는 github에 올려두었습니다. JPA, Querydsl 설정 방법은 아래 링크를 참조해주시면 됩니다! JPA에 대해서 궁금하시면? JPA란? JPA 시작 그리고 예제 JPA 테스트 코드로 알아보자! Querydsl에 대해서 궁금하시면? Querydsl란? Querydsl 사용해보자. ( 설정편 ) Querydsl plugin 실행방법 Querydsl 사용..

Develop/spring-data 2020.11.12
728x90
반응형