Burninghering's Blog
article thumbnail

데이터의 변환과 검증

요청을 하면

데이터가 파라미터로 값이 바뀌는데,

 컨트롤러에서 MyDate를 매개변수로 하면 요청할 때 넘어온 값을 바인딩하는데

중간에 WebDataBinder가 있다.

(맵에 있는 값은 String인데, MyDate의 값은 int이다)

 

1. 타입을 변환하고 결과를 BindingResult에 저장한다

그 다음에,

2. 데이터를 검증한다.(넘어온 값이 날짜 형식에 맞는지)

문제가 없으면 BindingResult에 저장한다

 

Controller가 BindingResult에 담긴 결과를 적절히 판단해서 처리할 수 있도록 한다.


실습

변환 기능 추가하는 방법 2

1.toDate() 메소드같은 변환 메서드 사용하기

2.바인딩할 객체의 타입에다가 직접 적어주기


 

위와 같던 회원가입 화면... 실습 시작

 

User.java의 String이었던 birth타입을

전부 Date로 바꿔준다.

결과화면

잘 나온다!

하지만 2021/12/31과 

다른 형식으로 날짜를 적으면 400에러가 난다.

 

에러를 잡기 위해...

binding할 객체 뒤에 BindingResult를 적어준다.

 

birth가 null로 나온다

변환에 실패한 것이다

콘솔 창에 결과를 띄워보니,

객체에 에러가 1개 있고,

birth란 필드의 값이 들어왔는데 값이 타입 미스매치라 거절되었다.

라는 결과가 나왔다.


날짜 형식을 바꿔주는 변환 메서드 사용하기

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

스프링이 제공하는 CustomEditor가 있는데, "yyyy-MM-dd"같이 형식만 지정해주면 된다.

false는 빈 값을 허용할 것인가에 대한 인자이다.

 

변환이 잘 된다!

error가 없다고 나온다.


이번엔 sns의 타입을 배열로 바꿔주었다.

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

배열로 잘 출력되게 toString도 바꿔주었다!

 

sns가 배열의 주소값으로 잘 나왔고,

콘솔 결과 또한 잘 나왔다.


가입 화면을 바꿔보았다

하나의 필드를 더 추가해주었다.

    <label for="">취미</label>
    <input class="input-field" type="text" name="hobby">

User.java에도 추가해주었다.

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

 

하나의 문자열로 배열에 통으로 들어갔다...

이번에도 스프링이 제공하는 에디터를 사용한다.

@Controller
public class RegisterController {
	
	@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("#"));
	}

 

결과


 

두 번째 방법인,

바인딩할 객체의 타입에다가 직접 적어주기 

 

User.java

	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date birth;

 

그리고 @InitBinder메소드의 날짜 처리부분을 주석처리해주었다.

 

결과가 잘 나왔다!

 

 

@InitBinder는

예외처리에서 그랬던 것처럼,

컨트롤러 내에서만 사용가능하다.

이러한 형식 변환을 모든 컨트롤러에서 처리해야한다면 웹바인더이니셜라이저를 써야한다.

 

실습 끝!


PropertyEditor

우리는 특정 컨트롤러 내에서만 변환 가능하다는 것을 실습했다!

 

Converter

컨버터는 propertyEditor와 다르게 단방향 타입 변환이다.

양방향이 아니어도 컨버터가 두 개가 있으면 된다.

 

PropertyEditor가 iv=인스턴스 변수를 사용한다는 단점을 개선했다. 싱글톤을 사용할 수 없고 변화할 때마다 새로운 객체를 만들어내야한다.

Converter는 iv를 사용하지 않으며 싱글톤이 가능하다.

 

위 화면과 같이

컨버터라는 인터페이스가 있고,

String을 String[]으로 바꿔준다.

#으로 나뉜 것을 배열로 바꿔주는 컨버터인데

이를 컨버전서비스에 등록해야한다.

 

Formatter

양방향 타입이다


타입 변환에 등록할 수 있는 것에

종류 3가지가 있으며 우선순위는 아래와 같다.

 

1.CutstomPropertyEditor

2.ConversionService

3.DefaultPropertyEditor

 

(예외처리와 같이 항상 가까운 쪽이 먼저다!)


본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.