• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@Validated, @Builder에 대한 질문이 있습니다.

23.02.25 19:26 작성 조회수 899

0

package com.example.velog.domain;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

@Getter
@ToString
public class UserDTO {
    private Long userId;
    @NotBlank(message = "이메일은 필수 입력사항 입니다.")
    // 이메일 형식이여야 함
    @Pattern(regexp = "^(?:\\w+\\.?)*\\w+@(?:\\w+\\.)+\\w+$", message = "이메일 형식이 올바르지 않습니다.")
    @Email(message = "이메일 형식에 맞지 않습니다.")
    private String userEmail;
    @NotBlank(message = "비밀번호는 필수 입력 값입니다.")
    @Pattern(regexp = "(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\\\\W)(?=\\\\S+$).{8,20}",
            message = "비밀번호는 영문 대,소문자와 숫자, 특수기호가 적어도 1개 이상씩 포함된 8자 ~ 20자의 비밀번호여야 합니다.")
    private String userPw;
    @NotBlank(message = "이름은 필수 입력사항 입니다.")
    private String userName;
    @NotBlank(message = "주소는 필수 입력사항 입니다.")
    private String userAddr;

    @NotBlank
    private  String userAddrDetail;

    @NotBlank
    private String userAddrEtc;

    private MultipartFile userImg;

    @Builder
    public UserDTO(
            String userEmail,
            String userPw,
            String userName,
            String userAddr,
            String userAddrDetail,
            String userAddrEtc,
            MultipartFile userImg) {
        this.userEmail = userEmail;
        this.userPw = userPw;
        this.userName = userName;
        this.userAddr = userAddr;
        this.userAddrDetail = userAddrDetail;
        this.userAddrEtc = userAddrEtc;
        this.userImg = userImg;
    }

}

UserDTO에 유효성 검사를하려고 어노테이션을 사용했고 setter을 빼고 @Builder을 사용했습니다. 근데 여기서 의문점이 생겼습니다.

 

유효성 검사를 사용하고 컨트롤러에서 @Valid나 @Validated를 사용할 때 유효성 검사가 있는 DTO에 예를들어 @Vlidated UserDTO userDTO 이런식으로 쓰는걸로 알고 있는데 setter을 빼고 @Builder을 사용해서 view에서 form action으로 보내줘도 setter로는 못받고 builder가 받는 식인

예를들어

String email = "zsaez45@naver.com";
String password = "Dkdms147!";
String name = "테스터";
String addr = "서울시 xxxx xxx";
String addrDetail = "xxxx";
String addrEtc = "2층";

UserDTO p1 = UserDTO.builder()
        .userEmail(email)
        .userPw(password)
        .userName(name)
        .userAddr(addr)
        .userAddrDetail(addrDetail)
        .userAddrEtc(addrEtc)
        .build();

이렇게 받는걸로 알고 있습니다. 그러면 view에서 보내준 것을 컨트롤러에서 받으려면 하나하나 풀어보 받아야하나요? 어떤식으로 받을 수 있죠? @Builder을 사용하려니 어렵네요;;

답변 1

답변을 작성해보세요.

2

y2gcoder님의 프로필

y2gcoder

2023.02.25

안녕하세요, 유요한 님. 공식 서포터즈 y2gcoder 입니다.

스프링의 요청 파라미터 매핑은 생각보다 강력합니다.

setter만 해주는 것이 아니라 생성자가 있으면 생성자를 통한 바인딩도 지원하고 있습니다.

우선순위는

1) 생성자가 있을 경우 생성자를 통해 바인딩

2) 없으면 기본 생성자 + setter로 바인딩

이렇게 해주고 있습니다.

또한 @Builder를 생성자에 붙여줬다고 해서 원래 있던 생성자가 없어지는 것이 아니기 때문에, 스프링에서 알아서 해당 생성자를 이용하게 되니 걱정하지 않으셔도 됩니다. :)

약식으로 프로젝트를 만들어 테스트해봤습니다.

@Getter
@ToString
public class UserDto {
    private Long userId;

    @NotBlank(message = "이메일은 필수 입력사항입니다.")
    private String userEmail;

    @NotBlank(message = "비밀번호는 필수 입력 값입니다.")
    private String userPw;

    @NotBlank(message = "이름은 필수 입력 값입니다.")
    private String userName;

    @NotBlank(message = "주소는 필수 입력사항입니다.")
    private String userAddr;

    @NotBlank
    private String userAddrDetail;

    @NotBlank
    private String userAddrEtc;

    private MultipartFile userImg;

    @Builder
    public UserDto(Long userId, String userEmail, String userPw, String userName, String userAddr,
            String userAddrDetail, String userAddrEtc, MultipartFile userImg) {
        this.userId = userId;
        this.userEmail = userEmail;
        this.userPw = userPw;
        this.userName = userName;
        this.userAddr = userAddr;
        this.userAddrDetail = userAddrDetail;
        this.userAddrEtc = userAddrEtc;
        this.userImg = userImg;
    }
}

밑은 포스트맨으로 테스트하고 로그로 확인해봤습니다.

image(한 번에 담으려니 화면이 좀 작습니다. 클릭 후 새 창에 여신 후 확대해서 봐주세요!)

도움이 되셨으면 좋겠습니다.


감사합니다.

유요한님의 프로필

유요한

질문자

2023.02.26

덕분에 계속 고민이던 문제를 해결했습니다!

y2gcoder님의 프로필

y2gcoder

2023.02.26

파이팅입니다!