프로젝트 생성
의존성 주입 - Lombok, Spring Web, Thymeleaf
네이버API 홈페이지
https://developers.naver.com/docs/serviceapi/search/local/local.md#%EC%A7%80%EC%97%AD
지역 - Search API
지역 NAVER Developers - 검색 API 지역 검색 개발가이드 검색 > 지역 네이버 지역 서비스에 등록된 각 지역별 업체 및 상호 검색 결과를 출력해주는 REST API입니다. 비로그인 오픈 API이므로 GET으로 호출
developers.naver.com
Swagger 설치
메이븐 레파지토리 : https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter/3.0.0
에러발생시 참조
2022.08.23 - [Spring] - [Spring] 인텔리제이 swagger 에러 해결
[Spring] 인텔리제이 swagger 에러 해결
스프링 이니셜라이져로 프로젝트를 생성하여 인텔리제이에서 사용하면 참 많은 오류가 발생한다.;; 그 중 새로운 의존성을 주입했을때 발생하는 문제인데. swagger를 의존성 주입했을때 잡다한
jelly-bee.tistory.com
컨트롤러
ApiController.java
- 네이버API를 활용하여 만든 맛집검색 및 추가 기능을 제어하는 부분
package com.example.restaurant.controller;
import com.example.restaurant.wishlist.dto.WishListDto;
import com.example.restaurant.wishlist.repository.WishListRepository;
import com.example.restaurant.wishlist.service.WishListService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/api/restaurant")
@RequiredArgsConstructor
public class ApiController {
private final WishListService wishListService;
@GetMapping("/search")
public WishListDto search(@RequestParam String query){
return wishListService.search(query);
}
@PostMapping
public WishListDto add(@RequestBody WishListDto wishListDto){
log.info("{}",wishListDto);
return wishListService.add(wishListDto);
}
@GetMapping("/all")
public List<WishListDto> findAll(){
return wishListService.findAll();
}
@DeleteMapping("/{index}")
public void delete(@PathVariable int index){
wishListService.delete(index);
}
@PostMapping("/{index}")
public void addVisit(@PathVariable int index){
wishListService.addVisit(index);
}
}
PageController.java
- 프론트엔드 화면 제어하는 부분
package com.example.restaurant.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/pages")
public class PageController {
@GetMapping("/main")
public ModelAndView main() {
// resources/templates폴더 하위의 main.html을 의미한다.
return new ModelAndView("main");
}
}
DB
MemoryDbRepositoryIfs.java
- DB 인터페이스
package com.example.restaurant.db;
import java.util.List;
import java.util.Optional;
public interface MemoryDbRepositoryIfs<T> {
Optional<T> findById(int index);
T save(T entity);
void deleteById(int index);
List<T> findAll();
}
MemoryDbEntity.java
- 클래스를 상속한 객체가 인덱스를 가지며, 외부에서 인덱스를 요구할 수 있도록한다.
package com.example.restaurant.db;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class MemoryDbEntity {
protected Integer index;
}
MemoryDbRepositoryAbstract.java
- DB인터페이스를 구현
package com.example.restaurant.db;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
abstract public class MemoryDbRepositoryAbstract<T extends MemoryDbEntity> implements MemoryDbRepositoryIfs<T> {
private final List<T> db = new ArrayList<>();
private int index = 0;
@Override
public Optional<T> findById(int index) {
return db.stream().filter(it -> it.getIndex() == index).findFirst();
}
@Override
public T save(T entity) {
var optionalEntity = db.stream().filter(it -> it.getIndex() ==
entity.getIndex()).findFirst();
if (optionalEntity.isEmpty()) {
// db에 데이터가 없는 경우
index++;
entity.setIndex(index);
db.add(entity);
return entity;
} else {
// db에 이미 데이터가 있는 경우
var preIndex = optionalEntity.get().getIndex();
entity.setIndex(preIndex);
deleteById(preIndex);
db.add(entity);
return entity;
}
}
@Override
public void deleteById(int index) {
var optionalEntity = db.stream().filter(it -> it.getIndex() == index).findFirst();
if (optionalEntity.isPresent()) {
db.remove(optionalEntity.get());
}
}
@Override
public List<T> findAll() {
return db;
}
}
네이버API 데이터 제어
SearchLocalReq.java
- 검색을 위해 API에 보낼 요청을 만든다.
package com.example.restaurant.naver.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SearchLocalReq {
private String query = "";
private int display = 1;
private int start = 1;
private String sort = "random";
public MultiValueMap<String, String> toMultiValueMap() {
var map = new LinkedMultiValueMap<String, String>();
map.add("query", query);
map.add("display", String.valueOf(display));
map.add("start", String.valueOf(start));
map.add("sort", sort);
return map;
}
}
SearchLocalRes.java
- 검색에 대한 응답을 받는 형태
package com.example.restaurant.naver.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SearchLocalRes {
private String lastBuildDate;
private int total;
private int start;
private int display;
private List<SearchLocalItem> items;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class SearchLocalItem {
private String title;
private String link;
private String description;
private String category;
private String telephone;
private String address;
private String roadAddress;
private int mapx;
private int mapy;
}
}
SearchImageReq.java
- 검색 이미지 요청을 만든다.
package com.example.restaurant.naver.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SearchImageReq {
private String query = "";
private int display = 1;
private int start = 1;
private String sort = "sim";
private String filter = "all";
public MultiValueMap<String, String> toMultiValueMap() {
var map = new LinkedMultiValueMap<String, String>();
map.add("query", query);
map.add("display", String.valueOf(display));
map.add("start", String.valueOf(start));
map.add("sort", sort);
map.add("filter", filter);
return map;
}
}
SearchImageRes.java
- 검색 이미지응답을 받기 위한 형태
package com.example.restaurant.naver.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SearchImageRes {
private String lastBuildDate;
private int total;
private int start;
private int display;
private List<SearchImageItem> items;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class SearchImageItem {
private String title;
private String link;
private String thumbnail;
private String sizeheight;
private String sizewidth;
}
}
NaverClient.java
- 네이버API에 접근하는 헤더를 만들고, 요청을 보내어 응답을 받는다.
package com.example.restaurant.naver;
import com.example.restaurant.naver.dto.SearchImageReq;
import com.example.restaurant.naver.dto.SearchImageRes;
import com.example.restaurant.naver.dto.SearchLocalReq;
import com.example.restaurant.naver.dto.SearchLocalRes;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
@Component
public class NaverClient {
// application.yaml에서 값을 받아온다.
@Value("${naver.client.id}")
private String naverClientId;
@Value("${naver.client.secret}")
private String naverClientSecret;
@Value("${naver.url.search.local}")
private String naverLocalSearchUrl;
@Value("${naver.url.search.image}")
private String naverImageSearchUrl;
public SearchLocalRes searchLocal(SearchLocalReq searchLocalReq) {
var uri = UriComponentsBuilder.fromUriString(naverLocalSearchUrl)
.queryParams(searchLocalReq.toMultiValueMap())
.build()
.encode()
.toUri();
var headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", naverClientId);
headers.set("X-Naver-Client-Secret", naverClientSecret);
headers.setContentType(MediaType.APPLICATION_JSON);
var httpEntity = new HttpEntity<>(headers);
var responseType = new ParameterizedTypeReference<SearchLocalRes>() {
};
var responseEntity = new RestTemplate().exchange(
uri,
HttpMethod.GET,
httpEntity,
responseType
);
return responseEntity.getBody();
}
public SearchImageRes searchImage(SearchImageReq searchImageReq) {
var uri = UriComponentsBuilder.fromUriString(naverImageSearchUrl)
.queryParams(searchImageReq.toMultiValueMap())
.build()
.encode()
.toUri();
var headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", naverClientId);
headers.set("X-Naver-Client-Secret", naverClientSecret);
headers.setContentType(MediaType.APPLICATION_JSON);
var httpEntity = new HttpEntity<>(headers);
var responseType = new ParameterizedTypeReference<SearchImageRes>() {
};
var responseEntity = new RestTemplate().exchange(
uri,
HttpMethod.GET,
httpEntity,
responseType
);
return responseEntity.getBody();
}
}
맛집 검색 관련
WishListDto.java
- 맛집 검색시 노출될 내용
package com.example.restaurant.wishlist.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class WishListDto {
private Integer index;
private String title; // 음식명, 장소명
private String category; // 카테고리
private String address; // 주소
private String roadAddress; // 도로명
private String homePageLink; // 홈페이지 주소
private String imageLink; // 음식, 가게 이미지 주소
private boolean isVisit; // 방문여부
private int visitCount; // 방문 카운트
private LocalDateTime lastVisitDate; // 마지막 방문일자
}
WishListEntity.java
- 맛집 추가시 노출될 내용
package com.example.restaurant.wishlist.entity;
import com.example.restaurant.db.MemoryDbEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class WishListEntity extends MemoryDbEntity {
private String title; // 음식명, 장소명
private String category; // 카테고리
private String address; // 주소
private String roadAddress; // 도로명
private String homePageLink; // 홈페이지 주소
private String imageLink; // 음식, 가게 이미지 주소
private boolean isVisit; // 방문여부
private int visitCount; // 방문 카운트
private LocalDateTime lastVisitDate; // 마지막 방문일자
}
WishListRepository.java
- 내가 추가한 맛집 리스트 제어
package com.example.restaurant.wishlist.repository;
import com.example.restaurant.db.MemoryDbRepositoryAbstract;
import com.example.restaurant.wishlist.entity.WishListEntity;
import org.springframework.stereotype.Repository;
@Repository
public class WishListRepository extends MemoryDbRepositoryAbstract<WishListEntity> {
}
WishListService.java
- 서비스하는 기능 제어
package com.example.restaurant.wishlist.service;
import com.example.restaurant.naver.NaverClient;
import com.example.restaurant.naver.dto.SearchImageReq;
import com.example.restaurant.naver.dto.SearchLocalReq;
import com.example.restaurant.wishlist.dto.WishListDto;
import com.example.restaurant.wishlist.entity.WishListEntity;
import com.example.restaurant.wishlist.repository.WishListRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@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());
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.setVisit(wishListDto.isVisit());
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.setVisit(wishListEntity.isVisit());
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.setVisit(true);
item.setVisitCount(item.getVisitCount() + 1);
}
}
}
application.yaml
- 헤더에 들어갈 데이터
naver:
url:
search:
local: https://openapi.naver.com/v1/search/local.json
image: https://openapi.naver.com/v1/search/image
client:
id: mU2vfN5TRN9zqRuDXLCP
secret: 5Fb4nLCYyh
테스트
NaverClientTest.java
- 요청에 대한 응답이 제대로 들어오는지 테스트
package com.example.restaurant.naver;
import com.example.restaurant.naver.dto.SearchImageReq;
import com.example.restaurant.naver.dto.SearchLocalReq;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class NaverClientTest {
@Autowired
private NaverClient naverClient;
@Test
public void searchLocalTest() {
var search = new SearchLocalReq();
search.setQuery("고기집");
var result = naverClient.searchLocal(search);
System.out.println(result);
Assertions.assertNotNull(result.getItems().stream().findFirst().get().getCategory());
}
@Test
public void searchImageTest() {
var search = new SearchImageReq();
search.setQuery("고기집");
var result = naverClient.searchImage(search);
System.out.println(result);
}
}
WishListRepositoryTest.java
- CRUD 테스트
package com.example.restaurant.wishlist.repository;
import com.example.restaurant.wishlist.entity.WishListEntity;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class WishListRepositoryTest {
@Autowired
private WishListRepository wishListRepository;
private WishListEntity create() {
var wishList = new WishListEntity();
wishList.setTitle("title");
wishList.setCategory("category");
wishList.setAddress("address");
wishList.setRoadAddress("readAddress");
wishList.setHomePageLink("");
wishList.setImageLink("");
wishList.setVisit(false);
wishList.setVisitCount(0);
wishList.setLastVisitDate(null);
return wishList;
}
@Test
public void saveTest() {
var wishListEntity = create();
var expected = wishListRepository.save(wishListEntity);
Assertions.assertNotNull(expected);
Assertions.assertEquals(1, expected.getIndex());
}
@Test
public void updateTest() {
var wishListEntity = create();
var expected = wishListRepository.save(wishListEntity);
expected.setTitle("update Test");
var saveEntity = wishListRepository.save(expected);
Assertions.assertEquals("update Test", saveEntity.getTitle());
Assertions.assertEquals(1, wishListRepository.findAll().size());
}
@Test
public void findByIdTest() {
var wishListEntity = create();
wishListRepository.save(wishListEntity);
var expected = wishListRepository.findById(1);
Assertions.assertEquals(true, expected.isPresent());
Assertions.assertEquals(1, expected.get().getIndex());
}
@Test
public void deleteTest() {
var wishListEntity = create();
wishListRepository.save(wishListEntity);
wishListRepository.deleteById(1);
int count = wishListRepository.findAll().size();
Assertions.assertEquals(0, count);
}
@Test
public void listAllTest() {
var wishListEntity1 = create();
wishListRepository.save(wishListEntity1);
var wishListEntity2 = create();
wishListRepository.save(wishListEntity2);
int count = wishListRepository.findAll().size();
Assertions.assertEquals(2, count);
}
}
WishListServiceTest.java
- 서비스할 기능 테스트
package com.example.restaurant.wishlist.service;
import com.example.restaurant.wishlist.dto.WishListDto;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class WishListServiceTest {
@Autowired
private WishListService wishListService;
@Test
public void searchTest(){
var result = wishListService.search("고기집");
System.out.println(result);
Assertions.assertNotNull(result);
}
}
간략한 프론트 엔드 구현
부트스트랩, 제이쿼리, 뷰.js 사용되었다고 한다.
main.html
<!DOCTYPE html>
<html lang="ko" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>맛집 WISH LIST</title>
</head>
<body>
<br/>
<div class="container">
<!-- search -->
<div class="row">
<div class="col-sm-6 col-md-8">
<input id="searchBox" style="height: 46px" class="form-control form-control-lg" type="text" placeholder="맛집을 검색해주세요 ex.(판교 갈비집)" value="갈비집">
</div>
<div class="col-sm-6 col-md-4">
<button id="searchButton" type="button" class="btn btn-primary btn-lg" style="width: 100%">검색</button>
</div>
</div>
<br/>
<!-- search result -->
<div class="row" id="search-result" style="visibility: hidden">
<div class="col-sm-6 col-md-8">
<img id="wish_image" v-bind:src="search_result.imageLink" alt="..." class="img-thumbnail" style="min-width: 100%; min-height: 100%;">
</div>
<div class="col-sm-6 col-md-4">
<ul class="list-group list-group-flush">
<li class="list-group-item" id="wish_title">{{search_result.title}}</li>
<li class="list-group-item" id="wish_category">{{search_result.category}}</li>
<li class="list-group-item" id="wish_address">{{search_result.address}}</li>
<li class="list-group-item" id="wish_road_address">{{search_result.roadAddress}}</li>
<li class="list-group-item"><a id="wish_link" target="_blank" v-bind:href="search_result.homePageLink">홈페이지</a> </li>
</ul>
<button id="wishButton" type="button" class="btn btn-primary btn-lg" style="width: 96%; position: absolute; bottom: 0">위시리스트 추가</button>
</div>
</div>
<br/><br/><br/>
<div class="row">
<div class="alert alert-info col-sm-12 col-md-12" style="text-align: center">
나의 맛집 리스트
</div>
</div>
<br/>
<div id="wish-list">
<div v-for="wish in wish_list">
<br/><hr/>
<div class="row">
<div class="col-sm-6 col-md-8">
<img v-bind:src="wish.imageLink"
alt="..."
class="img-thumbnail"
style="min-width: 100%;
min-height: 100%;"
>
</div>
<div class="col-sm-6 col-md-4">
<ul class="list-group list-group-flush">
<li class="list-group-item">장소 : {{wish.title}}</li>
<li class="list-group-item">Category : {{wish.category}}</li>
<li class="list-group-item">주소 : {{wish.address}}</li>
<li class="list-group-item">도로명 : {{wish.roadAddress}}</li>
<li class="list-group-item">방명여부 : {{wish.visit}}</li>
<li class="list-group-item">마지막 방문일자 : {{wish.lastVisitDate}}</li>
<li class="list-group-item">방문횟수 : {{wish.visitCount}}</li>
<li class="list-group-item">
<a href="http://imf0010.cafe24.com/m/imf0020">홈페이지</a>
</li>
<li class="list-group-item">
<button v-on:click="addVisit(wish.index)" type="button" class="btn btn-primary btn-lg" style="width: 100%;">방문 추가</button>
<br/><br/>
<button v-on:click="deleteWish(wish.index)" type="button" class="btn btn-primary btn-lg" style="width: 100%;">위시리스트 삭제</button>
</li>
<li class="list-group-item"></li>
</ul>
</div>
<br/>
</div>
<hr>
</div>
</div>
</div> <!-- container end -->
</body>
<!-- jQuery (부트스트랩의 자바스크립트 플러그인을 위해 필요합니다) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<!-- CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<!-- 합쳐지고 최소화된 최신 자바스크립트 -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<!-- 개발버전, 도움되는 콘솔 경고를 포함. -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="/js/main.js"></script>
</html>
main.js
(function ($) {
// 검색 결과 vue object
var search_result = new Vue({
el: '#search-result',
data: {
search_result : {}
},
method: {
wishButton: function (event) {
console.log("add");
}
}
});
// 맛집 목록 vue object
var wish_list = new Vue({
el: '#wish-list',
data: {
wish_list : {}
},
methods: {
addVisit: function (index) {
$.ajax({
type: "POST" ,
async: true ,
url: `/api/restaurant/${index}`,
timeout: 3000
});
getWishList();
},
deleteWish: function (index) {
$.ajax({
type: "DELETE" ,
async: true ,
url: `/api/restaurant/${index}`,
timeout: 3000
});
getWishList();
}
}
});
// search
$("#searchButton").click(function () {
const query = $("#searchBox").val();
$.get(`/api/restaurant/search?query=${query}`, function (response) {
search_result.search_result = response;
$('#search-result').attr('style','visible');
});
});
// Enter
$("#searchBox").keydown(function(key) {
if (key.keyCode === 13) {
const query = $("#searchBox").val();
$.get(`/api/restaurant/search?query=${query}`, function (response) {
search_result.search_result = response;
$('#search-result').attr('style','visible');
});
}
});
$("#wishButton").click(function () {
$.ajax({
type: "POST" ,
async: true ,
url: "/api/restaurant",
timeout: 3000,
data: JSON.stringify(search_result.search_result),
contentType: "application/json",
error: function (request, status, error) {
},
success: function (response, status, request) {
getWishList();
}
});
});
function getWishList(){
$.get(`/api/restaurant/all`, function (response) {
wish_list.wish_list = response;
});
}
$(document).ready(function () {
console.log("init")
});
})(jQuery);
'Spring' 카테고리의 다른 글
[Spring] H2 데이터베이스 사용하기 & 인텔리제이 DB도구 추가 (0) | 2022.08.26 |
---|---|
[Spring] 인텔리제이 swagger 에러 해결 (0) | 2022.08.23 |
[Spring] Swagger (0) | 2022.08.19 |
[Spring] Server to Server 통신 - Custom Header, Json활용 (0) | 2022.08.19 |
[Spring] Server to Server 통신 - POST (0) | 2022.08.19 |
댓글