// 쿼리 파라 미터 조회
@Transactional(readOnly = true)
public GetAdminListResponse getAllAdmins(String keyword, Integer page, Integer size, String sortBy, String sortDir, String role, String status) {
int safePage = (page == null || page < 1) ? 1 : page;
int safeSize = (size == null || size < 1) ? 10 : size;
Sort.Direction dir = "desc".equalsIgnoreCase(sortDir) ? Sort.Direction.DESC : Sort.Direction.ASC;
String safeSortBy = (sortBy == null || sortBy.isBlank()) ? "createdAt" : sortBy;
AdminRole roleEnum = (role == null || role.isBlank()) ? null : AdminRole.valueOf(role);
AdminStatus statusEnum = (status == null || status.isBlank()) ? null : AdminStatus.valueOf(status);
Pageable pageable = PageRequest.of(safePage - 1, safeSize, Sort.by(dir, safeSortBy));
Page<Admin> pageResult = adminRepository.findAllAdmins(keyword, roleEnum, statusEnum, pageable);
return GetAdminListResponse.from(pageResult);
}
// 관리자 리스트 조회 전용
@Query("""
select p from Admin p
where p.deletedAt is null
and (:status is null or p.status = :status)
and (:role is null or p.role = :role)
and (:keyword is null or :keyword = ''
or lower(p.name) like lower(concat('%', :keyword, '%'))
or lower(p.email) like lower(concat('%', :keyword, '%')))
""")
Page<Admin> findAllAdmins(
@Param("keyword") String keyword,
@Param("role") AdminRole role,
@Param("status") AdminStatus status,
Pageable pageable
);
완전 이해를 못하고 거의 따라 적는 수준으로 작성 했습니다. 그래서 어떤식으로 돌아가는지 잘 모르고 JPQL에 대해 공부가 더 필요할 것 같습니다. 코드 참조는 https://kjw81024.tistory.com/55 여기서 참조 하였습니다.
@SQLDelete(sql = "UPDATE admins SET deleted = true, deleted_at = NOW() WHERE id = ?")
@SQLRestriction("deleted = false")
@Column(name = "deleted_at")
private LocalDateTime deletedAt;
soft delete에 대해 잘 몰랐었는데 이번 Q&A를 준비하면서 공부를 많이 하다보니 이제 좀 많이 알 것 같습니다. 처음에는 왜 이런식으로 적는지 잘 몰랐는데 공부를 하면서 JPA, Hibernate 에 대해서도 많이 알게 되었습니다. 그래도 많이 몰랐던 부분이니 Problem코드에 추가 하였습니다.
✏️ Try 내용 작성란
- JWT와 Spring Security에 대한 이해를 보완해, 토큰 발급·검증 흐름부터 필터 체인 구성, 예외 처리까지 내가 직접 설계하고 구현해보는 경험을 쌓고 싶습니다.
- 요청이 어떤 필터를 거쳐 어느 지점에서 차단되는지 내가 직접 확인할 수 있도록 로깅 전략을 설계·적용하고, “토큰 없음/만료/서명 오류/권한 부족” 같은 케이스별로 로그와 응답이 의도한 대로 나오는지 내가 직접 테스트하고 점검해보고 싶습니다.