빈 검증 - 새 글쓰기

게시글을 표현하는 Article 클래스를 다음을 참조하여 수정한다.

Article.java
private Integer articleNo;//int에서 변경

@Size(min=2,max=10,message="게시판코드는 2자에서 10자 사이이어야 합니다.")
private String boardCd;

@Size(min=1,max=60,message="제목은 1자에서 60자 사이이어야 합니다.")
private String title;

@Size(min=1,message="내용은 1자 이상이어야 합니다.")
private String content;

//중간 생략..

public Integer getArticleNo() {
  return articleNo;
}

public void setArticleNo(Integer articleNo) {
  this.articleNo = articleNo;
}

아래에서 writeForm() 메소드는 내용이 없는 빈 객체(Article 객체)를 생성해 뷰에 전달해야 한다. 이건 스펙이니 따라야 한다. 글쓰기를 처리하는 요청 핸들러 메소드(write() 메소드)에 빈 검증 로직을 추가한다. 이 메소드의 매개 변수 리스트에서 @Valid 어노테이션이 적용된 매개 변수 다음에는 반드시 BindingResult 타입의 매개 변수를 선언해야 한다. 그렇지 않으면 HTTP 400 에러가 발생한다.

BbsController.java
//글쓰기 화면
@RequestMapping(value="/write", method=RequestMethod.GET)
public String writeForm(String boardCd, Model model) {
  String boardNm = boardService.getBoardNm(boardCd);
  model.addAttribute("boardNm", boardNm);//아래 테스트 화면처럼 '자유게시판'을 표시하기 위해
  model.addAttribute("article", new Article());
  return "bbs/write";
}

//글쓰기 처리
@RequestMapping(value="/write", method=RequestMethod.POST)
public String write(@Valid Article article, BindingResult bindingResult,
      Model model,
      MultipartHttpServletRequest mpRequest,
      Principal principal) throws Exception {
        
  //검증 로직
  if (bindingResult.hasErrors()) {
    String boardNm = boardService.getBoardNm(article.getBoardCd());
    model.addAttribute("boardNm", boardNm);//아래 테스트 화면처럼 '자유게시판'을 표시하기 위해
    return "bbs/write";
  }
    
  //article.setEmail(principal.getName());
  boardService.addArticle(article);

  //파일 업로드 - 기존과 같음

  //파일 데이터 삽입 - 기존과 같음

  return "redirect:/bbs/list?page=1&boardCd=" + article.getBoardCd();
}

아래를 참조해 JSP를 수정한다. <sf:errors> 태그는 사용자에게 검증 에러를 표시하는 스프링 폼 태그이다.

write.jsp
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>

<sf:form id="writeForm" action="write" method="post" enctype="multipart/form-data" 
      modelAttribute="article" onsubmit="return check();">
<input type="hidden" name="articleNo" value="${param.articleNo }" />
<input type="hidden" name="boardCd" value="${param.boardCd }" />
<input type="hidden" name="page" value="${param.page }" />
<input type="hidden" name="searchWord" value="${param.searchWord }" />
<sf:errors path="*" cssClass="error" />
<table id="write-form">
<tr>
  <td>제목</td>
  <td>
    <sf:input path="title" style="width: 90%" /><br />
    <sf:errors path="title" cssClass="error" />
  </td>
</tr>
<tr>
  <td colspan="2">
    <sf:textarea path="content" rows="17" cols="50" /><br />
    <sf:errors path="content" cssClass="error" />
  </td>
</tr>
<tr>
  <td>파일첨부</td>
  <td><input type="file" name="attachFile" /></td>
</tr>
</table>
<div style="text-align: center; padding-bottom: 15px;">
  <input type="submit" value="전송" />
  <input type="button" value="목록" onclick="goList()" />
  <c:if test="${not empty param.articleNo }">
    <input type="button" value="상세보기" onclick="goView()" />
  </c:if>
</div>
</sf:form>

아래는 글쓰기 화면에서 아무것도 입력하지 않고 전송 버튼을 눌렀을 때의 화면이다. (스타일시트에 .error { color: red; }가 추가되어 있어야 한다.) 글쓰기 화면
빈 검증 실패

참고