1. 시작하게 된 계기 및 다짐 😮
  • 이번 코드스테이츠의 백엔드 엔지니어링 개발자 부트캠프에 참여하게 되면서 현직개발자 분들의 빠른 성장을 위한 조언 중 자신만의 블로그를 이용하여 배운 것 들을 정리하는게 많은 도움이 된다 하여 시작하게 되었다.

    • 그 날 배웠던 것을 길지 않아도 좋으니 정리하며 복습하는 습관 기르기
    • 주말에 다음주에 배울 내용들을 예습
    • 코딩 문제와 java코드들은 꾸준히 학습
    • 자료구조를 이용한 알고리즘 문제 해결 학습
  1. 학습 목표 😮
목표결과
DTO가 무엇인지 이해O
DTO를 Controller 클래스에 이해 및 적용O
DTO Validation이 무엇인지 이해 및 실습O
  1. 정리

HTTP 요청/응답에서의 DTO(Data Transfer Object)

1. DTO(Data Transfer Object) 사용 이유
 [Ex. MemberDto(타입) memberDto(변수명)]
 0). Client-Server간의 데이터를 전송하기 위한 용도의 객체

 1). 코드의 간결설 
    - @RequestParam과 같은 애너테이션을 사용할시 파라미터가 많아지면 이를 계속 추가하여 복잡해지므로,
     DTO클래스를 이용하여 요청 데이터를 하나의 객체로 전달 받는 역할을 해준다.

  [예제 Code]=============================================
     public ResponseEntity postMember(MemberDto memberDto) {
          return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
     }
     ====================================================
 
2. 데이터 유효성(Validation) 검증의 단순화
   - 서버 쪽에서 유효한 데이터를 전달 받기 위해 데이터를 검증하는 것
   - 정규식 표현을 이용하여 유효성검증을 하면 코드가 굉장히 복잡해짐
   - DTO 클래스를 사용하면 유효성 검증 로직을 DTO 클래스로 빼내어 핸들러 메서드의 간결함을 유지
   - @Email 애너테이션을 MemberDTO클래스의 email 필드에 적용하여, 유효한 이메일 주소가 포함되지 않을경우, 유효성 검증에 실패해 거부됨
   - @Valid를 이용하여 핸들러의 매개변수 앞쪽에 사용
   - ★[비용이 많이드는 작업인 HTTP 요청의 수를 줄이기 위함이다]
   - 도메인 객체와의 분리(추후 학습)


  [예제 Code]=================================================
   public ResponseEntity postMember(@Valid MemberDto memberDto) {
        return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
    }
    =========================================================
 
3. HTTP 요청/응답 데이터에 DTO 적용
   1). ★JSON형식일 경우 
     - @RequestBody 애너테이션을 추가
     - getter 메서드는 Response Body(요청 데이터)에 포함되기 위하여 필수 메서드이다
     - setter 메서드는 선택
 
4. 핵심 애너테이션
  1). @RequestBody
    - @RequestBody 애너테이션은 JSON 형식의 Request Body를 MemberPostDto 클래스의 객체로 변환을 시켜주는 역할
    - 클라이언트 쪽에서 전송한 JSON 형식의 Request Body를 DTO 클래스의 객체로 변환

  2). @ResponseBody
    - @ResponseBody는 JSON 형식의 Response Body를 클라이언트에게 전달하기 위해 DTO 클래스의 객체를 Response Body로 변환하는 역할
    - 핸들러의 리턴값이 ResponseEntity 클래스의 객체이기에 따로 @ResponseBody를 쓰진 않음

5. JSON 직렬화 / 역직렬화
 1). 직렬화
   - Server에서 Client에 DTO 객체를 JSON형태로 변환
   - JSON 직렬화(Serialization): Java 객체 → JSON
 
 2). 역직렬화 
   - Client쪽에서 Server로 보낸 JSON 형식 데이터를 DTO같은 객체로 변환
   - JSON 역직렬화(Deserialization): JSON → Java 객체

6. DTO 클래스 대표 단점
 - Controller가 늘어남에 따라 xxxDto 클래스가 두배씩 늘어난다.
 - 어느정도 개선이 가능






