기존 코드

행위에 대한 표현이 아닌 리소스 표현하는데 중점을 두어야 한다
즉, GET /restaurant/addNearest → POST /restaurant
리소스명은 동사보다는 명사를 사용한다
add와 같은 동사 사용 X
// REST 적용 예시 1
GET /members/delete/1 (X)
DELETE /members/1 (O)
// REST 적용 예시 2
GET /members/show/1 (X)
GET /members/1 (O)
// REST 적용 예시 3
GET /members/insert/3 (X)
POST /members/3 (O)
HTTP Method 의 경우, Service 에서 진행되는 비즈니스 로직에 맞추어 일관성을 유지해주는 것이 좋다
ex) service.updateSomething() → Controller (@PustMaaping(/something)
/user/ : X/user : Ouser/saved_restaurant : Xuser/saved-restaurant : O// REST 적용 예시
http://restapi.example.com/members/soccer/345/pthoto.jpg (X)
GET /members/soccer/345/photo HTTP/1.1 (O)
	Host: restapi.example.com
	Accept: image/jpg

GET /users/{userid}/devicesGET /users/{userid}/likes/devices3.스토어(Store)
REFERENCE
	// 위경도를 통해 주소 반환
    @PostMapping("/getFullAddress")
    public String getFullAddress(AddressDTO request){
        String result = userService.getAddress(request.getX(), request.getY());
        log.info(request.toString());
        return result;
    }
    // 주소를 통해 위경도 반환
    @PostMapping("/getLonLat")
    public AddressDTO getLonLat(@RequestParam(value ="fullAddress") String fullAddress){
        log.info("full address : "+fullAddress);
        return userService.getXY(fullAddress);
    }
	@GetMapping("/search/reverse-geo")
    public String getFullAddress(AddressDTO request){
        String result = userService.getAddress(request.getX(), request.getY());
        log.info(request.toString());
        return result;
    }
    // 주소를 통해 위경도 반환
    @GetMapping("/search/geo")
    public AddressDTO getLonLat(@RequestParam(value ="fullAddress") String fullAddress){
        log.info("full address : "+fullAddress);
        return userService.getXY(fullAddress);
    }
reverse-geo, 지오코딩의 경우 : geo로 GET 할 수 있도록 합니다/search 로 일관성을 유지합니다	@SneakyThrows
    @GetMapping("/addNearest")
    public String addNearestRestaurant(@LoginUser SessionUser user){
        // 신규 주변 음식점 정보가 있다면 insert, 이후 restaurant view 로 이동
        
        GetRestaurantRequest request = GetRestaurantRequest.builder()
                                        .x(String.valueOf(user.getX()))
                                        .y(String.valueOf(user.getY()))
                                        .build();
        restaurantService.getRestaurantData(request);
        return "redirect:/restaurant/main"; // 메인 페이지로 이동
    }
    @GetMapping("/main")
    public String main(@LoginUser SessionUser user
                        ,Model model){
        // 현재 위치 기준 가까운 순으로 정렬
        AddressDTO request = AddressDTO.builder()
                .x(user.getX())
                .y(user.getY())
                .build();
        // 가까운 음식점 정보를 가져옴
        List<RestaurantDTO> datas = restaurantService.getRestaurantDTO(request);
        model.addAttribute("restaurants", datas);
        return "restaurant";
    }@SneakyThrows
    @GetMapping("/addNearest")
    public String addNearestRestaurant(@LoginUser SessionUser user){
        // 신규 주변 음식점 정보가 있다면 insert, 이후 restaurant view 로 이동
        
        GetRestaurantRequest request = GetRestaurantRequest.builder()
                                        .x(String.valueOf(user.getX()))
                                        .y(String.valueOf(user.getY()))
                                        .build();
        restaurantService.getRestaurantData(request);
        return "redirect:/restaurant/main"; // 메인 페이지로 이동
    }
    @GetMapping("/main")
    public String main(@LoginUser SessionUser user
                        ,Model model){
        // 현재 위치 기준 가까운 순으로 정렬
        AddressDTO request = AddressDTO.builder()
                .x(user.getX())
                .y(user.getY())
                .build();
        // 가까운 음식점 정보를 가져옴
        List<RestaurantDTO> datas = restaurantService.getRestaurantDTO(request);
        model.addAttribute("restaurants", datas);
        return "restaurant";
    }
	@SneakyThrows
    @PostMapping("/near")
    public String addNearestRestaurant(@LoginUser SessionUser user){
        // 신규 주변 음식점 정보가 있다면 insert, 이후 restaurant view 로 이동
        GetRestaurantRequest request = GetRestaurantRequest.builder()
                                        .x(String.valueOf(user.getX()))
                                        .y(String.valueOf(user.getY()))
                                        .build();
        restaurantService.getRestaurantData(request);
        return "redirect:/restaurant/main"; // 메인 페이지로 이동
    }
/near 로 동사 사용 X	@PostMapping("/postXY")
    public String postXY(AddressDTO dto
            , @LoginUser SessionUser user){
        user.setX(dto.getX());
        user.setY(dto.getY());
        User newUser = userService.saveOrUpdateXY(user);
        httpSession.setAttribute("user", new SessionUser(newUser));
        return "redirect:/restaurant/addNearest";
    }
	@PutMapping("/lon-lat")
    public String postXY(AddressDTO dto
            , @LoginUser SessionUser user){
        user.setX(dto.getX());
        user.setY(dto.getY());
        User newUser = userService.saveOrUpdateXY(user);
        httpSession.setAttribute("user", new SessionUser(newUser));
        return "redirect:/restaurant/addNearest";
    }
REST 원칙에 맞게 바꾼 url 로 호출 시 잘 작동하는지 확인합니다
<form th:action="@{/user/lon-lat}"  method="POST">
    <input type="hidden" name="_method" value="PUT">
    위도
    <input type="text"  id="x" name="x" readonly/>
    <br>
    경도
    <input type="text"  id="y" name="y" readonly/>
    <button type="submit">등록</button>
</form>
해결법
<input type="hidden" name="_method" value="PUT">다음과 같이 html 을 form 태그안에 추가한다- 스프링 부트 2.2버전 이상은 자동으로 구성되지 않는다, 그래서 프로퍼티에 다음 설정을 추가합니다.
 spring.mvc.hiddenmethod.filter.enabled=true- 추가적으로 왜 html 에서 지원하지 않는지 form 에서 put, delete
 


