1. 데이터 바인딩

 


@Requestparm , @PathVariable, @ModelAttribute, @SessionAttributes 등 각종 어노테이션을 이용하여 사용자로부터 컨트롤러에 데이터를 전달되는 값을 서버가 원하는 데이터 형식에 맞게 변환해주는 작업입니다.

 

 

 

2. 데이터 바인딩 종류


스프링은 바인딩 과정에서 필요한 변환 작업을 위해 기본적으로 두가지 종류의 API를 제공합니다.

 

 

PropertyEditor

 

- 디폴트 프로퍼티 에디터

 

@RequestMapping("/hello")
public void hello(@RequestParam Charset charset, Model model){
	//URL이 /hello?charset=UTF-8이라면, 다음 컨트롤러 메소드의 charset 파라미터는 UTF-8으로 설정 된다.
}

 

@PostMapping("/login") //스프링이 자동으로 RequestLoginEntity를 바인딩 해준다.
public ModelAndView login(@ModelAttribute RequestLoginEntity RequestLoginEntity) {
	ModelAndView andView = new ModelAndView("/home");
	return andView;
}
public class RequestLoginEntity {

	private String email;
	private String password;

	public RequestLoginEntity(String email, String password) {
		super();
		this.email = email;
		this.password = password;
	}

	public RequestLoginEntity() {
		// TODO Auto-generated constructor stub
	}

	// --- 
    
   	// getter  , setter
    
   	// ----

}
  • 바인딩 과정에서는 변환할 파라미터 또는 모델 프로퍼티의 타입에 맞는 프로퍼티 에티터가 자동으로 선정돼서 사용됩니다.
  • 디폴트 바인딩을 위해서는 setter, getter가 있어야 합니다.

 

 

- 커스텀 프로퍼티 에디터

 

애플리케이션에서 직접 정의한 타입으로 직접 바인딩을 하고 싶다면, 프로퍼티 에디터를 직접 작성하면 됩니다.

 

예제

public class LoginPropertyEditor extends PropertyEditorSupport {

	@Override
	public String getAsText() {
		// TODO Auto-generated method stub
		return super.getAsText();
	}
	
	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		// TODO Auto-generated method stub
		super.setAsText(text);
	}
}

 

 

 

@InitBinder 

@Controller 메소드를 호출해줄 책임이 있는 AnnotationMethodHandlerAdapter는 @RequestParam이나 @ModelAttribute, @PathVariable 등처럼 HTTP 요청을 파라미터 변수에 바인딩해주는 작업이 필요한 어노테이션을 만나면 먼저 WebDataBinder를 만든다.

 

WebDataBinder는 여러가지 기능을 제공하는데, 그중에 HTTP 요청으로부터 가져온 문자열을 파라미터 타입의 오브젝트로 변환하는 기능도 포함되어 있다. 물론 이 변환 작업은 프로퍼티 에디터를 이용한다.

개발자가 만든 커스텀 프러퍼티 에디터를 @RequestParam과 같은 메소드 파라미터 바인딩에 적용하려면 WebDataBinder에 프로퍼티 에디터를 직접 등록해줘야 한다.

 

@InitBinder
	public void init(WebDataBinder binder) {
		binder.registerCustomEditor(Event.class, new EventPropertyEditor());
	}

	@GetMapping(value = "/bindingtest")
	public void event(@ModelAttribute Event event) {
		System.out.println("id "+ event.getId() + " , name :" +event.getName());
	}
public class EventPropertyEditor extends PropertyEditorSupport {

	@Override
	public String getAsText() {
		// TODO Auto-generated method stub
		Event event = (Event) getValue();
		return event.getId().toString();
	}

	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		// TODO Auto-generated method stub
		setValue(new Event(Integer.parseInt(text)));
	}
}

 

※  데이터 바인딩은 String <--> Object 변환만 가능하며 Object < -- > Object 변한은 불가능하다는 단점이 있다.

+ Recent posts