안녕하세요.
https://blog.naver.com/sysysy0302 여니입니다 :)
이번 SNS소셜네트워크 주제의 프로젝트에서 관리자 페이지를 맡게 되었고, 먼저 관리 페이지들 중 신고관리 페이지의 상세 조회시 새로운 창에 띄우는 것이 아닌 사이드 박스에 내용을 출력할 UI를 짰어요.
저는 reportNo를 가지고 체크 박스를 통해 삭제를 할 수 있도록 하고, 해당 게시글 목록을 클릭시 사이드 박스에 해당 신고 게시글의 상세 내역이 뜨도록 구현할 예정이랍니다.
에러 내용을 클릭해보니 안에 내용들이 뜨는데 이렇게 봐서는 잘 모르겠더라구요. 그래서 구글 검색을 해보았습니다.
[ 수정 전 ]
@PostMapping("/detailReport")
public String detailReport(
@RequestParam("reportNo") int reportNo,
Model model
) {
.. 이하 생략
먼저 상세조회 기능을 구현할 예정인데요, 위와 같이 매개변수로 reportNo를 이용하여 로직을 짜려고 했었는데.
해당 게시글을 클릭시 그에 맞는 reportNo가 출력되었지만, 서버측 콘솔창에 500에러가 함께 뜨면서 sts 콘솔창에는 아래와 같은 에러가 떴어요.
[ 에러 내용 ]
java.lang.IllegalStateException: Optional int parameter 'reportNo' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type
[ 구글 번역 ]
구글 번역을 해보니, reportNo가 파라미터 속성으로 넘어오지만, 값이 없어 null처리를 하려고 했으니 int라서 타입이 맞지 않아 변환이 안된다는 에러인 것 같았다.
선택적 int 매개변수 'reportNo'가 있지만 기본 유형으로 선언되었기 때문에 널값으로 변환할 수 없습니다. 해당 기본 유형에 대한 객체 래퍼로 선언하는 것을 고려하세요.
[ 오류 분석 ]
즉, reportNo라는 이름의 파라미터 값을 받으려고 하는데 해당 값이 정수형 기본 타입인 int형 변수이고 null값을 받을 수 없으니 Wrapper타입(Integer)으로 선언해라 라는 말입니다.
이후 좀 더 자세히 에러내용이 비슷한 분들의 사례를 찾아보니,
컨트롤러에서 읽어들일때 요청정보 헤더의 URI 에서 reportNo라는 Parameter를 찾는데, 만약 주소창에 QueryString이 없는 경우 컨트롤러는 해당 Parameter 값이 곧 null 임으로 인식한다고 하네요.
서버측에서는 설정되어 있는 파라미터 값인 reportNo를 받지 못했으므로 500에러를 터뜨립니다. 보내는 쪽에서 파라미터를 잘못 담아 보내는 에러이기 때문에 클라이언트 쪽에서 넘겨주고 있는 파라미터와 보내는 쿼리스트링을 잘 확인하고 수정해야겠습니다.
[ 수정 후 ]
@PostMapping("/detailReport")
public String detailReport(
Model model
) {
... 이하 생략
매개변수로 주었던 reportNo를 삭제하였고, 서버측 500 에러가 사라진 것을 볼 수 있습니다.