※GET / POST 방식을 구분하지 않고 코드를 작성할 때 발생하는 에러
위 list 목록 페이지에서 reg라는 글쓰기 페이지를 호출하려고 한다.
reg라는 글쓰기 페이지는 아래 코드와 같이 files라는 객체를 사용한다.
그런데 페이지 호출시 files와 관련해 받은 내용이 없어 해당 객체는 null 값이 되고,
이로 인해 목록에서 글쓰기 페이지를 호출하면 500 오류가 발생한다.
1) reg 페이지 관련 Controller
@RequestMapping("reg")
@ResponseBody
public String reg(MultipartFile[] files, HttpServletRequest request) throws IllegalStateException, IOException {
for(MultipartFile file : files) {
long size=file.getSize();
String fileName=file.getOriginalFilename();
...
}
...
}
2) error 내용
3) 원래 기대했었던 페이지 내용(현재 위에서의 500 오류 발생으로 나오지 않고 있음)
4) reg.jsp 에서 form태그가 보내는 method 방식이 POST 방식
<form action="list" method="post" enctype="multipart/form-data">
...
...
</form>
등록 버튼을 눌러 작성한 내용들을 전송해야할 경우만 files를 사용하는 것이 아닌,
글쓰기 페이지를 호출하는 경우에도 files를 사용하여 문제가 발생하고 있는 것이다.
이를 해결하기 위해서는 2가지 방법이 있다.
1) files 가 null이면 코드에서 files를 사용하지 않도록 한다.
2) 컨트롤러를 사용하여 GET 방식과 POST 방식을 구분하여 코드가 동작하도록 한다.
이 중에서 두번째 방법을 사용하여 문제를 해결해보겠다.
1. GET / POST 구분없이 모든 요청을 수행하는 @RequestMapping
목록 페이지에서 reg 글쓰기 페이지를 단순 호출할 때는 GET 방식을 사용한다.
따라서 다른 페이지에서 글쓰기 페이지를 단순 호출하는 경우에(GET 요청의 경우) 동작하는 메소드와
글쓰기 페이지 내부에서 등록 버튼을 눌렀을 경우(POST 요청의 경우) 동작하는 메소드가 다르게 코드를 작성해야한다.
2. GET / POST 요청 구분 방법
위의 두 방식 모두 사용하여 요청 방식에 따른 동작을 구분지을 수 있으나,
좀 더 최신에 생기고 직관적인 @GetMapping, @PostMapping 어노테이션을 사용해보겠다.
@GetMapping("reg")
public String reg() {
return "admin.board.notice.reg";
}
@PostMapping("reg")
public String reg(MultipartFile[] files, HttpServletRequest request) throws IllegalStateException, IOException {
for(MultipartFile file : files) {
long size=file.getSize();
...
}
...
return "admin.board.notice.reg";
}
3. 결과
GET/ POST 요청 구분을 통해 files가 null 값이 되는 것을 방지하여 문제를 해결했다.
[자료 출처 : 뉴렉처 https://www.youtube.com/@newlec1 ]
'뉴렉쳐 스프링 프레임워크 정리 > PArt3.MVC' 카테고리의 다른 글
[SpringMVC] 파일 업로드 (0) | 2023.06.30 |
---|---|
레이아웃 페이지 만들기와 Tiles 라이브러리 설정 (0) | 2023.06.28 |