메모장

Spring 유효성 검사 (3) 본문

Spring/개념정리

Spring 유효성 검사 (3)

Itchild 2024. 9. 3. 13:16
728x90
반응형

 

저번 코드를 살펴 보자

@RequestMapping("/test") // method요청 써도됨  // @Valid 너 만들라고 시킨거 얘 검사할때 시키는거야 
	public String root(@Valid VO vo, BindingResult br, Model model) { // 커맨드 객체 , Model model , 에러친구 커맨드 객체로 받아올 수 있게 
		// 검사 코드가 컨트롤러에 그대로 오픈 되어 있지 않다 . 따로 검사 객체에 들어가있다. 
		// 서버 통신과 관련된 컨트롤러가 있고 검사만 진행하는 컨트롤러가 따로 있다 . 
		
		
		
		VOValidator voV = new VOValidator(); 
		voV.validate(vo, br); // 검사를 했을때 검사 할게 여러가지 일 수 있는데 자바에서 그게 안되기 때문에 따로 객체를 사용할 수 있다. br 는 커맨드 객체(참조변수)를 참조하고 있다. 
		// validate 메서드 강제에 의해 만들어진 메서드 

		if(br.hasErrors()) {
			System.out.println("로그 : 에러 발생함!");
			System.out.println("발생한 에러목록");
			System.out.println(br.getAllErrors()); //전체를 출력해준다. // for문과도 잘 어울림 

			if(br.getFieldError("id") != null) { // id에서 에러가 발생했을때 
				System.out.println(br.getFieldError("id").getCode());
			}
			if(br.getFieldError("password") != null) {
				System.out.println(br.getFieldError("password").getCode());
				// 어노테이션으로 설정한거 볼게 
			}
		}
		
		model.addAttribute("apple", vo.getId());
		return "test";
	}
 

 

저번 코드 에서 우리는 아직 한가지 걸리는 부분이 있다.

 

아직도 객체화를 직접 해주고 있다는 점 !

이것을 제어의 역행 == IoC 커맨드 객체화 시켜보자 !

 


먼저 gradle에서 설정 파일을 추가 하자

implementation 'org.springframework.boot:spring-boot-starter-validation' // validator 자동화 시키기

 

그리고 컨트롤러로 이동해서

메서드를 하나 만들어준다.

@InitBinder

: Spring Validator를 사용 시 @Valid 어노테이션으로 검증이 필요한 객체를 가져오기 전에 수행할 method를 지정해주는 어노테이션이다.

 

그리고

@Valid

: 객체 안에서 들어오는 값에 대해 검증이 가능해진다.

 

@InitBinder 와 @Valid 같이 쓰인다.

@InitBinder컨트롤러가 동작했을때 이미 validator 가 동작 될 수 있도록 할때 사용하고

@Valid 는 검증 할려는 객체가 무엇인지 정해준다. 지금은 VO 객체 이기 때문에 VO 앞에 붙인다.

 

전체코드는 이러하다.

package com.hong.app;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;

import jakarta.validation.Valid;

@Controller
public class CTRL {

	@RequestMapping("/")
	public String root() {
		return "test";
	}
	
	@RequestMapping("/test") // method요청 써도됨  // @Valid 너 만들라고 시킨거 얘 검사할때 시키는거야 
	public String root(@Valid VO vo, BindingResult br, Model model) { // 커맨드 객체 , Model model , 에러친구 커맨드 객체로 받아올 수 있게 
	
	//	VOValidator voV = new VOValidator();  // 얘를 직접 쓰고 있는데 이걸 없애보자 // 이걸 커맨드 객체화 IoC 시키고 있다.  
		
	//	voV.validate(vo, br); // 검사를 했을때 검사 할게 여러가지 일 수 있는데 자바에서 그게 안되기 때문에 따로 객체를 사용할 수 있다. br 는 커맨드 객체(참조변수)를 참조하고 있다. 
		// validate 메서드 강제에 의해 만들어진 메서드 
		
		if(br.hasErrors()) {
			System.out.println("로그 : 에러 발생함!");
			System.out.println("발생한 에러목록");
			System.out.println(br.getAllErrors()); // for문과도 잘 어울림 

			if(br.getFieldError("id") != null) {
				System.out.println(br.getFieldError("id").getCode());
			}
			if(br.getFieldError("password") != null) {
				System.out.println(br.getFieldError("password").getCode());
				// 어노테이션으로 설정한거 볼게 
			}
		}
		
		model.addAttribute("apple", vo.getId());
		return "test";
	}
	
	// 컨트롤러가 동작했을때 이미 validator 가  동작 될 수 있도록 
	@InitBinder // 이런 어노테이션을 사용하기 위해 gradle 에 추가 한거다. 
	   protected void initBinder(WebDataBinder wdb) {
	      wdb.setValidator(new VOValidator());  
	   } 
	
	
}
 

 

하지만 이것도 예전 방식에는 이렇게 자주 보였으나 요즘은 바뀌었다.

왜냐하면 아직도 new 가 쓰이고 있기 때문이다.

 

 


Spring boot 유효성 검사 최종

 

요즘은 VO 에서 간편하게 유효성 검사를 처리한다.

어노테이션이 대충 짐작이 가실 수 있다.

@NotNull - null 일때 나올 message

@NotEmpty - Empty 일때 나올 message

@Size - min 부터 max 까지 , message

 

요즘 VO 에서 유효성 검사를 처리 하는게 보편적이다.

 

728x90
반응형