
유저 권한에 따라 모든 쿼리에 조회조건이 추가되야 하는 경우가 생겼다.예를 들면 '본인 소속 데이터만 조회해야 하는 권한자 일 경우' 매 쿼리마다 유저권한을 체크해서유저 부서와 쿼리 데이터를 비교하는 조건절을 추가해야 하는 상황이 생겼다. 제네릭하게 구현해보려다가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 = '..

DB쪽을 엄청 빠삭하게 아는건 아니지만 JPA 사용하다가 DB 마다의 구조적 차이점이 꽤 영향을 주는걸 알게 되면서 간단하게 남겨본다. 보통은 데이터베이스 - 스키마 - 테이블 구조로 되어있고 데이터베이스 설정을 하고 엔티티에서 테이블 이름만 지정해놓고 사용하면 기본 디폴트 스키마를 기준으로 테이블 조회를 하게 되는데 다른 데이터베이스나 스키마를 다중 참조해야 할 때, 이 부분이 DB마다의 계층구조로 약간 상이해지는걸 발견했다. 모든 DB의 구조를 잘 안다면 큰 문제가 없었겠지만, 몇가지 DB만 쭉 사용하다가 어쩌다가 다른 DB를 쓸때 동일하게 설정했는데 table이 없다는 오류를 보고서 왜!!! 를 시전한것 같다. 보통 oracle 은 하나의 인스턴스에 계정별 스키마로 접근하게 되어있어 @Entity ..

이벤트 실행시점 설명 @PrePersist 엔티티가 생성될 때 엔티티가 생성될 때마다 실행되어야 하는 로직을 구현하는 데 사용됩니다. 예를 들어, 엔티티가 생성될 때마다 현재 날짜를 값으로 설정하는 로직을 구현할 수 있습니다. @PreUpdate 엔티티가 업데이트 될 때 엔티티가 업데이트될 때마다 실행되어야 하는 로직을 구현하는 데 사용됩니다. 예를 들어, 엔티티가 업데이트될 때마다 변경된 값을 기록하는 로직을 구현할 수 있습니다. 특정값을 변경했을 때 변경일을 등록하는 부분을 작성할일 있었는데 나는 @PrePersist 가 Insert, Update 시에 동일하게 작동한다고 생각하고 코드를 작성했는데 Update 테스트를 아무리해도 적용이 되질 않아... 혹시 엔티티가 생성될 때만 되나하고 Insert..

JPA를 꾸준히 이용하며 학습중인데 이번에 테이블 연관관계를 설정하다가 복합키테이블을 연관지을일이 생겼다. 내 머리속으로 이해한데로 엔티티를 구성하고 테스트 쿼리를 수행했으나... 조인들이 제대로 걸리지 않았다. 그래서 무언가 복합키 상황일때 엔티티간 연관관계를 잘못 구성했는가 싶어 예제 테이블 만들어 다시 처음부터 구성해봤다. 테이블 구조는 아래와 같다. 사용자 정보가 있는 Users 테이블이 있고 권한정보가 있는 Roles 테이블이 있다. 그리고 유저에게 할당된 권한정보가 있는 UserRoles 테이블이 있다. UserRoles는 Users의 키와 Roles의 키를 포함하는 식별관계이다. UserRoles 엔티티의 키값이 2개가 되어 일반 엔티티를 구성할 수 없다. 이런 복합키를 가진 엔티티를 구성하..

Entity 클래스에 @Table 어노테이션 name을 대문자로 지정했는데 JPA에서는 소문자로 받는 상황 그래서 해당 테이블이 존재하지 않는다고 에러 발생 중인 상황 ;; (ddl-auto : validate 로 했을시) @Entity @Table(name="TB_USER", schema = "public" ) @NoArgsConstructor @Getter public class User { @Column(name="user_name") private String userName; @Id @Column(name="user_email") private String userEmail; @Column(name="user_age") private int userAge; } Entity 클래스는 다음과 같..