본문 바로가기
Back/Spring

[Spring] Validation, Data Binding

by Inventer 2022. 2. 8.

1. Validation

Validation : 유효성 검증

서버는 http를 통해 요청이 들어올 것인데, 이 요청 중 잘못된 요청이 있는지 Validation해야한다. 검증하지 않은 값에 대해서 Reply를 하거나 이를 바탕으로 DB에 Select을 한다면, 이는 프로그램의 오류나 보안적 결함으로 이어질 가능성이 높다. SQL Inject을 방어하는 것도 하나의 Validation으로 볼 수 있을 것 같다.

 

크게 Validation 종류는 2가지이다.

 

데이터 검증

  • 필수 데이터의 존재 유무
  • 문자열의 길이나 숫자형 데이터의 경우 값의 범위
  • email, 카드번호, 폰번호 등 특정 형식에 맞춘 데이터

비즈니스 검증

  • 서비스 정책에 따라 데이터를 확인하여 검증
  • ex) 배달서비스에서 배달 기사 호출전에 해당 주문건이 결제 완료상태인지 확인 하는 것.
  • 경우에 따라 외부 API 혹은 DB의 데이터를 조회하여 검증함

 

2. 예시

JavaBean을 활용한 Data Validation 이다. 가장 많이 활용되는 방법이며 어노테이션으로 검증방법을 명시한다.

public class MemberCreationRequest {

	@NotBlank(message="이름을 입력해주세요.")
	@Size(max=64, message="이름의 최대 길이는 64자 입니다.")
	private String name;
	@Min(0, "나이는 0보다 커야 합니다.")
	private int age;
	@Email("이메일 형식이 잘못되었습니다.")
	private int email;

	// the usual getters and setters...
}

 

위처럼 요청 dto에 어노테이션으로 명시 후 아래처럼 @Valid 어노테이션을 해당 @RequestBody에 달게 되면, Java Bean Validation을 수행한 후 문제가 없을 때만 메서드 내부로 진입이 된다.

@PostMapping(value = "/member")
public MemeberCreationResponse createMember(
	@Valid @RequestBody final MemeberCreationRequest memeberCreationRequest) {
	// member creation logics here...
}

 

 

3. Data Binding

데이터 바인딩은 사용자 혹은 외부 서버가 요청한 데이터를 특정 도메인 객체에 저장하여 우리 프로그램 Request에 담는 것을 뜻한다.

 

아래는 Converte하는 예시이다.

package org.springframework.core.convert.converter;

public interface Converter<S, T> {

    T convert(S source);
}

Source에 담겨온 JSON을 Target으로 바꿔 DTO에 던진다.

 

// Request
GET /user-info
x-auth-user : {"id":123, "name":"Paul"}

// 유저 객체
public class XAuthUser {
    private int id;
    private String name;

    // the usual getters and setters...
}

@GetMapping("/user-info")
public UserInfoResponse getUserInfo(
	@RequestHeader("x-auth-user") XAuthUser xAuthUser){

	// get User Info logic here...
}

위 interface를 implements 한 것이며, String을 위 class인 XAuthUser로 Converte하는 것이다.

@Component
public class XAuthUserConverter implements Converter<String, XAuthUser> {
	@Override
	public XAuthUser convert(String source) {
		return objectMapper.readValue(source, XAuthUser.class);
	}
}

컴포넌트 어노테이션으로, Bean에 바로 등록해서 사용한 것.

 

 

아래는 Fomatter라는 예시이다. 마치 Java의 Wrapper와 비슷하다.

특정 객체를 String화 시키는 것. 아래는 Date를 String으로 변경한 것이다.

package org.springframework.format.datetime;

public final class DateFormatter implements Formatter<Date> {
    public String print(Date date, Locale locale) {
        return getDateFormat(locale).format(date);
    }

    public Date parse(String formatted, Locale locale) throws ParseException {
        return getDateFormat(locale).parse(formatted);
    }
		// getDateFormat 등 일부 구현은 핵심에 집중하기 위해 생략... 
}

참고문헌

https://programmingrecoding.tistory.com/13

 

@Component 어노테이션

@Component 어노테이션을 이용하면 Bean Configuration 파일에 Bean을 따로 등록하지 않아도 사용할 수 있다. 빈 등록자체를 빈 클래스 자체에다가 할 수 있다는 의미이다. @Component 어노테이션은 기본적으

programmingrecoding.tistory.com

 

https://fastcampus.co.kr/dev_online_spring

 

'Back > Spring' 카테고리의 다른 글

[Spring] Null Safety  (0) 2022.02.08
[Spring] SpEL(Spring Expression Language)  (0) 2022.02.08
[Spring] Resource  (0) 2022.02.08
[Spring] AOP  (0) 2022.02.08
스프링(Spring)이란?  (0) 2022.01.11

댓글