추가강의로 올라온 네이버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>
로 나오던 것이해운대암소갈비집
으로 보기 좋게 나왔다. 정규식에 대해서도 추가로 공부해야 할듯!
기능들 구현은 잘 된 것 같은데 검색 시 사진이 깨지는 현상은 어떻게 해결해야 될 지 모르겠다. 위시리스트 추가하면 위시리스트에서 사진은 잘 나오는데 무엇이 문제일까 다시 한 번 찾아봐야겠다..