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
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 |
댓글