본문 바로가기
카테고리 없음

[Spring5]커맨드 객체, 요청 처리 메서드, 검증(Validation)

by Thompson 2024. 10. 23.
728x90

1. 커맨드 객체 (Command Object)란?

커맨드 객체는 웹 폼에서 입력된 데이터를 담는 그릇 역할을 합니다. 사용자가 웹 페이지의 폼에 데이터를 입력하고 제출하면, 해당 데이터는 서버로 전송되어 커맨드 객체에 자동으로 매핑됩니다.

 

예시: 회원 가입 폼 데이터를 받는 커맨드 객체

public class UserForm {
    @NotEmpty(message = "이름은 필수 입력 항목입니다.")
    private String name;

    @Email(message = "유효한 이메일 주소를 입력해주세요.")
    private String email;

    @Size(min = 6, message = "비밀번호는 최소 6자 이상이어야 합니다.")
    private String password;
    
    // Getter와 Setter 메서드
}

위의 예시에서 @NotEmpty, @Email, @Size와 같은 어노테이션은 유효성 검사 규칙을 정의합니다. 이 규칙에 따라 입력된 값이 적합하지 않으면, 오류 메시지가 발생합니다.

2. 요청 처리 메서드 (Request Handling Method)

Spring에서 요청을 처리하는 메서드는 주로 컨트롤러 클래스 내부에 정의됩니다. 이러한 메서드는 클라이언트로부터 온 요청을 받아 해당 작업을 수행한 후, 결과를 뷰로 반환합니다.

컨트롤러 메서드는 @RequestMapping, @GetMapping, @PostMapping 등의 어노테이션을 사용하여 특정 URL 패턴과 매핑되며, 커맨드 객체를 매개변수로 받아 폼 데이터를 자동으로 바인딩할 수 있습니다.

 

예시: 회원 가입 요청을 처리하는 컨트롤러

@Controller
public class UserController {

    // 회원 가입 폼을 처리하는 메서드
    @PostMapping("/register")
    public String registerUser(@ModelAttribute @Valid UserForm userForm, Errors errors) {
        if (errors.hasErrors()) {
            // 입력 값에 오류가 있을 때 다시 폼 페이지로 이동
            return "registerForm";
        }
        
        // 회원 정보를 저장하는 로직
        saveUser(userForm);
        return "registerSuccess";
    }
    
    private void saveUser(UserForm userForm) {
        // 사용자 정보를 저장하는 예시 메서드
        System.out.println("저장된 사용자: " + userForm.getName());
    }
}

위 예시에서 @ModelAttribute는 클라이언트에서 받은 데이터를 UserForm 객체에 자동으로 매핑합니다. 또한, @Valid 어노테이션을 사용하여 유효성 검사를 수행하고, 오류가 있을 경우 Errors 객체에 오류 정보를 저장합니다.

3. 검증 (Validation)

검증은 사용자가 입력한 데이터가 적합한지 확인하는 과정입니다. Spring 5에서는 여러 가지 검증 방법을 제공하며, 가장 일반적인 방식은 Bean Validation을 사용하는 것입니다. @Valid 어노테이션과 함께 사용되며, 데이터의 유효성을 검사한 후 문제가 있으면 Errors 객체에 오류 정보를 담습니다.

 

예시: 커스텀 Validator 구현

@Component
public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return UserForm.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        UserForm userForm = (UserForm) target;
        
        // 이메일 검증
        if (!userForm.getEmail().contains("@")) {
            errors.rejectValue("email", "email.invalid", "유효한 이메일 주소를 입력하세요.");
        }
        
        // 이름 검증
        if (userForm.getName().length() < 2) {
            errors.rejectValue("name", "name.short", "이름은 2자 이상이어야 합니다.");
        }
    }
}

위 코드에서 UserValidator는 Validator 인터페이스를 구현한 검증 클래스입니다. 이메일 형식이 올바르지 않거나 이름이 너무 짧으면, Errors 객체에 오류를 추가합니다. 이 오류는 .properties 파일에서 정의한 메시지로 출력될 수 있습니다.

4. 검증 메시지 관리

검증 메시지는 보통 .properties 파일에 저장하여 관리합니다. 이를 통해 다국어 처리, 일반 메시지, 에러 메세지 등등 을 처립합니다.

 

예시: messages.properties 파일

email.invalid=유효한 이메일 주소를 입력하세요.
name.short=이름은 2자 이상이어야 합니다.
password.short=비밀번호는 최소 6자 이상이어야 합니다.

컨트롤러는 유효성 검사 후, 오류가 발생한 경우 해당 오류 메시지를 뷰 페이지에 전달하여 사용자에게 표시합니다.