Closed jkde7721 closed 4 months ago
병원탭 기획 변경되면 새로 이슈 생성해서 다시 작업하겠습니다. 일단 해당 PR은 머지하겠습니다.
추가로 Pageable
, Sort
관련해서 변경된 사항이 있어서 해당 부분(HospitalController
, HospitalService
, PagingResponse
, QuerydslPagingSupportRepository
, SortingOrder
, HospitalReceiptReviewSortingOrder
) 확인 부탁드립니다. @newoceanwave
💻 구현 내용
hospital
,doctor
,hospital_receipt_review
,hospital_brief_review
,hospital_bookmark
,hosptial_receipt_review_help
테이블 내 데이터 실제delete
쿼리 날리지 않고 flag로 삭제 여부 관리하기 위해deleted
컬럼 추가🛠️ 개발 오류 사항
fetch join
의on
절에doctor
엔티티 대상으로 조회 조건(deleted = 0
)을 지정함 => 이 경우with-clause not allowed on fetched association
이런 오류 발생on
절에 조건을 지정한 경우Hospital
에 매달린List<Doctor>
와 실제 DB 내 데이터가 일치하지 않게 됨 ->doctor
테이블에delete
쿼리 발생할 수 있어 JPA 설계상on
절에서 조인 대상에 대한 조건 지정은 불가 참고🗣️ For 리뷰어
아직 내 주변 병원 목록 조회, 의사 영수증 리뷰 목록 조회 api 미구현된 상태입니다. 두 api 제외하고 리뷰 부탁드려요.페이징 관련해서 Spring Data JPA의Page
,Pageable
클래스를 사용할 예정인데 해당 클래스는 JPA라는 기술에 종속적이므로 repository 계층에서만 사용하고, 나머지 controller, service 계층에서 사용할 수 있도록 커스텀PageRequest
,PageResponse
클래스를 정의하고자 합니다. 일단 구현 후 해당 pr에 구현 내용 정리하겠습니다.NativeSqlSupportRepository 구현체 MysqlSupportRepository
두 지점 사이의 거리를 구하기 위해 Mysql의 dialect인
st_distance_sphere
함수를 사용하였습니다. 해당 함수는 Querydsl이 지원해주지 않아Expressions.numberTemplate
를 통해 sql을 직접 작성해야 합니다. 물론 클래스로 바로 구현할 수도 있지만 추후 Mysql이 아닌 다른 DBMS를 사용하는 변경을 대비해 인터페이스로 정의하였습니다. 참고Querydsl에서의 페이징 처리
앞서 말씀드렸던 것과는 달리 스프링 데이터 JPA가 기본적으로 제공해주는
Pageable
을 Controller, Service 계층에서 그냥 사용하였습니다. (사용 기술이 스프링 데이터 JPA 대신 다른 것으로 변경될 가능성이 낮다고 판단...)대신
Pageable
을 응답 그대로 내려주는 것은 불필요하다고 생각해(불필요한 정보가 많이 포함됨) 별도의PagingResponse
를 정의하고 응답으로 내려주고 있습니다Querydsl에서 정렬 조건을 지정하기 위해서는
Pageable
의Sort
를 Querydsl의OrderSpecifier
로 변환해야 하는데,QuerydslPagingSupportRepository
클래스에서 해당 작업을 수행합니다. 요청 정렬 조건(ex.?sort=createAt,asc
)을Q-
클래스의 필드(QHospital.hospital.createdAt
)로 매핑하기 위해서는 enum을 사용하였는데 해당 enum은SortingOrder
인터페이스를 구현해야 합니다. 참고서현님 구현 api에서 동적 쿼리가 많이 사용된다면 Querydsl 사용하시면 좋을 것 같습니다. 참고로
JPAQueryFactory
는QuerydslConfig
설정 클래스에서 빈으로 등록하고 있어 사용 시 빈 주입받으면 됩니다. (+JPAQueryFactory
는 멀티 쓰레드에 안전한 객체로 전역 사용 가능합니다.)close #28