Chaeyeon0 / GreenDay_Study

여은개의 공부 일지
0 stars 0 forks source link

[20240521] 게시판 수정기능 405 에러 해결, 500 에러 해결 #15

Open janghw0126 opened 1 month ago

janghw0126 commented 1 month ago

💡 게시판 수정기능 405 에러 해결

image 수정 기능을 구현하다가 수정 버튼을 누르고 POST하는 과정에서

image 405 오류가 떴다. 오류 메시지를 해석해보니

[!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 메서드로 변경하였더니

image

image

image 수정이 잘 되었다는 것을 확인할 수 있었고,

image 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 에러 해결

image → 컨트롤러 쪽에서 발생한 에러이다.

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();
    }
}

이렇게 수정했더니 오류가 해결이 되었다.

이제 삭제 기능만 남았는데...이 삭제 기능이 마이 쉽지 안타..ㅎ

Chaeyeon0 commented 1 month ago

백엔드 능력자가 되어 가는 길이구만요 !! 지금도 잘 하고 있어요오 오늘도 수고해ㅆ습니당

khw010419 commented 1 month ago

와 아니 오류 진짜 ... 하나 해결하면 하나뜨고 .... 늘고생하는 우리 백엔드...