기존 코드
행위에 대한 표현이 아닌 리소스 표현하는데 중점을 두어야 한다
즉, 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}/devices
GET /users/{userid}/likes/devices
3.스토어(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