기존 서버 api에서는 Repository Layer에서 직접 리포지토리를 구현을 하고 있는 상태입니다. 즉, 리포지토리의 기술에 의존하게 되어 구현 기술이 변경되면 서비스 코드도 변경해야 됩니다.
서비스 코드 입장에서 봤을 때 중요한 건 서비스에 대한 비즈니스 로직이지 리포지토리가 어떤 방식(querydsl, Jpa naming 메소드 등)으로 구현 되어있는 지 중요하지 않습니다. 이를 인터페이스를 이용해 구현해보겠습니다. 코드는 Escrow Headroom인 적립금 개편을 예로 들었습니다.
interface MemberPointListRepository{
fun searchMemberPointList(searchParam: MemberPointSearchServiceDto): Page<MemberPointSearchResult>
fun findAllByMemberNo(memberNo: Long): List<MemberPointListJpaEntity>
fun save(memberPointListJpaEntity: MemberPointListJpaEntity): MemberPointListJpaEntity
fun findByIdOrNull(memberPointListNo: Long): MemberPointListJpaEntity?
}
interface MemberPointListJpaRepository: JpaRepository<MemberPointListJpaEntity, Long> {
fun findAllByMemberNo(memberNo: Long): List<MemberPointListJpaEntity>
}
@Component
class MemberPointListRepositoryImpl(
private val jpaQueryFactory: JPAQueryFactory,
private val memberPointListJpaRepository: MemberPointListJpaRepository
): MemberPointListRepository {
override fun searchMemberPointList(searchParam: MemberPointSearchServiceDto): Page<MemberPointSearchResult> {
val query = jpaQueryFactory
.select(MemberPointSearchResult.toQ())
.from(memberPointListJpaEntity)
searchParam.savingSubtractionDivisionCode?.let {
query.where(memberPointListJpaEntity.savingSubtractionDivisionCode.eq(searchParam.savingSubtractionDivisionCode))
}
searchParam.pointTypeCode?.let {
query.where(memberPointListJpaEntity.pointTypeCode.eq(searchParam.pointTypeCode))
}
searchParam.pointOccurAgentTypeCode?.let {
query.where(memberPointListJpaEntity.pointOccurAgentTypeCode.eq(searchParam.pointOccurAgentTypeCode))
}
return PageImpl(query.fetch(), PageRequest.of(searchParam.pageNo, searchParam.pageSize), query.fetchCount())
}
override fun findAllByMemberNo(memberNo: Long) = memberPointListJpaRepository.findAllByMemberNo(memberNo)
override fun save(memberPointListJpaEntity: MemberPointListJpaEntity) = memberPointListJpaRepository.save(memberPointListJpaEntity)
override fun findByIdOrNull(memberPointListNo: Long) = memberPointListJpaRepository.findByIdOrNull(memberPointListNo)
}