프로젝트/SNS 프로젝트
[회원가입] 전처리 후처리 개념 및 validation
영카이브
2024. 3. 26. 12:13
전처리 후처리
전처리 : 입력된 데이터의 유효성을 검증하는 단계
후처리 : 전처리를 거친 후에 발생하는 예외를 처리하는 단계
회원가입 시에 유니크 조건이 걸려 있는 username을 처리하기 위해 전처리와 후처리를 사용할 수 있다. 전처리 단계에서는 입력된 username이 20자 이하인지 확인하여 유효성을 검증한다.전처리는 DB를 거칠 필요가 없는 단계이다. 후처리 단계에서는 DB를 거쳐야만 알 수 있는 정보를 다룬다. 이미 존재하는 username인지 확인하고, 존재한다면 예외를 발생시켜 처리한다. 이를 통해 입력 데이터의 유효성을 미리 검사하고, 발생하는 예외를 적절히 처리하여 안정성을 높일 수 있다.
validation
SignDto
@Data // getter,setter 포함
public class SignupDto {
@Max(20) //validation 어노테이션
private String username;
@NotBlank
private String password;
@NotBlank
private String email;
@NotBlank
private String name;
public User toEntity() {
return User.builder()
.username(username)
.password(password)
.email(email)
.name(name)
.build();
}
}
User
//JPA -Java Persistence API(자바로 데이터를 영구적으로 저장(DB)할 수 있는 API제공)
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity //DB에 테이블 생성
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(length=20, unique=true) // 데이터베이스 어노테이션
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String name;
private String website;
private String bio;
@Column(nullable = false)
private String email;
private String phone;
private String gender;
private String profileImageURl;
private String role;
private LocalDateTime createDate;
@PrePersist // DB에 INSERT되기직전에 실행
public void createDate() {
this.createDate=LocalDateTime.now();
}
}
AuthController
@PostMapping("/auth/signup")
public String signup(@Valid SignupDto signupDto) {
if(signupDto.getUsername().length()>20) {
System.out.println("너 길이 초과했어");
}
User user = signupDto.toEntity();
User userEntity = authService.회원가입(user);
return "auth/signin";
}
Front단으로만 막지 않고 validation을 설정하는 이유
왜 @Size, @NotBlank를 써서 Front단에서만 막는 것이 아니라 백엔드단에서도 유효성검사를 실시하는 것일까
@Size(max = 20)//validation 어노테이션
private String username;
@NotBlank
private String password;
@NotBlank
private String email;
@NotBlank
private String name;
@RequiredArgsConstructor
@Controller
public class AuthController {
private final AuthService authService;
@PostMapping("/auth/signup")
public String signup(@Valid SignupDto signupDto, BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
Map<String, String> errorMap = new HashMap<>();
for(FieldError error : bindingResult.getFieldErrors()) {
errorMap.put(error.getField(), error.getDefaultMessage());
System.out.println("=======================================");
System.out.println(error.getDefaultMessage());
}
}
User user = signupDto.toEntity();
User userEntity = authService.회원가입(user);
return "auth/signin";
}
}
@NotBlank를 무시해보자.
1. View로 접근
결과 : @NotBlank에 의하여 Front단에서 막아진것을 볼 수 있다.
2. Postman을 사용해 접근
결과 : 내가 프론트단을 막아도 Postman과 같이 요청하면 백엔드로 접근이 가능하다.
따라서 프론트단에서도 막고 백엔드 단에서도 막아줘야한다.
java.validation 어노테이션
참고 자료 출처 :