JPA 8

CustomRepository의 PropertyReferenceException

작업하면서 오랜만에 QueryDsl을 사용하기위해 커스텀 레포지토리를 만들어서 작업하는동안 발생한 오류를 정리해보려고 한다. 발생했던 오류메시지의 맨 아랫부분은 아래와 같고, 위쪽도 찬찬히 읽어보니 의존성, 빈생성을 실패했다는 걸 알 수 있었다. 당시 코드 구성은 대략 다음과 같았다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 // 글 내용을 간략하게 위해 한 페이지에 모두 서술 // Spring Data의 JpaRepositor..

SPRING FRAMEWORK 2023.04.28

QueryDsl에서 서브쿼리 사용하기

최근에 비슷한 유형의 일들만 하다보니 글을 쓸만한 주제가 없었는데, 마침 지금 개발하고있는 부분에서 QueryDsl의 서브쿼리를 사용할일이 생겨서 개발하면서 알게된 점들을 간략하게나마 정리해본다. 먼저 QueryDsl에서 서브쿼리는 인라인뷰(from절 서브쿼리)를 제외하고는 사용할 수 있도록 지원하고 있으며 개인적인 생각으로 from절 서브쿼리는 대부분의 경우에 join을 통해 해결할 수 있다고 생각하기 때문에 지원하지 않는다고해서 문제가 되지는 않는다고 생각한다. QueryDsl의 의존성은 다음과 같이 추가해주면 된다. 1 2 3 4 5 6 7 8 9 10 11 12 com.querydsl querydsl-apt ${querydsl.version} provided com.querydsl querydsl..

SPRING FRAMEWORK 2021.09.13

@Transient 어노테이션 사용해보기

최근 개발을 하던 중 특정 테이블에서 조회를 해올때 외래관계가 없는 테이블에서의 값을 조회한 다음 하나의 객체로 클라이언트단으로 전달해주고 싶은 상황이 생겼다. 그래서 최초 조회를 하는 테이블의 엔티티에 변수를 선언해서 SET을 하면 되겠다라는 생각까진 했으나, 한 가지 문제가 있었다. 엔티티(모델) 클래스 내에 선언되어 있는 변수는 JPA에서 테이블의 컬럼이 된다는 것인데, 어떻게 하면 컬럼으로 처리되지 않고 무시되게 할 수 있을까하며 찾아본 결과 @Transient라는 어노테이션을 찾을 수 있었다. 대충 공식 문서를 찾아보니 @Transient이 선언되어있는 경우 해당변수(메소드)는 임시데이터로 보고 테이블과 매핑을 하지않는다는 것 같다. 이제 코드로보면 나는 다음과 같이 사용했다. 123456789..

SPRING FRAMEWORK 2021.01.15

Spring JPA에서 @Query를 사용하는 방법.

Spirng JPA는 EntityRepository를 이용해 CRUD(생성,조회,수정,삭제)를 쉽게 할 수 있게 지원하지만, 떄떄로 개발을 하다보면 서로 연관관계가 없는 테이블을 조인을 통해 핸들링 해야할일이 꽤나 빈번하게 있다. 위와 같은 상황이 발생할 때 고민해볼만한 방법은 QueryDsl를 이용하거나(이 경우는 DTO가 필요) @Query 어노테션을 이용해 sql문을 작성하는 방법이 있는데, 오늘은 @Query 어노테이션을 이용하는 방법을 아주 간단하게 정리하려고 한다. 딱히 어려운 부분은 없을 것 같아서 코드로 정리하자면 다음과 같다. 12345678910// import 생략// QuerydslPredicateExecutor은 QueryDsl을 사용하기 위해 상속해 둠public interfac..

SPRING FRAMEWORK 2020.09.22

JPA annotation @DynamicUpdate?

오늘은 테이블에 대한 Entity를 만들 떄 항상 선언해 주었던 @DynamicUpdate에 대해서 정리해본다. 기본적으로 @DynamicUpdate는 Spring JPA에서 제공하는 기능이다. (JPA, Hibernate, Spring JPA가 같은 의미는 아님) 개발을 하면서 @DynamicUpdate 어노테이션이 무슨역할을 하는지도 모른채 대부분의 Entity에 선언해줬었는데, 최근들어 왜 선언해야하는지 궁금증이 생겨서 조금 조사해봤다, 간단하게 정리하면 다음과 같다. JPA는 서버가 실행될 때 CURD에 관한 SQL문을 캐싱해놓는데, 여기서 UPDATE문에 UPDATE 대상이 모든 열로 선언되어 있다는 거다, 컬럼(필드)가 20개라면 20개 컬럼에 대한 업데이트문이 선언되어 있는 것이다. (upd..

SPRING FRAMEWORK 2020.05.07

JPA의 엔티티에서의 카운팅(@Formula)

JPA를 이용해 개발하다보면 모호한 부분이 많은 것 같은데 대표적인게 JPA, Hibernate, Spring JPA인 것 같다. 여기서 정리 할 내용은 아니지만 간단히 설명하면 JPA는 기술명세, Hibernate는 인터페이스, Spring JPA는 Hibernate를 스프링 프레임워크에서 쉽게 사용할 수 있게 모듈화? 해놓은 것이라는데 이게 무슨소린지 아직도 좀 어렵다. 이 이야기를 하는 이유는 오늘 설명한 @Formula는 Hibernate의 기능이기 때문이다. 현재 내가 개발하면서 @Formula를 사용하는 경우는 조건절로 사용하거나, 집계된 데이터가 필요할 때 사용하고 있는데, 이외의 경우에도 사용할 수 있는지는 파악해보고 있다. 먼저 @Formula에 대해서 간단한 설명을 하자면, 데이터베이스..

SPRING FRAMEWORK 2020.05.03

Querydsl에서 DTO를 사용하는 방법

개발을 하고 있는데, 서로 연관 관계가 없는 테이블간에 데이터를 가져와야 할 일이 있었다, 각 Entity들에 @OneToMany나 @ManyToOne 어노테이션을 이용해 데이터를 가져오는 방법도 고려해보았으나, 위 방법은 제일 간단한 방법이였지만, 서로 연관관계도 없는 Entity에 @ManyToOne나 @OneToMany을 이용하는 건 코드품질상, 관리적 측면에서 올바르지 않다고 판단되었다, 따라서 querydsl을 이용해 데이터를 가져오기로 했으나, 막상 코드를짜서 실행해보니, 맨 앞에 선언되어있는 엔티티의 데이터만 가져오고 조인된 나머지 데이터들을 가져오지 못하는 문제가 발생했다. DTO를 이용해 데이터를 받아야겠다는 생각까지는 도달했으나, 당최 JPA서는 DTO를 어떻게 사용해야하는지 감이 안잡..

SPRING FRAMEWORK 2020.03.04

JPA @Modifying ??

개발을 하던도중 delete from table where id = id 에 해당하는 기능을 JpaRepository를 이용해 구현해야 할일이 있어서 deleteById를 구현체로 만들었더니 Not supported for DML operations 이라는 오류를 확인하게 되었다.. 따라서 검색을 해본결과 JPA에서 DDL과 insert, delete, update에 해당하는 쿼리에는 select 쿼리가 아니라는 나타낼 수 있는 @Modifying 어노테이션을 선언해줘야 사용할 수 있다는 것이였다. @Modifying 어노테이션을 선언해주니 실행해보니 잘 동작한다.. 그런데 왜 selelct문을 제외한 쿼리에서는 저 어노테이션이 필요한지는 조금 더 알아봐야 할 것 같다. public interface T..

SPRING FRAMEWORK 2020.03.03