게시판을 만드는 프로젝트에서 댓글 작성 기능 을 구현하던 도중, 예상치 못한 문제가 발생했다!!
AJAX를 사용해 클라이언트에서 서버로 POST 방식의 요청을 보냈음에도 불구하고, 서버는 요청을 처리하지 못하고 URL을 찾지 못하는 오류가 계속 발생했다.
구체적인 에러 메시지는 아래와 같다.
w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
→ 이 오류는 주로 클라이언트가 서버로 보내는 요청 방식이 서버에서 정의된 방식과 일치하지 않을 때 발생한다.
http://localhost:8080/BasicBoard/boardDetail/513http://localhost:8080/BasicBoard/boardDetail/addComment 로 해석클라이언트
function commentSave(){
var comment = $('input[name="comment"]').val();
var board_idx = ${detail.idx};
$.ajax({
type: 'POST',
url: 'addComment',
data: {
'comment' : comment,
'board_idx' : board_idx
},dataType: 'JSON',
success: function(data){
console.log(data);
},error: function(e){
console.log(e);
}
});
}
서버
@PostMapping(value="/addComment")
@ResponseBody
public Map<String, Object> addComment(@ModelAttribute CommentDTO commentDto){
logger.info("comment : " + commentDto.toString());
Map<String, Object> response = new HashMap<>();
response.put("status", "success");
return response;
}
클라이언트
function commentSave(){
var comment = $('input[name="comment"]').val();
var board_idx = ${detail.idx};
$.ajax({
type: 'POST',
url: '/BasicBoard/addComment',
data: {
'comment' : comment,
'board_idx' : board_idx
},dataType: 'JSON',
success: function(data){
console.log(data);
},error: function(e){
console.log(e);
}
});
}
기존 경로(상대) (http://localhost:8080/BasicBoard/boardDetail/addComment) ▶ 변경 경로(절대) (http://localhost:8080/BasicBoard/addComment)
❗ 기존에 상대경로로 입력했을때 문제가 발생하지 않은 이유는 절대경로 뒤에 바로 붙여서 이동하고 그 뒤에 다른 경로를 붙이지 않았기 때문에었다.
하지만 점점 기능을 추가하면서 여러 경로들이 추가되며 발생했던 문제였다.
URL 이 깔끔하지 못하면 계속해서 길어지고, 중복되는 코드가 발생하고 URL 경로가 단순하고, 명확해져야 유지보수에 도움이 된다는 것을 알게 되었다.
그래서 프로젝트의 URL에서 BasicBoard와 같은 루트 경로를 제거하고, 깔끔한 URL 구조를 사용하고자 Tomcat의 설정 파일인 server.xml을 수정해주었다.
<Context docBase="BasicBoard" path="/" reloadable="true" source="org.eclipse.jst.jee.server:BasicBoard"/>
문제를 해결하기 위해 아래 내용들을 수행하였고,
이 경험을 통해, 요청 방식과 경로 해석의 중요성을 다시 한번 깨달을 수 있었으며, URL 구조를 단순화하고 명확하게 설정하는 것이 유지보수에 큰 도움이 된다는 점을 알게 되었다.