엔티티의 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를 사용할 수 있..
JPA 를 다중 Datasource 로 구성할때, LocalContainerEntityManagerFactoryBean 에서 프로퍼티를 setJpaPropertyMap 을 이용해 설정 할 때 key 값 리스트는 아래와 같다. hibernate.dialect : Hibernate가 사용하는 SQL dialect를 지정합니다. hibernate.hbm2ddl.auto : DDL 생성 전략을 지정합니다. hibernate.show_sql : SQL을 출력할지 여부를 지정합니다. hibernate.format_sql : SQL을 포맷할지 여부를 지정합니다. hibernate.use_sql_comments : SQL에 주석을 추가할지 여부를 지정합니다. hibernate.connection.driver_class..
이벤트 실행시점 설명 @PrePersist 엔티티가 생성될 때 엔티티가 생성될 때마다 실행되어야 하는 로직을 구현하는 데 사용됩니다. 예를 들어, 엔티티가 생성될 때마다 현재 날짜를 값으로 설정하는 로직을 구현할 수 있습니다. @PreUpdate 엔티티가 업데이트 될 때 엔티티가 업데이트될 때마다 실행되어야 하는 로직을 구현하는 데 사용됩니다. 예를 들어, 엔티티가 업데이트될 때마다 변경된 값을 기록하는 로직을 구현할 수 있습니다. 특정값을 변경했을 때 변경일을 등록하는 부분을 작성할일 있었는데 나는 @PrePersist 가 Insert, Update 시에 동일하게 작동한다고 생각하고 코드를 작성했는데 Update 테스트를 아무리해도 적용이 되질 않아... 혹시 엔티티가 생성될 때만 되나하고 Insert..
사내에 querydsl 설정을 아주 잘 하는 동료가 있다면 문제가 없겠지만, 저와 같이 홀로 분투하시는 분들을 위해 저도 지금까지 이 방법 저 방법 해오다가 깔끔하게 해결된 상태를 공유하고자 합니다. 저도 Q클래스 생성하는 법을 여러 설정법으로 올렸었고, 마주하던 여러 오류상황들을 조치했던 글을 서너개 포스팅 했는데... 지속적으로 불편한 상황들이 계속 발생 되었고, 주변 동료들에게도 빈번하게 발생하여 이 상황을 문제없게 해결하고자 QueryDSL 설정을 다시 건드려보게 되었습니다. 초반에는 설정에 대한 이해가 부족한 상태였던 것 같고 지속적으로 이 부분을 마주하다 보니 깨달음이 온 것 같네요. 이번 포스트는 인텔리제이에서의 방법입니다. 이클립스나 STS 를 사용하시는 분들은 아래 포스트로 진행하시면 아..
querydsl로 테스트 할께 있어서 q클래스를 가져다가 사용하는데 import 가 안되는 현상 발생... 잘 됐던 repository 에서도 인식이 안되고 기존 import 된 라인들이 다 인식 안되길래 프로젝트 트리를 보니 generated 폴더가 일반 폴더처럼 잡혀있는 것을 확인 Project Structure > Project Settings > Modules 에 가서 프로젝트명.main 을 선택하고 generated 폴더를 source 로 잡아준다. generated 폴더가 바뀌었다. 그리고 repository 가서 보니 Q클래스들이 정상적으로 인식되는 것을 확인했다. 이게 보니까 빌드툴을 IntelliJ IDEA 로 쓰면 알아서 잘 잡고 있는데 Gradle 로 쓸때 뭔가 어떤 상황에 의해 풀리..