DTO 유효성 검증(Validation)

1. DTO 유효성 검증 필요 및 적용
 - implementation 'org.springframework.boot:spring-boot-starter-validation'

2. 유효성 검증 애터네이션
 [오류발생시 -> 예외처리] 오류 메시지 변경  
 1). @NotBlank : 공백불가
 2). @Email : 이메일 형식
 3). @Pattern(regexp = "^010-\\d{3,4}-\\d{4}$") : 
 4). @Validated : @PathVariable 에 @Min(1)과 같은 추가 파라미터가 붙을시, 유효성 검증을 위해 클래스위에 추가필요

[추가 Parameter]
(message ="추가 메시지")

3. Jakarta Bean Validation
 - 라이브러리가 앙닌 스펙(사양, Specification) 자체이다.
 - 어노테이션을 이용하여 Validation 처리로, Specification을 구현한 모듈이 Hibernate Validator이다

4. Custom Validator을 사용한 유효성 검증
 1). Custom Validator를 사용하기 위한 Custom Annotation을 정의한다.
 2). 정의한 Custom Annotation에 바인딩 되는 Custom Validator를 구현한다.
 3). 유효성 검증이 필요한 DTO 클래스의 멤버 변수에 Custom Annotation을 추가한다.

 [예제 Code]==========================================================
 import javax.validation.Constraint;
 import javax.validation.Payload;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;

 @Target(ElementType.FIELD) 
 @Retention(RetentionPolicy.RUNTIME)
 @Constraint(validatedBy = {NotSpaceValidator.class}) // (1) : NotSpace 애너테이션이 멤버 변수에 추가되었을 때, 
                                                                                 동작 할 Custom Validator를 (1)과 같이 추가
 public @interface NotSpace {
     String message() default "공백이 아니어야 합니다"; // (2) : 유효성 검증 실패 시, 표시되는 디폴트 메시지
     Class<?>[] groups() default {};
     Class<? extends Payload>[] payload() default {};
 }

--
 import org.springframework.util.StringUtils;
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;

 public class NotSpaceValidator implements ConstraintValidator<NotSpace, String> {

     @Override
     public void initialize(NotSpace constraintAnnotation) {
         ConstraintValidator.super.initialize(constraintAnnotation);
     }

     @Override
     public boolean isValid(String value, ConstraintValidatorContext context) {
         return value == null || StringUtils.hasText(value);
     }
 }

 [ConstraintValidator<NotSpace, String>에서 NotSpace는 CustomValidator와 매핑된 Custom Annotation을 의미 하며, String은 Custom Annotation으로 검증할 대상 멤버 변수의 타입을 의미합니다.]
 
 ===========================================================


[Extra] 
1). Java Bean
 - https://ko.wikipedia.org/wiki/자바빈즈






  1. 피드백 😮
  • Spring에서 Client-server간 데이터를 주고받을 때 편리하게 리소스를 요청을 할 수 있는 기술인 Dto를 알아보았다. 기존에 @RequestParam의 애너애너테이션으로 각 받은 타입/변수명을 지정해줘서 하나씩 받는 번거로움을 제거시켜 편리하게 사용이 가능하다

  • 유효성 검증같은 경우, 기존에 배웠던 정규표현식을 이용한 @Pattern과 @Custom애너테이션등을 이용하여 클라이언트측 뿐 아니라 서버쪽에서도 유효성을 검증하므로써, 부적절한 데이터를 걸러내는 방법이 있다.

  • 애너테이션들 같은 경우, 기존에 거의 사용하지 않아 익숙하지 않을뿐더러, 정규표현식 또한 많이 사용하지 않아 많은 어려움이 있었다.

  1. 앞으로 해야 될 것 😮
  • 매일 꾸준히 할 것
    • 꾸준히 velog 작성
    • Java 언어 및 Algorithm 공부(Coding-Test)
    • 틈틈히 운동 하기

  • 내일 해야 할 것
    • Spring MVC의 이번엔 서비스 계층 학습
    • 기존에 배웠던 API 계층의 복습
profile
Will be great Backend-developer

0개의 댓글