네이버API를 활용한 맛집List 만들기

추가강의로 올라온 네이버API를 활용한 맛집 List 만들기 강의를 보면서 따라 만들어 보기로 했다.
강의에서는 ArrayList를 활용해 DB처럼 동작할 수 있도록 내부에 구현했다.

ArrayList를 활용한 MemoryDB 구현부터 Naver API 연동하기, REST API 기능 구현 등 강의를 보면서 따라가는 것이 쉽지 않았지만, 어느정도 해낸 것 같다.

아래는 완성된 코드 구조

가장 어려웠던 것은 WishListService를 만드는 부분이었는데, 무슨소린지 100% 이해가 안 된 상태에서 정신없이 코드만 따라 쳤던 것 같다.

@Service
@RequiredArgsConstructor
public class WishListService {

    private final NaverClient naverClient;
    private final WishListRepository wishListRepository;

    public WishListDto search(String query){

        // 지역검색
        var searchLocalReq = new SearchLocalReq();
        searchLocalReq.setQuery(query);

        var searchLocalRes = naverClient.searchLocal(searchLocalReq);

        if(searchLocalRes.getTotal() > 0){
            var localItem = searchLocalRes.getItems().stream().findFirst().get();
            var imageQuery = localItem.getTitle().replaceAll("<[^>]*>", "");
            var searchImageReq = new SearchImageReq();
            searchImageReq.setQuery(imageQuery);

            // 이미지 검색
            var searchImageRes = naverClient.searchImage(searchImageReq);

            if(searchImageRes.getTotal() > 0){

                var imageItem = searchImageRes.getItems().stream().findFirst().get();

                // 결과 리턴
                var result = new WishListDto();
                result.setTitle(localItem.getTitle().replaceAll("<[^>]*>", ""));

                result.setCategory(localItem.getCategory());
                result.setAddress(localItem.getAddress());
                result.setRoadAddress(localItem.getRoadAddress());
                result.setHomePageLink(localItem.getLink());
                result.setImageLink(imageItem.getLink());

                return result;
            }
        }

        return new WishListDto();
    }

    public WishListDto add(WishListDto wishListDto) {
        var entity = dtoToEntity(wishListDto);
        var saveEntity = wishListRepository.save(entity);
        return entityToDto(saveEntity);

    }

    private WishListEntity dtoToEntity(WishListDto wishListDto){
        var entity = new WishListEntity();
        entity.setIndex(wishListDto.getIndex());
        entity.setTitle(wishListDto.getTitle());
        entity.setCategory(wishListDto.getCategory());
        entity.setAddress(wishListDto.getAddress());
        entity.setRoadAddress(wishListDto.getRoadAddress());
        entity.setHomePageLink(wishListDto.getHomePageLink());
        entity.setImageLink(wishListDto.getImageLink());
        entity.setVisited(wishListDto.isVisited());
        entity.setVisitCount(wishListDto.getVisitCount());
        entity.setLastVisitDate(wishListDto.getLastVisitDate());
        return entity;
    }

    private WishListDto entityToDto(WishListEntity wishListEntity){
        var dto = new WishListDto();
        dto.setIndex(wishListEntity.getIndex());
        dto.setTitle(wishListEntity.getTitle());
        dto.setCategory(wishListEntity.getCategory());
        dto.setAddress(wishListEntity.getAddress());
        dto.setRoadAddress(wishListEntity.getRoadAddress());
        dto.setHomePageLink(wishListEntity.getHomePageLink());
        dto.setImageLink(wishListEntity.getImageLink());
        dto.setVisited(wishListEntity.isVisited());
        dto.setVisitCount(wishListEntity.getVisitCount());
        dto.setLastVisitDate(wishListEntity.getLastVisitDate());
        return dto;
    }

    public List<WishListDto> findAll() {

        return wishListRepository.findAll()
                .stream()
                .map(it -> entityToDto(it))
                .collect(Collectors.toList());
    }

    public void delete(int index) {
        wishListRepository.deleteById(index);
    }

    public void addVisit(int index){
        var wishItem = wishListRepository.findById(index);
        if(wishItem.isPresent()){
            var item = wishItem.get();

            item.setVisited(true);
            item.setVisitCount(item.getVisitCount() + 1);

        }
    }
}

@Slf4j - log 찍을 때 사용
.replaceAll("<[^>]*>", "") 쓰니까 검색결과로 해운대암소<b>갈비집</b> 로 나오던 것이해운대암소갈비집 으로 보기 좋게 나왔다. 정규식에 대해서도 추가로 공부해야 할듯!

기능들 구현은 잘 된 것 같은데 검색 시 사진이 깨지는 현상은 어떻게 해결해야 될 지 모르겠다. 위시리스트 추가하면 위시리스트에서 사진은 잘 나오는데 무엇이 문제일까 다시 한 번 찾아봐야겠다..

0개의 댓글