@Validated, @Builder에 대한 질문이 있습니다.
1265
49 asked
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을 사용하려니 어렵네요;;
Answer 1
2
안녕하세요, 유요한 님. 공식 서포터즈 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;
}
}
밑은 포스트맨으로 테스트하고 로그로 확인해봤습니다.
(한 번에 담으려니 화면이 좀 작습니다. 클릭 후 새 창에 여신 후 확대해서 봐주세요!)
도움이 되셨으면 좋겠습니다.
감사합니다.
sdk 설정 오류
0
49
2
오탈자 - @Transactional
0
55
1
src/test/resources 테스트 경로 문제
0
50
1
상품 등록후 H2 db 출력 순서 바꿀 수 있나요?
0
63
1
MemberRepositoryTest 실행오류
0
81
1
boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)
1
183
2
강의 마지막 QueryDSL 사용 부분 질문있습니다
1
137
2
클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.
0
51
1
도메인 모델 패턴 vs 트랜잭션 스크립트 패턴
0
71
1
기본 생성자
0
60
1
h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.
0
100
1
멤버서비스테스트 부분에서 막힙니다.
0
164
4
실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?
0
116
1
초반에 h2 다운로드 과정 꼭 필요한가요?
0
118
2
자신 필드에도 get으로 접근하는 이유가 있을까요?
0
112
1
24분 27초 연관관계 편의 메서드 위치
0
113
1
단건 주문만 가능하게 한건 의도한 부분이신가요?
0
108
2
빌드 툴, Gradle
0
59
1
h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다
0
76
2
Repository에서 EntityManager 주입 방식 차이
0
88
1
롬복과 사용자 정의 setter 메서드
0
71
1
주문 목록 조회 fetch join 질문드립니다
0
81
1
dirty checking 질문드립니다.
0
81
1
동시성 관련 질문입니다
0
73
1

