inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

스프링 데이터 페이징 활용2 - CountQuery 최적화

jpa 레포지토리 사용 중 오류

946

김도연

작성한 질문수 10

1

안녕하세요!

querydsl과 jparepository 강의를 듣고 참고하여 개인 코딩 공부를 하고 있는 학생입니다.

다름이 아니라 좋아요 기능 구현 중 customrepository를 사용하였는데 하단과 같은 오류가 발생해서 문의 드립니다.

확인해보니 패키지를 분리하라고 하신 분도 있어서 패키지 분리를 했는데도 동일한 오류가 발생합니다ㅠ.ㅠ이유가 뭘까요..

오류

Error creating bean with name 'businessLikeService' defined in file [/Users/gimnayeon/Desktop/GreenProject/GrinGreen/out/production/classes/com/grin/GrinGreen/BusinessLike/service/BusinessLikeService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'businessLikeRepository' defined in com.grin.GrinGreen.BusinessLike.repository.BusinessLikeRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.Optional com.grin.GrinGreen.BusinessLike.repository.BusinessLikeRepositoryCustom.exist(java.lang.String,java.lang.Long)! Reason: Failed to create query for method public abstract java.util.Optional com.grin.GrinGreen.BusinessLike.repository.BusinessLikeRepositoryCustom.exist(java.lang.String,java.lang.Long)! No property 'exist' found for type 'BusinessLike'!; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.Optional com.grin.GrinGreen.BusinessLike.repository.BusinessLikeRepositoryCustom.exist(java.lang.String,java.lang.Long)! No property 'exist' found for type 'BusinessLike'!

BusinessLike Entity

@Entity
@Getter
@NoArgsConstructor
public class BusinessLike {

    @Id
    @GeneratedValue
    @Column(name = "like_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "mail")
    private Member member;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "business_id")
    private Business business;

    @QueryProjection
    public BusinessLike(Member member, Business business) {
        this.member = member;
        this.business = business;
    }

}

BusinessLike DTO

@Data
public class BusinessLikeDto {

    private Member member;
    private Long businessId;

    @QueryProjection
    public BusinessLikeDto(Member member, Long businessId) {
        this.member = member;
        this.businessId = businessId;
    }
}

BusinessLike Response DTO

@Data
public class BusinessLikeResponseDto {

    private Long BusinessLikeNum;
    private Boolean check;

    @QueryProjection
    public BusinessLikeResponseDto(Long BusinessLikeNum, Boolean check) {
        this.BusinessLikeNum = BusinessLikeNum;
        this.check = check;
    }
}

BusinessLikeCustomRepository

public class BusinessLikeCustomRepositoryImpl implements BusinessLikeRepositoryCustom{

    private final JPAQueryFactory queryFactory;

    public BusinessLikeCustomRepositoryImpl(EntityManager em) {
        this.queryFactory = new JPAQueryFactory(em);
    }

    @Override
    public Optional<BusinessLike> exist(String mail, Long businessId) {
        BusinessLike lList = queryFactory
                .selectFrom(businessLike)
                .where(businessLike.member.mail.eq(mail),
                        businessLike.business.id.eq(businessId))
                .fetchFirst();

        return Optional.ofNullable(lList);
    }

    public long BusinessLikeNumfind(Long businessId) {
        return queryFactory
                .selectFrom(businessLike)
                .where(businessLike.business.id.eq(businessId))
                .fetchCount();
    }
}

BusinessLikeRepository

@Transactional(readOnly = true)
public interface BusinessLikeRepository extends JpaRepository<BusinessLike, Long>, BusinessLikeRepositoryCustom {

}

BusinessLikeRepositoryImpl

public interface BusinessLikeRepositoryCustom {

    Optional<BusinessLike> exist(String mail, Long businessId);

    long BusinessLikeNumfind(Long businessId);
}

BusinessLikeService

@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
public class BusinessLikeService {

    private final BusinessLikeRepository businessLikeRepository;
    private final BusinessRepository businessRepository;

    //좋아요 및 취소
    public Boolean pushBusinessLike(BusinessLikeDto businessLikeDto) {
        businessLikeRepository.exist(businessLikeDto.getMember().getMail(),
                businessLikeDto.getBusinessId())
                .ifPresentOrElse(businessLike -> businessLikeRepository.deleteById(businessLikeDto.getBusinessId()),
                        ()-> {
                            Business business = getBusiness(businessLikeDto);
                            businessLikeRepository.save(new BusinessLike(businessLikeDto.getMember(), business));

                        });
        return true;
    }
    @Transactional(readOnly = true)
    private Business getBusiness(BusinessLikeDto businessLikeDto) {
        return businessRepository.findById(businessLikeDto.getBusinessId())
                .orElseThrow(() -> new IllegalArgumentException("해당 게시글은 존재하지 않습니다."));
    }

    // 좋아요 개수
    @Transactional(readOnly = true)
    public BusinessLikeResponseDto getBusinessLikeInfo(BusinessLikeDto businessLikeDto) {
        long businessLikeNum = getBusinessLikeNum(businessLikeDto);
        boolean check = checkPushedLike(businessLikeDto);

        return new BusinessLikeResponseDto(businessLikeNum, check);
    }

    @Transactional(readOnly = true)
    public boolean checkPushedLike(BusinessLikeDto businessLikeDto) {
        return businessLikeRepository.exist(businessLikeDto.getMember().getMail(), businessLikeDto.getBusinessId())
                .isPresent();
    }

    @Transactional(readOnly = true)
    public long getBusinessLikeNum(BusinessLikeDto businessLikeDto) {
       return businessLikeRepository.BusinessLikeNumfind(businessLikeDto.getBusinessId());
    }
}

BusinessLikeServiceTest 

@SpringBootTest
@Transactional
public class BusinessLikeServiceTest {
    @Autowired
    BusinessLikeService businessLikeService;
    @Autowired
    MemberService memberService;
    @Autowired
    BusinessService businessService;

    @Test
    public void 좋아요() throws Exception{
        //given
        Member member = new Member();
        member.setNickname("testMember");
        member.setMail("testMember@test.com");
        member.setPassword("test1234!");
        member.setMember_type("B");
        member.setMember_status("J");
        member.setHint_password("hint_01");
        member.setAnswer_password("answer");
        member.setUpdated_at(now());
        member.setCreated_at(now());

        memberService.join(member);
        Member findMember = memberService.findOne(member.getMail());

        Business business = new Business();
        business.setBusinessName("테스트밥집");
        business.setHomepage("test.com");
        business.setPhone("010-1234-5678");
        business.setAddress("제주특별자치도 제주시 첨단로 242");
        business.setLng((float) 33.450701);
        business.setLat((float) 126.570667);
        business.setCreated_at(now());
        business.setUpdated_at(now());

        businessService.join(business);
        Business findBusiness = businessService.findOne(business.getId());

        //when
        BusinessLikeDto businessLikeDto = new BusinessLikeDto(findMember,findBusiness.getId());
        businessLikeService.pushBusinessLike(businessLikeDto);
        System.out.println("businessLikeDto = " + businessLikeDto.getBusinessId());;
        //then
        assertEquals(1,businessLikeService.getBusinessLikeInfo(businessLikeDto).getBusinessLikeNum());
    }

} 

java JPA

답변 1

1

김영한

안녕하세요. 김도연님

저도 정확히는 모르겠지만 exist() 메서드가 스프링 데이터 JPA에 있는 메서드여서요. 메서드 이름을 한번 변경해보시겠어요?

0

김도연

 

안녕하세요 강사님!

처리했습니다. 우선 예약어로 걸릴 exist나 like는 뺐습니다.

그리고 스프링 데이터 JPA 강의 다시 들어보니

제가 Impl을 repositoryImpl로 해야하는데 customrepositoryImpl로 구현했네요ㅠㅠㅠㅠ수정하고 처리 완료했습니다. 감사합니다!!!!!!

 

 

join에대해 질문드립니다.

0

22

1

SpringBoot 4.X에서의 Querydsl 설정

0

171

2

querydsl 오픈소스에 대한 질문

1

103

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

128

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

358

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

88

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

173

1

querydsl sum() 메서드 없어요.

0

172

2

build 디렉터리 생성

0

154

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

125

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

101

1

오타 제보 드립니다.

0

80

2

벌크 연산과 flush, clear

0

85

1

Run As Intellij 로 변경시 Q타입 import 불가

0

98

1

QHello import하기 문제 발생

0

158

2

등록된 함수 보는법(H2Dialect) 질문

0

80

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

209

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

215

1

querydsl 설정 문제

0

230

2

quey dsl 설정부분

0

169

2

count 쿼리 관련 질문입니다!

0

80

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

101

1

답변부탁드리겠습니다.

0

95

2

(OrderSpecifier)관련 내용 어디있을가요

0

68

1