유저 권한에 따라 모든 쿼리에 조회조건이 추가되야 하는 경우가 생겼다.예를 들면 '본인 소속 데이터만 조회해야 하는 권한자 일 경우' 매 쿼리마다 유저권한을 체크해서유저 부서와 쿼리 데이터를 비교하는 조건절을 추가해야 하는 상황이 생겼다. 제네릭하게 구현해보려다가PathBuilder 를 사용해서 모든 엔티티를 비교하는 메소드를 작성하였다. PathBuilder 란? QueryDSL 에서 제공하는 유연한 클래스이며,엔티티의 QClass를 직접 사용하는 대신, 동적으로 엔티티의 속성에 접근할 수 있는 클래스이다.동적으로 생성된 엔티티나 필드를 다룰때 유용하다. PathBuilder 의 특징이라면QClass 없이 엔티티에 접근가능하고제네릭 메소드와 함께 사용하여 런타임 오류를 방지하고특정 엔티티..
이번에 poi 라이브러리 버전으로 이슈를 겪어 남겨본다. 내부에 ibSheet8 이라는 그리드를 사용하는데해당기능에서 엑셀다운로드 기능이 포함되어 있어 사용하게 되었다. ibsheet 측 개발문서에 보면poi 3.13 버전과 poi4.1.2 버전에 대해 구분을 지어놓았다. 당연히 나는 poi 3 버전은 보안취약점이 존재하는 버전이라자연스럽게 4.1.2 를 채택하여 디펜던시를 추가하였다.(애초에 인텔리제이에서도 4.1.1 이상으로 업데이트 하라고 표기됨...) 인텔리제이에서 개발하고 테스트할때 까지는 문제가 없었다. 동작을 아주 잘 했기 때문.허나 운영에 배포하자 엑셀 스타일이 적용이 안되는 것을 확인하였다. 처음엔 엑셀 요청자체가 Response 200 으로 응답되서 오류가 없는줄 알았느나로그열..
게시글을 올리고 삭제했을때,데이터를 완전 삭제해버리는 Hard Delete 방식과데이터를 남기는 Soft Delete 방식이 존재한다. 어떻게 운영하냐에 따라서 각각의 방식을 사용할 수 있다. 사내 백오피스를 리뉴얼하면서 레거시를 보니어떤 메뉴는 Hard 방식 어떤메뉴는 Soft 방식을 혼용하고 있었다. 그래서 동일하게 가져가기 위해 모든 메뉴의 삭제기능을 soft 방식으로 가져가려고 한다. JPA 엔티티에 @SQLDelete 어노테이션을 사용하여Delete 명령시 Update로 삭제유무 컬럼을 조정하게 해줄 수 있다. 적용한 엔티티는 아래와 같다.@Entity@Table(name="sample")@SQLDelete(sql = "UPDATE sample SET DELETE_YN = '..
매번 같은 형태의 데이터를 각 메뉴마다 지속적으로 사용한다면큰 부하는 아니지만 DB에 수시로 접근하여 조회를 해와야 한다. 여기서 복잡도가 올라가게 되고 조회해오는 항목들이 방대해지면 이제 점차적으로 DB에 부하를 야기하게 될 것이다. 그래서 반복 호출 되는 이러한 것들을 기존에 사용하고 있는 Redis 활용하여 cache 로 사용하고자 한다. 심플하게 한번 적용해보자Redis data 를 build.gradle 에 추가한다.implementation 'org.springframework.boot:spring-boot-starter-data-redis' application 프로퍼티에 redis 를 설정한다(필자는 기존에 redis session을 사용하고 있어서 되어있었다.)spr..
운영서버에 로그파일을 계속 만들게 되면언젠가 용량이 너무 많아서 디스크제한에 문제가 발생하게 된다. 그래서 적당한 시점에 로그파일을 압축한 뒤 보관하거나오래된 로그파일을 삭제하도록 설정해줘야 할 필요가 있다. 나는 간단하게 로그파일이 기준 용량을 넘으면 압축해서 보관하고 히스토리 갯수가 일정갯수 넘어가면 지우게끔 처리하였다. // application.yml...---spring: config: activate: on-profile: was1 logging: level: root: info file: name: /data/log/was1.log logback: rollingpolicy: max-file-size: 10MB max-hi..
날짜포맷의 데이터만 있을 때, 날짜형식의 데이터만 있을 때, 주간 요일을 표현해줘야 하는 방법은 아래와 같다. ${#temporals.format(#temporals.createDate(data.today, 'yyyy-MM-dd'), 'EE', 'ko')}${#temporals.format(#temporals.createNow(), 'EE', 'ko')} 문자형식의 날짜는 createDate 를 이용해서 날짜로 변환 해줘야 한다. 날짜 패턴에서 E 는 주간요일을 뜻하는데 EEEE 를 쓸 경우 주간요일 풀네임,EEE, EE, E 를 쓸 경우 주간요일 단축네임이다. locale 을 'ko' 로 하면 한글로 'en' 으로 하면 영문으로 표기 된다. 위 이미지 처럼 사용하기 위해 코드를 ..