스프링

 

 

Maven이용 시 pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 

Gradle이용 시 build.gradle

implementation 'org.springframework.boot:spring-boot-starter-validation'

 

 

controller

import com.godcoder.myhome.model.Board;
import com.godcoder.myhome.repository.BoardRepository;
import com.godcoder.myhome.validator.BoardValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.thymeleaf.util.StringUtils;

import javax.persistence.EntityExistsException;
import javax.validation.Valid;
import java.util.List;

@Controller
@RequestMapping("/board")
public class BoardController {

    @Autowired
    private BoardRepository boardRepository;

    @Autowired
    private BoardValidator boardValidator;


    @GetMapping("/form")
    public String form(Model model, @RequestParam(required = false) Long id, Board board){
        if(id==null){
            model.addAttribute("board", board);
        }else{
            Board board2=boardRepository.findById(id).orElseThrow(EntityExistsException::new);
            model.addAttribute("board", board2);
        }
        return "board/form";
    }

    @PostMapping("/form")
    public String boardSubmit(@Valid Board board, BindingResult  bindingResult , Model model) {
        boardValidator.validate(board, bindingResult);
        
        if(bindingResult.hasErrors()){
            return "board/form";
        }
        boardRepository.save(board);
        model.addAttribute("board", board);
        return "redirect:/board/list";
    }




}

 

board

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.lang.NonNull;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.Size;

@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Board {

    @Id
    @GeneratedValue(strategy =  GenerationType.IDENTITY)
    private Long id;

    @NonNull
    @Size(min=2, max=30, message = "제목은 2자 이상 30 이하여야 합니다.!!!")
    private String title;

    private String content;


}

 

 

import com.godcoder.myhome.model.Board;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.thymeleaf.util.StringUtils;

import javax.validation.ConstraintViolation;
import javax.validation.executable.ExecutableValidator;
import javax.validation.metadata.BeanDescriptor;
import java.util.Set;

@Component
public class BoardValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
        return Board.class.equals(clazz);
    }

    @Override
    public void validate(Object obj, Errors e) {

        Board board= (Board) obj;
        if(StringUtils.isEmpty(board.getContent())){
            e.rejectValue("content", "key", "내용을 입력해 주세요.11");
        }
    }


}

 

 

form.html

 <main role="main" class="container">
        <div class="starter-template">
            <h1>게시판</h1>
        </div>

        <form action="#"   th:action="@{/board/form}"   th:object="${board}"  method="post">
            <input type="hidden" class="form-control" id="id"    th:field="*{id}">
            <div class="form-group">
                <label for="title">제목</label>
                <input type="text" class="form-control" id="title"    th:field="*{title}"
                       th:classappend="${#fields.hasErrors('title')}? 'is-invalid' :''"
                >
                <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="invalid-feedback">title Error</div>

            </div>
            <div class="form-group">
                <label for="content">내용</label>
                <textarea class="form-control" id="content" rows="3"  th:field="*{content}"
                          th:classappend="${#fields.hasErrors('content')}? 'is-invalid' :''"
                ></textarea>
                <div th:if="${#fields.hasErrors('content')}" th:errors="*{content}" class="invalid-feedback">content Error</div>
            </div>
            <div class="text-right">
                <button type="submit" class="btn btn-primary" >확인</button>
                <a  class="btn btn-primary" th:href="@{/board/list}" >취소</a>
            </div>
        </form>

    </main><!-- /.container -->

 

 

 

커스텀 Validation  는

Validator 상속 받는 도메인 객체  BoardValidator  클래스 생성 후 유효성 체크 코드를 작성후 다음과 같이 사용

 

 
@Autowired

private BoardValidator boardValidator;

 @PostMapping("/form")
    public String boardSubmit(@Valid Board board, BindingResult  bindingResult , Model model) {
        boardValidator.validate(board, bindingResult);
        
        if(bindingResult.hasErrors()){
            return "board/form";
        }
        boardRepository.save(board);
        model.addAttribute("board", board);
        return "redirect:/board/list";
    }

 

 

 

참조

:

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/validation.html

 

about author

PHRASE

Level 60  라이트

널리 배우고 연구하지만 연구한 것을 곧 남에게 가르치지는 마라. 더욱 깊이 연구하여 마음속에 간직해 두어야 한다. -소학

댓글 ( 4)

댓글 남기기

작성