Programming/Spring

Request method 'GET' not supported 해결

helloworld: 2021. 7. 19. 01:49

 

cart.jsp 내의 form

cart.jsp 페이지는 장바구니 내역이 보여지는 페이지이다. 여기서 바로구매 버튼을 누르면 주문 페이지로 넘어가야 한다.

나는 바로구매 버튼에 자바스크립트 이벤트를 걸어서, form 안에 product_idx 값을 담은 input 요소를 생성하고 form.submit()을 호출했다.

보시다시피 form의 method는 POST 방식이다. 그래서 form의 action에 매핑되는 컨트롤러도 POST 방식의 요청을 받도록 @PostMapping("/cart/order_proc")으로 지정해놓았다.

 

그런데 바로구매 버튼을 누르면 자꾸 다음과 같은 에러가 발생한다.

도대체 왜 GET 요청을 받을 수 없다는 것인가? GET 요청이라는 것부터 이해가 되지 않았다.

그래서 form의 method나 매핑되는 컨트롤러의 어노테이션을 GET, POST로 이리저리 바꾸어 보아도 에러가 해결되지 않았다. 

Request method 'GET' not supported가 뜨거나 Request method 'POST' not supported가 나오는데.....

 

그래서 해당 컨트롤러 첫 줄부터 흐름을 파악해보았다.

여담이지만 프로젝트가 진행되면서, 서로 관련되는 서비스의 비즈니스 로직이 얽혀 전체적인 흐름을 파악치 못해 발생하는, 이런 식의 에러가 잦아졌다고 느낀다. 

스프링을 처음 배우고 '현존 웹 사이트 무작정 클론하기'를 모토로 시작한 프로젝트라 그런지 구현해야 할 범위는 큰데,

(설계도가 미비한 채) 그때그때 만들어나가 일관성이 없는 별로 훌륭하지 못한 비즈니스 로직에, 게다가 그 로직이 커지고 꼬여감을 느끼면서 프로젝트의 초기 설계가 중요하다는 걸 체감하게 된다. 명확한 기초 설계나 업무 정의 없이 뷰 클론부터 시작하여 서버단으로 내려가는 방식으로, 무작정 비슷해보이게 흉내내(려고 노력하)며 진행되어온 프로젝트라 ...

 

GET 요청이 지원이 안된다고 해서 @GetMapping으로 바꿔주었지만 이 부분이 문제가 아니었기에 에러는 해결되지 않았다.

 

문제는 redirect:/user/sign_in 으로 넘어간 UserController의 해당 메서드에 원인이 있었다.

나는 장바구니 담기 기능은 비로그인 상태에서도 이용할 수 있도록 하였고, 구매는 회원만 되도록 했다. 때문에 장바구니 페이지에서 바로구매 버튼을 누르면 로그인 여부를 확인하여 로그인을 하지 않았을 경우 로그인 페이지로 이동시켜야 한다.

위 메서드는 장바구니 페이지에서 바로구매 버튼 클릭 시 실행되는 메서드이다. 이 메소드에서 구매 페이지로 넘기는 로직이 진행된다.

위 코드는 일단 리다이렉트 전에 로그인 여부를 확인하고 비로그인 상태라면 세션영역에 url이라는 이름으로 /cart_order를 저장한다. 그리고 user/sign_in으로 리다이렉트 하는 부분이다. 

 

user/sign_in으로 리다이렉트 되었다면, 세션에 저장된 url을 꺼내서 cart_order인지 확인한다. 그리고 주문을 진행할 수 있도록 cart/order_proc로 리다이렉트 한다. (의도 : 로그인을 한 후, 다시 cart/order_proc로 리다이렉트 한다)

그런데!

문제 두 가지 발견.

첫번째,

음... 내가 왜 이 메서드에 저 작업을 하도록 해놓았지..??? 이 메서드는 로그인 페이지를 보여달라는 요청을 받아 로그인 페이지를 응답하는 메서드이다. 

 

따라서 '로그인 처리'를 하는 아래의 메서드에서 위와 같은 작업을 해야 하는 것이 맞다.

..중략..

로그인 성공 시, 세션에서 url을 확인하여 cart_order인 경우 주문을 진행하도록 한다.

 

문제 두번째, 이것이 에러의 원인인데

cart/order_proc를 리다이렉션하니까 여기서 GET 요청이 발생하는데, cart/order_proc를 받는 GET 방식의 컨트롤러 메서드가 없다.. 그저 POST 뿐.... 

 

원인을 찾으니 문제는 다음과 같이 해결되었다.