본문 바로가기
프로젝트

[도파민 프로젝트] 개발일지 220817

by eunoo 2022. 8. 17.

[오늘 할 일]

1. 회원가입 기능

   - WebDataBinder 로 검증, 검증 메세지 띄워주기

[오늘의 공부]

1. 자바의 정석 - 예외 처리

[오늘 한 일& 알게 된 것]

회원가입 - 요청 데이터 검증하기. 에러 메세지 출력하기

1. JoinController 작성 후 join 메서드 작성.

    @PostMapping("/join")
    @ResponseBody
    public String join(@Valid @RequestBody UserDto userDto, BindingResult result){

        //검증 실패면
        if (result.hasErrors()) {
        	return "joinForm";
	
    	}
        
        //검증 성공 시 회원가입 성공.
        retrun "redirect:/success_join";
    }

 @Valid를 붙인 객체를 검증한다.

검증 결과(BindingResult)에 에러가 있으면,

joinForm을 리턴하는데 여기서 UserDto가 Modal에 자동 추가되어 joinForm에 넘긴다. 참조형 변수 앞에는 @ModelAttribute생략되어있기 때문이다.

 

2. UserDto 작성

public class UserDto {
    private String user_id;
    private String user_pwd;
    private String f_nm;
    private String l_nm;
    private String phone_num;
    private String mbti;
    private String cnty;
    private String email;
    private String nic;
    private String btdt;
    private byte sex;
    private String prf_img;
    private Integer dopa_exp;
    private Integer dopa_point;
    private Integer user_stat;
    private String fav_genre1;
    private String fav_genre2;
    private String fav_genre3;
    private String fav_genre4;
    private String fav_genre5;
    private Integer rept_times;
    private Date in_date;
    private String in_user;
    private Date up_date;
    private String up_user;
}

브라우저에서 user_id 입력 칸에 아무 것도 작성하지 않고 요청을 하면, 입력값을 주지 않으면, 그 값은 빈문자열("")이다. 왜? ( -> @RequestParam 복습) 

   - GET요청 시 파라미터를 아예 주지 않으면 (localhost:8080/rp)  year=null 이고,  파라미터 이름만 주면 (localhost:8080/rp?year), year=""이었음.

   -  난 지금 뷰 단에서 입력 칸을 줬으니까, 파라미터 변수 이름만 넘어가서 user_id는 빈 문자열임.

 

 

3. UserValidator 생성 후 JoinController의 Validator로 설정하기

UserValidator.java

package com.PSVM.dopamin.domain.User;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

public class UserDtoValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        System.out.println("supports");
        //clazz가 UserDto 또는 그 자손인지 검증
        return UserDto.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        UserDto userDto = (UserDto) target;
        final String rqrMsg = "필수 정보입니다.";

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "user_id", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "user_pwd", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "f_nm", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "l_nm", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "nic", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "btdt", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "phone_num", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "sex", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "cnty", "rqrMsg", rqrMsg);
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "rqrMsg", rqrMsg);

    }
}
@Controller
@RequestMapping("/join")
public class JoinController {
  
    @InitBinder
    public void userDtoValidator(WebDataBinder binder) {
        binder.setValidator(new UserDtoValidator());
    }

...
}

4. MessageSource를 빈등록 후 joinForm에서 에러메세지 출력하기

 

joinForm.jsp에서 <form:form modelAttribute="userDto"> 작성했는데, 이건 모델에서 UserDto 객체를 꺼내서 쓰는 거같다.

<form:erros path="user_id"> 여기서 path는 userDto의 필드를 지정하고, 그 필드에 있는 에러 메세지를 출력한다.

 


오늘은 데이터 검증 실패 시 에러 메세지를 뷰에 보여주는 기능을 작성했다.

하지만 작성하고 나니 아주 큰 문제점을 발견했다.

- 검증 실패 시 joinForm으로 리턴하기 때문에, jsp 화면이 새로 로딩된다.

  나는 화면이 리로딩 되지 않고, 에러 메세지를 화면에 띄우고 싶다.

- 그러면 Ajax로 비동기 처리해야한다.

 처음에 시작할 때 무작정 시작하지 말고 화면을 어떻게 구상할 건지, 그 화면을 구현하기 위해선 어떤 기술을 써야하는지 정의하고 시작했어야 했다. 처음 시작 방향부터 잘못되었다.
'구현할 화면을 직접 손으로 많이 그려보고 흐름을 파악해야한다.' 라는 강사님 말이 떠올랐다. 
말만 들었을 땐 그 말이 와닿지 않았는데 직접 시행착오를 겪으니 '직접 화면을 그려봐라'의 뜻을 뼈저리게 느낄 수 있었다...

댓글