[!NOTE]
Request method 'POST' is not supported 메시지
: 특정 URL에 대한 POST 요청이 허용되지 않는다는 의미이다.
즉, 요청된 메서드인 POST를 처리할 수 있는 핸들러 메서드가 없어서 발생한 것이다.
그래서
package com.example.greenday_board.controller;
import com.example.greenday_board.dto.BoardDto;
import com.example.greenday_board.service.BoardService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@AllArgsConstructor
public class BoardController {
private BoardService boardService;
/* 게시글 목록 */
@GetMapping("/")
public String list(Model model) {
List<BoardDto> boardList = boardService.getBoardlist();
model.addAttribute("boardList", boardList);
return "board/list.html";
}
/* 게시글 작성 폼 */
@GetMapping("/post")
public String write() {
return "board/write.html";
}
/* 게시글 작성 */
@GetMapping("/post/{no}")
public String detail(@PathVariable("no") Long no, Model model) {
BoardDto boardDTO = boardService.getPost(no);
model.addAttribute("boardDto", boardDTO);
return "board/detail.html";
}
@PostMapping("/post")
public String write(BoardDto boardDto) {
boardService.savePost(boardDto);
return "redirect:/";
}
/* 게시글 수정 폼 */
@GetMapping("/post/edit/{no}")
public String edit(@PathVariable("no") Long no, Model model) {
BoardDto boardDTO = boardService.getPost(no);
model.addAttribute("boardDto", boardDTO);
return "board/update.html";
}
// /* 게시글 수정 */
// @PutMapping("/post/edit/{no}")
// public String update(BoardDto boardDTO) {
// //boardDTO.setNo(no); // 업데이트할 게시글 번호 설정
// boardService.savePost(boardDTO);
//
// return "redirect:/";
// }
/* 게시글 삭제 */
@DeleteMapping("/post/{no}")
public String delete(@PathVariable("no") Long no) {
boardService.deletePost(no);
return "redirect:/";
}
@PostMapping("/post/edit/{no}")
public String update(BoardDto boardDTO) {
boardService.savePost(boardDTO);
return "redirect:/"; // 적절한 리다이렉트 URL로 수정하세요
}
}
컨트롤러 부분에서 PUT mapping 부분 대신에 POST 메서드로 변경하였더니
수정이 잘 되었다는 것을 확인할 수 있었고,
DB에도 수정된 데이터가 잘 담겼다는 것을 확인할 수 있었다.
/* 게시글 수정 */
@PutMapping("/post/edit/{no}")
public String update(BoardDto boardDTO) {
//boardDTO.setNo(no); // 업데이트할 게시글 번호 설정
boardService.savePost(boardDTO);
return "redirect:/";
}
처음에는 위의 수정 매핑 부분을 바탕으로 그대로 POST 부분을 작성하니까 코드에 오류가 생겼다.
암튼 결론적으로, 어노테이션을 PUT → POST 로 변경했는데 이렇게 수정한 이유는 일부 브라우저나 프록시 서버에서 PUT 요청을 처리하는 데 문제가 발생할 수 있기 때문이다. 따라서 PUT 대신 POST를 사용하여 게시글을 수정하는 것이 더 안전하다고 여겨진다.
⇒ 그러나 RESTful API 디자인 규칙을 따르려면 PUT 메서드를 사용하여 리소스를 수정하는 것이 좋다고 한다.
👀 500 에러 해결
→ 컨트롤러 쪽에서 발생한 에러이다.
url과 매핑된 함수는 결과 값을 반환해야 되는데 아무런 값도 반환하지 않기 때문에 오류가 발생한 것이다.
→ 오류를 해결할려면 클라이언트(브라우저)로 응답을 리턴해야 한다 !
아마 POST 요청이 제대로 적용되지 않았던 것으로 추정된다.
→ 403 오류랑 연관된 것 같다.
config 패키지도 엔드포인트 부분을 수정해야 했다.
package com.example.greenday_board.config;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@EnableWebSecurity
@AllArgsConstructor
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/", "/post", "/post/**", "/post/edit/**").permitAll()
.anyRequest().permitAll() // 모든 요청에 대해 접근 허용
)
.csrf().disable(); // 필요 시 CSRF 보호 비활성화
return http.build();
}
}
💡 게시판 수정기능 405 에러 해결
수정 기능을 구현하다가 수정 버튼을 누르고 POST하는 과정에서
405 오류가 떴다. 오류 메시지를 해석해보니
즉, 요청된 메서드인 POST를 처리할 수 있는 핸들러 메서드가 없어서 발생한 것이다.
그래서
컨트롤러 부분에서
PUT mapping
부분 대신에POST
메서드로 변경하였더니수정이 잘 되었다는 것을 확인할 수 있었고,
DB에도 수정된 데이터가 잘 담겼다는 것을 확인할 수 있었다.
처음에는 위의 수정 매핑 부분을 바탕으로 그대로 POST 부분을 작성하니까 코드에 오류가 생겼다.
암튼 결론적으로, 어노테이션을
PUT → POST
로 변경했는데 이렇게 수정한 이유는 일부 브라우저나 프록시 서버에서 PUT 요청을 처리하는 데 문제가 발생할 수 있기 때문이다. 따라서 PUT 대신 POST를 사용하여 게시글을 수정하는 것이 더 안전하다고 여겨진다. ⇒ 그러나 RESTful API 디자인 규칙을 따르려면 PUT 메서드를 사용하여 리소스를 수정하는 것이 좋다고 한다.👀 500 에러 해결
→ 컨트롤러 쪽에서 발생한 에러이다.
이렇게 수정했더니 오류가 해결이 되었다.
이제 삭제 기능만 남았는데...이 삭제 기능이 마이 쉽지 안타..ㅎ