데이터 타입 변환

죽부인·2023년 1월 1일
0

📁Ex

URL 로 들어오는 Map은 모두 String 처리 되어 있다 .
MyDate 클래스로 타입변환을 하여 데이터를 넣어준다.

📌PropertyEditor

  • 양방향 타입 변환 ( String -> 타입 , 타입 -> String )
    특정 타입이나 이름의 필드에 적용 가능
@InitBinder
    public void toDate(WebDataBinder binder) {
        binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor("#"));
        binder.registerCustomEditor(String[].class, "hobby" , new StringArrayPropertyEditor("#")); // 특정 타입 이나 이름 ("hobby") 에만 적용가능 
    }
  • 모든 컨드롤러 내에서의 변환 : WebBindingInitializer 구현
    특정 컨트롤러 내에서의 변환 : 컨트롤러 안에 @InitBinder 가 붙은 메서드 작성

  • 단점 : stateful
    stateful : 인스턴스변수 사용 ( 싱글톤 사용x = 변환할 때 마다 새로운 객체 계속 생성해야 함 )

📌Converter

  • 단방향 타입 변환 (타입 A -> 타입 B)
  • stateless ( 싱글톤 o )
  • 모든 컨트롤러 내에서의 변환 - ConfigurableWebBindingInitializer 설정
    특정 컨트롤러 내에서의 변환 - 컨트롤러에 @InitBinder 가 붙은 메서드 작성
public class StringToStringArrayConverter implements Converter(< String , String[] >) // String -> String[]로 변환 
	@Override
    public String[] convert(String source){
    	return source.split("#"); // String -> String[] 
        }

📌Formatter

  • 양방향 타입 변환 (String -> 타입 , 타입 -> String )
  • @NumberFormat , @DateTimeFormat사용
public interface Formatter<T> extends Printer<T> , Parser<T>{ }

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

📌 예시

📘 Controller 내부 변환 메서드

📁 BindingResult

내부에서 에러나 결과를 Controller에 담기도록 한다.
BindingResult는 값을 전달받을때 , 에러가 포함된 변수의 뒤쪽에 위치하여 에러가 있는 상태를 Controller가 처리 하도록 한다.

@PostMapping("/register/save")
   public String save(User user, BindingResult result, Model m) throws Exception {
   
   }

Date 타입은 yyyy/mm/dd 로 표준 형식으로 넘겨주어야 하지만, yyyy-mm-dd 로 입력 형태를 바꿔주려고 한다.

@InitBinder
	public void toDate(WebDataBinder binder) {
    	SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); //입력 형식 지정 
		binder.registerCustomEditor(Date.class, new CustomDateEditor(df,false)); // Date 타입 
	}

📁Formatter 애너테이션 사용

InitBinder 내부 2줄 대신 사용

public class User {
	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date birth;
    }

📘String 배열 변환 예시

public class User {
	private String[] hobby;
	private String[] sns;
    }

입력을 tennis#swim#soccer 이런식으로 들어오면 [tennis , swim , soccer] 이런식으로 변환해줌

@InitBinder
	public void toDate(WebDataBinder binder) {
		binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor("#"));  //들어오는 String[] "#" 기준으로 분리
	}
profile
연습장

0개의 댓글