프로젝트/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 어노테이션

 

 

 

참고 자료 출처 : 

https://bamdule.tistory.com/35