찜 목록 조회 시 주소 오류로 인한 NullPointerException 문제 해결 및 코드 단순화, 일관성 향상
문제 및 해결 방안
문제: 주소를 좌표로 변환하여 거리를 계산하는 convertAddressToCoordAndCalcDist 메서드에서는 크롤링한 즉석사진 데이터 주소에 오타나 누락이 있는 경우 주소 체계가 유효하지 않아NullPointerException이 발생합니다. 이는 공식 사이트에서 잘못된 주소 정보를 제공하고 있기 때문입니다.
해결 방안: 찜 목록 조회 시 캐시된 데이터가 없는 경우, 항상 지점명을 기준으로 사용자의 현재위치로부터의 거리를 계산할 수 있는 searchOneSpecificShopByName를 호출하도록 수정합니다. 이를 위해 다음과 같은 변경사항이 있습니다.
수정 전: 주소 데이터가 Null인 경우 searchOneSpecificShopByName을 호출하고, 그렇지 않은 경우 convertAddressToCoordAndCalcDist를 호출합니다.
수정 후: 주소 데이터 Null 체크 없이 searchOneSpecificShopByName를 호출합니다.
java.lang.NullPointerException: Cannot invoke "com.fasterxml.jackson.databind.JsonNode.hasNonNull(String)" because the return value of "com.fasterxml.jackson.databind.JsonNode.get(int)" is null
at com.idea5.four_cut_photos_map.domain.shop.service.kakao.KakaoMapSearchApi.convertAddressToCoordAndCalcDist(KakaoMapSearchApi.java:212) ~[classes!/:na]
at com.idea5.four_cut_photos_map.domain.shop.service.ShopService.calcDistFromUserLocation(ShopService.java:108) ~[classes!/:na]
at com.idea5.four_cut_photos_map.domain.shop.service.ShopService.setResponseDto(ShopService.java:144) ~[classes!/:na]
at com.idea5.four_cut_photos_map.domain.shop.service.ShopService$$FastClassBySpringCGLIB$$f7611501.invoke(<generated>) ~[classes!/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.24.jar!/:5.3.24]
at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.24.jar!/:5.3.24]
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.24.jar!/:5.3.24]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.24.jar!/:5.3.24]
at com.idea5.four_cut_photos_map.domain.shop.service.ShopService$$EnhancerBySpringCGLIB$$a9f1ee6d.setResponseDto(<generated>) ~[classes!/:na]
at com.idea5.four_cut_photos_map.domain.favorite.service.FavoriteService.lambda$getFavoritesList$0(FavoriteService.java:88) ~[classes!/:na]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[na:na]
at com.idea5.four_cut_photos_map.domain.favorite.service.FavoriteService.getFavoritesList(FavoriteService.java:90) ~[classes!/:na]
at com.idea5.four_cut_photos_map.domain.favorite.service.FavoriteService$$FastClassBySpringCGLIB$$10a89c1.invoke(<generated>) ~[classes!/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.24.jar!/:5.3.24]
at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.24.jar!/:5.3.24]
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.24.jar!/:5.3.24]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704) ~[spring-aop-5.3.24.jar!/:5.3.24]
at com.idea5.four_cut_photos_map.domain.favorite.service.FavoriteService$$EnhancerBySpringCGLIB$$c71d44ad.getFavoritesList(<generated>) ~[classes!/:na]
at com.idea5.four_cut_photos_map.domain.favorite.controller.FavoriteController.showFavoritesList(FavoriteController.java:34) ~[classes!/:na]
..
작업 상세 내용
[x] fix : convertAddressToCoordAndCalcDist 메서드 제거하여 코드 단순화 및 일관성 향상
[x] refactor : 주소나 지점명으로 특정 지점을 검색하는 searchSingleShopByQueryWord 메서드를 지점명으로만 검색하는 searchOneSpecificShopByName으로 수정
카카오 응답 지점과 DB 지점과 비교하는 로직에서 장소명이 반드시 일치하는지 확인하도록 수정되었기 때문입니다. (#155, #157)
참고 사항
convertAddressToCoordAndCalcDist 메서드 제거를 택한 이유
convertAddressToCoordAndCalcDist 메서드는 주소를 좌표로 변환하고 거리를 계산하는 과정에서 부정확한 주소 정보로 인한 NullPointerException이 발생하는 문제가 있었습니다.
대안으로는 total_count가 0인 경우 대체 메서드를 호출하여 주소 정보를 가져올 수도 있었으나, 이는 카카오 API를 두 번 호출하는 비효율적인 과정을 필요로 합니다.
또한, DB 주소와 카카오 API 주소 간에 상세주소 유무 차이로 인해 일관성이 부족할 수 있습니다.
따라서, 비효율성과 일관성의 문제를 해결하기 위해 convertAddressToCoordAndCalcDist 메서드를 제거하는 방안을 택했습니다.
목적
searchOneSpecificShopByName
을 호출하고, 그렇지 않은 경우convertAddressToCoordAndCalcDist
를 호출합니다.수정 후: 주소 데이터 Null 체크 없이
searchOneSpecificShopByName
를 호출합니다.문제 상세
평택 2호
평택 2로
작업 상세 내용
[x] fix :
convertAddressToCoordAndCalcDist
메서드 제거하여 코드 단순화 및 일관성 향상[x] refactor : 주소나 지점명으로 특정 지점을 검색하는
searchSingleShopByQueryWord
메서드를 지점명으로만 검색하는searchOneSpecificShopByName
으로 수정참고 사항
convertAddressToCoordAndCalcDist
메서드 제거를 택한 이유convertAddressToCoordAndCalcDist
메서드는 주소를 좌표로 변환하고 거리를 계산하는 과정에서 부정확한 주소 정보로 인한NullPointerException
이 발생하는 문제가 있었습니다.대안으로는
total_count
가 0인 경우 대체 메서드를 호출하여 주소 정보를 가져올 수도 있었으나, 이는 카카오 API를 두 번 호출하는 비효율적인 과정을 필요로 합니다.또한, DB 주소와 카카오 API 주소 간에 상세주소 유무 차이로 인해 일관성이 부족할 수 있습니다.
따라서, 비효율성과 일관성의 문제를 해결하기 위해
convertAddressToCoordAndCalcDist
메서드를 제거하는 방안을 택했습니다.