23-06-22 TIL

more·2023년 6월 22일
0

문제

  • 2-22 '관심 상품에 추가 폴더 구현' 강의를 듣던 도중
    • 마지막에 productFolderRepository.save(new ProductFolder(product, folder));를 해서 productFolderRepository에 ProductFolder를 저장해주는 기능을 구현하고 있는 와중에 빨간색 밑줄이 그어짐
    • Problem에 Inferred type 'S' for type parameter 'S' is not within its bound; should extend 'com.sparta.myselectshop.entity.Product' 라는 에러 메시지가 나온다.
    • 강의에서는 나오지 않는 것으로 보아 무엇인가 설정을 잘 못한 것으로 보임

시도

  • 우선은 구글링을 하지 않고 해결해보고 싶어서 프로젝트 파일들을 살펴보았다.
    • should extend 'com.sparta.myselectshop.entity.Product' 라는 에러메시지로 보아서 Product쪽에 문제가 있다고 판단, Product, ProductFolder, ProductRepository, ProductFolderRepository를 살펴보기로 하였다.
    • Product는 단순한 Entity이기 때문에 문제가 생겼다면 다른 Entity와 연결하는 부분에서 문제가 생겼을 것이라고 생각
      -> 살펴보았지만 @ManyToOne으로 User와 연결한 부분과 @OneToMany로 productFolder와 연결한 부분 모두 문제가 없었다.
    • ProductFolder 또한 살펴보았으나 @ManyToOne으로 Folder와 연결한 부분, 그리고 생성자까지 문제가 없음을 확인하였다.
    • ProductRepository를 살펴본 결과, Page findAllByUser(User user, Pageable pageable); 라는 쿼리 메서드하나만 만들고 있고 이 또한 Pagenation과 관련된 기능이기 때문에 문제가 없는 것으로 판단하였다.
    • 그렇다면 ProductFolderRepository에 문제가 있는 것 같다.

해결

  • ProductFolderRepository를 살펴보자 Optional findByProductAndFolder(Product product, Folder folder); 이라는 return type이 Optional인 쿼리 메서드하나만 존재하는 것을 볼 수 있었다.
    • 해당 메서드는 문제가 없이 동작하는 것을 강의에서 확인하였고, 실제로 동작하는 것도 확인하였기에 문제가 없음을 알 수 있었다.
    • 하지만 ProductFolderRepository가 JpaRepository<Product, Long>를 extends 하는 부분에서 문제가 있음을 볼 수 있었는데, Generic에 Product를 주는 것이 아니라 ProductFolder를 주어야하는데 잘 못 설정하였음을 볼 수 있었다.
    • JpaRepository<ProductFolder, Long>로 고치고 보니 메서드가 정상 작동하는 것을 확인 할 수 있었다.
      -> 해결

알게 된 점

  • 구글링으로 Inferred type 'S' for type parameter 'S' is not within its bound; should extend 'com.sparta.myselectshop.entity.Product'라는 에러메시지를 검색해보자 "JPA JpaRepository 매개변수 확인, 인터페이스 명 일치 확인" 이라고 가장 위에 뜨는 것을 볼 수 있었다.
    • 아직 자바나 스프링에 대한 개념들이 제대로 머리 속에 박혀있지 않은 듯하다. 강의도 더 듣고 복습을 많이 해야할 듯
  • 클라이언트가 서버에 정보를 넘겨 줄 경우
    • url에 /{} 이런 식으로 중괄호안의 값을 지정해서 준다면 @PathVariable을 사용해서 받음
    • url뒤에 ?name= 이런 식으로 넘겨 줄 경우 @RequestParam을 사용해서 받음
    • 넘겨준 값들이 많아서 객체를 만들어서 받고 싶은 경우 @ModelAttribute를 사용해서 받음
      -> query string과 form 둘 다 가능하고 생략도 가능하다.
    • HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받을 경우, @RequestBody를 사용해서 받음
  • 서버에서 클라이언트에 존재하는 ${} 이런 변수에 값을 동적으로 넘겨주고 싶을 경우
    • @Model을 이용해서 넘겨줌
    • model.addAttribute("지정한 이름", 변수) 를 사용해서 넘겨준다.

0개의 댓글