- 요청 데이터를 하나의 객체로 전달 받는 역할
@RestController @RequestMapping("/v1/members") public class MemberController { @PostMapping public ResponseEntity postMember(MemberDto memberDto) { //요청 데이터를 Map에 추가하는 로직이 사라지고 MemberDto 객체를 생성자 파라미터로 전달 return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED); } ...
- 유효성 검증 로직을 DTO 클래스로 빼내어 핸들러 메서드의 간결함을 유지
public class MemberDto { @Email private String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }
public ResponseEntity postMember(@Valid MemberDto memberDto)
@Valid
애너테이션은 MemberDto 객체에 유효성 검증을 적용하게 해주는 애너테이션
- HTTP Request Body(요청 데이터 중 바디에 해당)가 JSON 형식일경우
코드 리팩토링 절차
- 회원 정보를 전달 받을 DTO 클래스 생성
- MemberController에서 현재 회원 정보로 전달 받는 각 데이터 항목들을 DTO 클래스의 멤버 변수로 추가
- 클라이언트의 요청 데이터를
@RequestParam
애너테이션으로 전달 받는 핸들러 메서드 찾기
- Request Body가 필요한 핸들러는 POST,PATCH,PUT같은 경우
- 결국
@PostMapping
,@PatchMapping
애너테이션이 붙은 핸들러 메서드 찾기@RequestParam
쪽 코드를 DTO 클래스의 객체로 수정- Map 객체로 되어있는 Response Body를 DTO 클래스의 객체로 변경
- 회원 정보의 DTO 클래스 생성 (Requst Body를 전달 받을 때 사용하기 위한 클래스)
- 회원 정보 수정에 사용되는 MemberPatchDto 클래스 생성 (Requst body를 전달 받을 때)
- DTO 클래스 생성시 각 멤버 변수에 해당하는
getter
메서드가 있어야 한다.- MemberController에 DTO 클래스 적용
클래스의 객체를 통해서 Requst Body를 한번에 전달 받을 수 있다.- Postman 에서 실행
✔ @RequestBody
애너테이션
✔ @ResponseBosy
애너테이션
- JSON 직렬화 / 역직렬화
직렬화 : Java객체 -> JSON
역직렬화 : JSON -> Java 객체
유효성 검증을 위한 의존 라이브러리 추가
build.gradle 파일의depenencies
항목에'org.springframework.boot:spring-boot-starter-validation'
추가
✔ MemberPostDto 유효성 검증 제약 사항
- 값이 비어있지 않거나 공백이 아니어야 한다.
- 유효한 이메일 주소 형식이어야 한다.
name
- 값이 비어있지 않거나 공백이 아니어야 한다.
phone
- 값이 비어있지 않거나 공백이 아니어야 한다.
- 010으로 시작하는 11자리 숫자와 '-'으로 구성된 문자열이어야 한다.
@NotBlank
- 정보가 비어있지 않은지를 검증
- null값이나 공백(""), 스페이스(" ") 같은 값들을 모두 허용하지 않음.
- 유효성 검증에 실패하면 에러메시지가 콘솔에 출력 / message 애트리 뷰트에 지정한 문자열이 출력
- 유효한 이메일 주소인지를 검증
- 유효성 검증에 실패하면 내장된 디폴트 에러 메시지가 콘솔에 출력
@Pattern
- 휴대폰 번호가 정규표현식에 매치되는 유효한 번호인지 검증
- 유효성 검증에 실패하면 지정한 메세지가 출력
유효성 검증 애너테이션을 추가한 MemberPostDto클래스를 사용하는 PostMember() 핸들러 메서드 (@Valid 애너테이션 추가)
유효성 검사를 통과하지 못하여 에러 발생
✔ MemberPatchDto 유효성 검증 제약 사항
name
- 값이 비어있을 수 있다.
- 값이 비어있지 않다면 공백이 아니어야 한다.
phone
값이 비어있을 수 있다.
010으로 시작하는 11자리 숫자와 '-'로 구성된 문자열이어야 한다.
name의
@Pattern
- 이름 정보가 비어있으면(null)유효성 검증을 하지 않는다.
- 이름 정보가 비어있지 않고 공백 문자열이라면 검증 실패
- 시작 문자나 끝 문자가 공백이면 검증 실패
- 문자와 문자 사이 공백이 1개 초과하면 검증 실패
유효성 검증 애너테이션을 추가한 MemberPatchDto클래스를 사용하는 PatchMember() 핸들러 메서드
@PathVariable("member-id") long memberId
변수 제약 조건 걸기@Min(1)
이라는 애너테이션 추가@validated
애너테이션 반드시 추가
- Custom Validator를 사용하기 위한 Custom Annotation을 정의한다.
- 정의한 Custom Annotation에 바인딩 되는 Custom Validator를 구현한다.
- 유효성 검증이 필요한 DTO 클래스의 멤버 변수에 Custom Annotation을 추가한다.
✔ Custom Annotation을 정의
- 실습 중 오류가 난 부분이 int 형으로 price 를 선언했는데 정규표현식을 사용하려고 5XX 오류가 뜨며 안되었다. int형에 사용 가능한 애너테이션을 사용하니 정상 작동하였다.
https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/best-practices
https://coding-factory.tistory.com/529 (정리)