음식점을 검색할 수 있는 방법으로
필터를 사용하여 검색 (지역, 비건단계, 음식점 종류 등)
음식점 이름으로 검색
두가지를 선택했다.
구현이 더 간단해보이는 이름으로 검색 기능을 먼저 구현했다.
MySQL에 있는 LIKE를 이용하여 구현
@Data
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name="restaurant")
public class Restaurant {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer resIdx;
private String resName;
private String resAddress;
private String resNum;
private String resCategory;
private String resMenu;
private Integer userIdx;
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/v1/vegan-res")
public class RestaurantJpaController {
@Autowired
private RestaurantRepository restaurantRepository;
// 음식점 이름으로 검색
@GetMapping("/restaurantName/{resName}")
public List<Restaurant> searchByResName(@PathVariable String resName){
List<Restaurant> resList=restaurantRepository.findByResNameContains(resName);
if(resList.isEmpty()){
throw new ResNotFoundException(String.format("[%s] not found", resName));
}
return resList;
}
}
resList에 검색 결과를 저장하고, resList가 비어있다면 찾지 못했다는 예외를 발생하도록 했다.
@Repository
public interface RestaurantRepository extends JpaRepository<Restaurant, Integer> {
// 음식점 이름으로 검색
@Query("SELECT r FROM restaurant r WHERE r.resName LIKE %:resName%")
List<Restaurant> findByResNameContains(@Param("resName") String resName);
}
@Query를 이용해 직접 쿼리문을 작성했다.
주의할 점은 restaurant r 처럼 별칭을 필수로 사용해야 한다.
사진과 같이 음식점 이름에 '두부'가 들어간 음식점들을 조회한 것을 확인할 수 있다.
멋져요... 프론트가 분발할게요. ^^