SEB_BE 42일차 - 웹 계층(DTO)

subimm_·2022년 10월 21일
0

코드스테이츠

목록 보기
42/83

💡 오늘의 학습목표

  • DTO

📔 HTTP 요청/응답에서의 DTO

📖 DTO (Data Transfer Object)

  • 엔터프라이즈 애플리케이션 아키텍처 패턴의 하나
  • 데이터를 전송하기 위한 용도의 객체 (클라이언트-서버(요청), 서버-클라이언트(응답))에서만 사용
  • 요청 데이터를 하나의 객체로 전달 받는 역할
@RestController
@RequestMapping("/v1/members")
public class MemberController {
	@PostMapping
    public ResponseEntity postMember(MemberDto memberDto) {
    //요청 데이터를 Map에 추가하는 로직이 사라지고 MemberDto 객체를 생성자 파라미터로 전달
    	return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
    }
    ...

📖 데이터 유효성(Validation) 검증의 단순화

  • HTTP요청을 전달 받는 핸들러 메서드는 요청을 전달 받는 것이 주 목적. 최대한 간결하게 작성
  • 유효성 검증 로직을 DTO 클래스로 빼내어 핸들러 메서드의 간결함을 유지
public class MemberDto {
	@Email
    private String email;

    public String getEmail() {
    	return email;
    }
    public void setEmail(String email) {
    	this.email = email;
    }

@Email 애너테이션을 추가하면 클라이언트의 요청 데이터에 유효한 이메일 주소가 포함되어 있지 않을 경우 유효성 검증 실패 - 클라이언트 요청 거부가 된다.

public ResponseEntity postMember(@Valid MemberDto memberDto)

@Valid 애너테이션은 MemberDto 객체에 유효성 검증을 적용하게 해주는 애너테이션

📖 HTTP 요청/응답 데이터에 DTO 적용하기

  • 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 애너테이션

  • JSON 형식의 Request Body를 MemberPostDto 클래스의 객체로 변환 시켜주는 역할
    (클라이언트 전송 형식이 JSON 형식이어야 함)

@ResponseBosy 애너테이션

  • JSON 형식의 Response Bosy를 클라이언트에게 전달하기 위해 DTO클래스의 객체를 Response Body로 변환하는 역할
    핸들러 메서드에 애너테이션이 붙거나, 핸들러 메서드의 리턴 값이 ResponseEntity일 경우 내부적으로 동작하여 응답객체를 JSON 형식으로 바꿔준다.
  • JSON 직렬화 / 역직렬화
    직렬화 : Java객체 -> JSON
    역직렬화 : JSON -> Java 객체

📔 DTO 유효성 검증 (Validation)

  • 프론트엔드 쪽에서 유효성 검사를 진행했더라도 서버 쪽에서 한번 더 유효성 검사를 진행함.

📖 DTO 클래스에 유효성 검증 적용하기

  • 유효성 검증을 위한 의존 라이브러리 추가
    build.gradle 파일의 depenencies 항목에 'org.springframework.boot:spring-boot-starter-validation' 추가


    ✔ MemberPostDto 유효성 검증 제약 사항

    • email
      • 값이 비어있지 않거나 공백이 아니어야 한다.
      • 유효한 이메일 주소 형식이어야 한다.
    • name
      • 값이 비어있지 않거나 공백이 아니어야 한다.
    • phone
      • 값이 비어있지 않거나 공백이 아니어야 한다.
      • 010으로 시작하는 11자리 숫자와 '-'으로 구성된 문자열이어야 한다.
  • @NotBlank

    • 정보가 비어있지 않은지를 검증
    • null값이나 공백(""), 스페이스(" ") 같은 값들을 모두 허용하지 않음.
    • 유효성 검증에 실패하면 에러메시지가 콘솔에 출력 / message 애트리 뷰트에 지정한 문자열이 출력
  • @email

    • 유효한 이메일 주소인지를 검증
    • 유효성 검증에 실패하면 내장된 디폴트 에러 메시지가 콘솔에 출력
  • @Pattern

    • 휴대폰 번호가 정규표현식에 매치되는 유효한 번호인지 검증
    • 유효성 검증에 실패하면 지정한 메세지가 출력

  • 유효성 검증 애너테이션을 추가한 MemberPostDto클래스를 사용하는 PostMember() 핸들러 메서드 (@Valid 애너테이션 추가)

  • 유효성 검사를 통과하지 못하여 에러 발생

    ✔ MemberPatchDto 유효성 검증 제약 사항

    • name
      • 값이 비어있을 수 있다.
      • 값이 비어있지 않다면 공백이 아니어야 한다.
    • phone
      값이 비어있을 수 있다.
      010으로 시작하는 11자리 숫자와 '-'로 구성된 문자열이어야 한다.
  • name의 @Pattern

    • 이름 정보가 비어있으면(null)유효성 검증을 하지 않는다.
    • 이름 정보가 비어있지 않고 공백 문자열이라면 검증 실패
    • 시작 문자나 끝 문자가 공백이면 검증 실패
    • 문자와 문자 사이 공백이 1개 초과하면 검증 실패
  • 유효성 검증 애너테이션을 추가한 MemberPatchDto클래스를 사용하는 PatchMember() 핸들러 메서드

📖 쿼리 파라미터 및 @PathVariable에 대한 유효성 검증

  • @PathVariable("member-id") long memberId 변수 제약 조건 걸기
    • 1이상의 숫자일 경우에만 유효성 검증에 통과하도록 @Min(1) 이라는 애너테이션 추가
    • 정상 수행되려면 클래스 레벨에 @validated 애너테이션 반드시 추가

📜 Jakart Bean Validation이란?

  • Jakarta Bean Validation은 라이브러리처럼 사용할 수 있는 API가 아닌 스펙(사양, Specification) 자체
  • Java Bean 스펙을 준수하는 Java클래스라면 위 애너테이션을 사용하여 유효성 검증이 가능

📙 Custom Validator를 사용한 유효성 검증

  • 내장 애너테이션 외 애너테이션을 직접 만들어서 유효성 검증에 적용 가능
    1. Custom Validator를 사용하기 위한 Custom Annotation을 정의한다.
    2. 정의한 Custom Annotation에 바인딩 되는 Custom Validator를 구현한다.
    3. 유효성 검증이 필요한 DTO 클래스의 멤버 변수에 Custom Annotation을 추가한다.

✔ Custom Annotation을 정의

⚙ 실습 오류

  • Coffee 부분 DTO 적용하기
    • 실습 중 오류가 난 부분이 int 형으로 price 를 선언했는데 정규표현식을 사용하려고 5XX 오류가 뜨며 안되었다. int형에 사용 가능한 애너테이션을 사용하니 정상 작동하였다.

🔍 정규 표현식

https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/best-practices
https://coding-factory.tistory.com/529 (정리)

🔍 추가

  • java.validation 애너테이션
profile
코린이의 공부 일지

0개의 댓글