[Spring Boot] form 입력을 Command 객체로 사용하는 이유는?

·2024년 1월 19일
0

Spring Boot

목록 보기
3/4

What is Command Object?

스프링에서 http에서의 get, post등의 요청으로 들어온 데이터를 받아오는 방법으로 @RequestParam을 알아 본 적이 있다. 다른 방식인 Command Object를 알아보겠다.

Command Object는 Http를 통해 들어온 요청 파라미터들을 객체로 만든 DTO


Command Object의 조건

  • 요청 파라미터의 key값과 같은 속성을 가져야됨
  • setter가져야함!

Command Object를 사용하는 이유

  • 데이터 그룹화: 사용자의 입력들을 구조화하여 코드가 더 간결하고 파악하기 용이하다.
  • 유효성 검사 및 변환: 사용자의 입력을 검증하고 변환하는데 용이하다. 검증을 하는 방법이 훨씬 간단함
  • DTO: 데이터를 전달하고 사용하는것에 용이함
  • 재사용성 및 유지보수성

사용하기

다음을 회원가입 예시를 통해 알아보자

form class만들기

검증을 위해서 build.gradle에 다음을 추가하자

implementation 'org.springframework.boot:spring-boot-starter-validation'

UserCreateForm.java

@Getter
@Setter
public class UserCreateForm {
    @Size(min = 3, max = 25)
    @NotEmpty(message = "사용자ID는 필수항목입니다.")
    private String username;

    @NotEmpty(message = "비밀번호는 필수항목입니다.")
    private String password1;

    @NotEmpty(message = "비밀번호 확인은 필수항목입니다.")
    private String password2;
}
  • @Size: 문자길이를 제한
  • @NotNull: Null을 허용하지 않음
  • @NotEmpty: Null과 빈문자열을 허용하지 않음
  • @Min: 최솟값 이상의 값만 입력가능
  • @Max: 최댓값 이상의 값만 입력가능
  • @Pattern: 정규식 패턴으로 검증
  • @Past: 과거 날짜만 가능
  • @Future: 미래날짜만 가능
  • @FutureOrPresent: 미래 또는 오늘 날짜만 가능

Html

signup_form.html

    <form th:action="@{/user/signup}" th:object="${userCreateForm}" method="post">
        <div th:replace="~{form_errors :: formErrorsFragment}"></div>
        <div class="mb-3">
            <label for="username" class="form-label">사용자ID</label>
            <input type="text" th:field="*{username}" class="form-control">
        </div>
        <div class="mb-3">
            <label for="password1" class="form-label">비밀번호</label>
            <input type="password" th:field="*{password1}" class="form-control">
        </div>
        <div class="mb-3">
            <label for="password2" class="form-label">비밀번호 확인</label>
            <input type="password" th:field="*{password2}" class="form-control">
        </div>
        <button type="submit" class="btn btn-secondary">회원가입</button>
    </form>

Controller 구현하기

UserController.java

@GetMapping("/signup")
    public String signup(UserCreateForm userCreateForm) {
        return "signup_form";
    }

    @PostMapping("/signup")
    public String signup(@Valid UserCreateForm userCreateForm, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "signup_form";
        }

        if (!userCreateForm.getPassword1().equals(userCreateForm.getPassword2())) {
            bindingResult.rejectValue("password2", "passwordInCorrect",
                    "2개의 패스워드가 일치하지 않습니다.");
            return "signup_form";
        }

        if (siteUserService.findByUsername(userCreateForm.getUsername())){
            bindingResult.rejectValue("username", "usernameDuplicated",
                    "이미 사용중인 사용자ID입니다.");
            return "signup_form";
        }

        return "redirect:/";
    }
    
  • 다음과 같이 get, post 요청에 UserCreateForm userCreateForm을 추가하여야 오류가 발생하지 않는다.
  • BindingResult bindingResult는 다음과 같이 오류 처리를 위해 사용한다.
  • 만약, field의 값을 유지하고 싶다면 Model을 활용하여 userCreateForm을 넘기면 된다!

profile
백엔드 개발자가 꿈인 컴공과

0개의 댓글

관련 채용 정보