Date 를 원하는 형식을 변경

 

String birth 를 Data 타입으로 변경

 

User.java

package com.fastcampus.app;

import java.util.Date;

public class User {

	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date birth;
	private String sns;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getBirth() {
		return birth;
	}

	public void setBirth(Date birth) {
		this.birth = birth;
	}

	public String getSns() {
		return sns;
	}

	public void setSns(String sns) {
		this.sns = sns;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", pwd=" + pwd + ", name=" + name + ", email=" + email + ", birth=" + birth + ", sns="
				+ sns + "]";
	}

}

 

 

 

RegisterController.java

 

save 메서드 파라미터에 BindingResult 추가

BindingResult 추가 시 주의 점은

바인딩할 객체 바로 뒤에 코드를 추가해 주어야 한다.

package com.fastcampus.app;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class RegisterController {

//	@RequestMapping("/register/add")
//	@RequestMapping(value="/register/save", method= {RequestMethod.GET, RequestMethod.POST})
	@GetMapping("/register/add")
	public String register() {
		return "registerForm";
	}

//	@RequestMapping(value="/register/save", method=RequestMethod.POST)
	@PostMapping("/register/save") // Spring 4.3 부터 추가
	public String save(User user, BindingResult result, Model m) throws Exception {

		// 1. 유효성 검사
		if (!isValid(user)) {

			String msg = URLEncoder.encode("id를 잘못입력하셨습니다.", "utf-8");
			m.addAttribute("msg", msg);

//			return "redirect:/register/add?msg="+msg; // URL 재작성(rewriting)
			return "redirect:/register/add";
		}

		// 2. DB에 신규회원 정보를 저장
		return "registerInfo";
	}

	private boolean isValid(User user) {
		// TODO Auto-generated method stub
		return true;
	}
}

 

 

 

회원가입 페이지에서 등록을 해보자

 

 

birth 값이 null 로 변환실패다

 

 

 

형식 지정

 

RegisterController 에 다음 코드 추가

SimpleDateFormat("yyyy-mm-dd") 형식으로 들어온 데이터를

Date 형식으로 출력한다

new CustomDateEditor 의 false 는 빈 공간 유무를 정하는 역할이다.

변환 실패 없이 잘 출력 되었다.

	@InitBinder
	public void toDate(WebDataBinder binder) {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
		binder.registerCustomEditor(Date.class,  new CustomDateEditor(df, false));
	}

 

 

String 배열을 구분자를 설정해서 입력받기

 

StringArrayPropertyEditor("#") 을 추가

	@InitBinder
	public void toDate(WebDataBinder binder) {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
		binder.registerCustomEditor(Date.class,  new CustomDateEditor(df, false));
		binder.registerCustomEditor(String[].class,  new StringArrayPropertyEditor("#"));

	}

 

 

 

 

@DateTimeFormat 어노테이션 사용

 

@DateTimeFormat(pattern="yyyy-MM-dd") 추가

CustomDateEditor 주석 처리

	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date birth;
@InitBinder
	public void toDate(WebDataBinder binder) {
//		SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
//		binder.registerCustomEditor(Date.class,  new CustomDateEditor(df, false));
		binder.registerCustomEditor(String[].class,  new StringArrayPropertyEditor("#"));

	}

 

 

PropertyEditor

 

양방향 타입 변환(String  -> 타입, 타입 -> String) 특정 타입이나 이름의 필드에 적용가능

 

디폴트 PropertyEditor - 스프링이 기본적으로 제공

커스텀 PropertyEditor - 사용자가 직접 구현. PropertyEditorSupport 를 상속하면 편리

 

모든 컨트롤러 내에서의 변환 - WebBindingInitializer 를 구현 후 등록

특정 컨트롤러 내에서의 변환 - 컨트롤러에 @InitBinder 가 붙은 메서드를 작성

 

 

 

 

Converter 와 ConversionService

 

package com.fastcampus.app;

import org.springframework.core.convert.converter.Converter;

public class StringToStringArrayConverter implements Converter<String, String[]>{

	@Override
	public String[] convert(String source) {
		return source.split("#"); // String -> String[] 
	}
	

}

단방향 타입 변환(타입A -> 타입B) PropertyEditor 의 단점을 개선(stateful -> stateless)

 

디폴트 PropertyEditor - 스프링이 기본적으로 제공

커스텀 PropertyEditor - 사용자가 직접 구현. PropertyEditorSupport 를 상속하면 편리

 

ConversionService - 타입 변환 서비스를 제공. 여러 Converter 를 등록 가능

 

WebDataBinder 에 DefaultFormattingConversionService 이 기본 등록

모든 컨트롤러 내에서의 변환 - WebBindingInitializer 를 구현 후 등록

특정 컨트롤러 내에서의 변환 - 컨트롤러에 @InitBinder 가 붙은 메서드를 작성

 

 

 

Formatter

 

 

양방향 타입 변환(String  -> 타입, 타입 -> String) 바인딩할 필드에 적용 - @NumberFormat, @DateTimeFormat

public interface Formatter<T> extends Printer<T>, Parse<T>{}
public interface Printer<T> {
 	String print(T object, Locale locale); // Object -> String
}
public interface Parse<T> {
 	T parse(String text, Locale locale) throws ParesException; // String -> Object
}

	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date birth;
    
    @NumberFormat(pattern="###,###")
	BigDecimal salary;

 

 

'Spring > Ch2. Spring MVC' 카테고리의 다른 글

Spring MVC - HTTP 요청과 응답  (0) 2022.11.16
Spring MVC - 데이터 변환과 검증2  (2) 2022.09.25
Spring MVC - DispatcherServlet  (0) 2022.09.23
Spring MVC - 예외 처리2  (0) 2022.09.22
Spring MVC - 예외 처리  (0) 2022.09.22
복사했습니다!