유저 권한에 따라 모든 쿼리에 조회조건이 추가되야 하는 경우가 생겼다.예를 들면 '본인 소속 데이터만 조회해야 하는 권한자 일 경우' 매 쿼리마다 유저권한을 체크해서유저 부서와 쿼리 데이터를 비교하는 조건절을 추가해야 하는 상황이 생겼다. 제네릭하게 구현해보려다가PathBuilder 를 사용해서 모든 엔티티를 비교하는 메소드를 작성하였다. PathBuilder 란? QueryDSL 에서 제공하는 유연한 클래스이며,엔티티의 QClass를 직접 사용하는 대신, 동적으로 엔티티의 속성에 접근할 수 있는 클래스이다.동적으로 생성된 엔티티나 필드를 다룰때 유용하다. PathBuilder 의 특징이라면QClass 없이 엔티티에 접근가능하고제네릭 메소드와 함께 사용하여 런타임 오류를 방지하고특정 엔티티..
게시글을 올리고 삭제했을때,데이터를 완전 삭제해버리는 Hard Delete 방식과데이터를 남기는 Soft Delete 방식이 존재한다. 어떻게 운영하냐에 따라서 각각의 방식을 사용할 수 있다. 사내 백오피스를 리뉴얼하면서 레거시를 보니어떤 메뉴는 Hard 방식 어떤메뉴는 Soft 방식을 혼용하고 있었다. 그래서 동일하게 가져가기 위해 모든 메뉴의 삭제기능을 soft 방식으로 가져가려고 한다. JPA 엔티티에 @SQLDelete 어노테이션을 사용하여Delete 명령시 Update로 삭제유무 컬럼을 조정하게 해줄 수 있다. 적용한 엔티티는 아래와 같다.@Entity@Table(name="sample")@SQLDelete(sql = "UPDATE sample SET DELETE_YN = '..
엔티티의 LocalDateTime 날짜형식 데이터를 년월(YYYY-MM) 로만 비교해줘야 하는 상황이 생겼다. 그 동안은 String 형식으로 넘어온 날짜데이터를 비교할 때, AttributeConverter 를 사용해서 mapstruct 에서나 querydsl 에서 사용해왔었다. [Mapstruct] LocalDateTime To String Converter, 엔티티와 DTO간 타입이 다를때 맵핑하기 (feat.AttributeConverter) 보통 날짜값을 사용할 때 db와 뷰와의 관계에서 컨버팅을 자주 하게 된다. DB에는 예쁘게 들어가있지만 사용자 화면에 그대로 뿌리면 보통 우리가 보던 포맷이 아니기 때문에 매우 별로다. 그래 jong-bae.tistory.com 그 동안 비교값을 LocalD..
DB쪽을 엄청 빠삭하게 아는건 아니지만 JPA 사용하다가 DB 마다의 구조적 차이점이 꽤 영향을 주는걸 알게 되면서 간단하게 남겨본다. 보통은 데이터베이스 - 스키마 - 테이블 구조로 되어있고 데이터베이스 설정을 하고 엔티티에서 테이블 이름만 지정해놓고 사용하면 기본 디폴트 스키마를 기준으로 테이블 조회를 하게 되는데 다른 데이터베이스나 스키마를 다중 참조해야 할 때, 이 부분이 DB마다의 계층구조로 약간 상이해지는걸 발견했다. 모든 DB의 구조를 잘 안다면 큰 문제가 없었겠지만, 몇가지 DB만 쭉 사용하다가 어쩌다가 다른 DB를 쓸때 동일하게 설정했는데 table이 없다는 오류를 보고서 왜!!! 를 시전한것 같다. 보통 oracle 은 하나의 인스턴스에 계정별 스키마로 접근하게 되어있어 @Entity ..
엔티티가 연관관계없이 특정 컬럼들만 조인해서 뽑아와야 할때가 있다. 이때 엔티티에 값을 담아서 리턴할 수 없어서 DTO에 반환해야 하는데 Projections 를 이용하면 보기좋게 코드를 작성할 수 있다. 먼저 Projections 내의 3가지 bean, fields, constructor 를 이용하는 방법과 @QueryProjection 어노테이션을 이용하는 방법이 있다. 활용해본 결과 Projections의 생성자를 이용하는 방법과 @QueryProjection 어노테이션을 이용하는 방법이 좋은 것 같고 프로젝트 상황에 따라 이 2가지를 사용하는게 이점이 있다고 본다. bean과 fields 방식은 DTO의 필드들과 네이밍이 동일하지 않으면 삽입이 안되서 다른 네이밍들은 직접 다 잡아줘야 한다. AE..
org.hibernate.hql.internal.ast.QuerySyntaxException: SampleEntity is not mapped 앞서 다중 DB를 사용하기 위해 설정하고 JPA + QueryDSL + Mybatis 를 이용할 수 있게 구성했는데 그 중 querydsl 을 사용할 때 Primary DB 는 크게 문제 없이 잘 작동 하였는데 sub DB 가 위와 같은 오류를 내뿜었다. 해당 오류는 db에 엔티티 테이블 맵핑을 찾을 수 없어서 나는 오류이다. [SpringBoot] 다중 Datasource, JPA+QueryDsl+Mybatis 사용 설정. 지난번에 이기종 DB 를 연결하기 위해 Datasource 를 분리하는 작업을 했었는데 거기에 덧붙여 JPA와 Mybatis를 사용할 수 있..