[Spring] 프로젝트 실전 ② - validation check

보람·2023년 5월 8일
0

1. Name 입력 여부

(1) 라이브러리 추가

  • build.gradle에 다음 코드 추가 후 refresh gradle project
	implementation 'org.springframework.boot:spring-boot-starter-validation'

(2) @NotEmpty 추가

  • 객체로 사용할 DTO에 메시지 추가

Name입력 필수

	@Getter @Setter
	public class MemberForm {

		@NotEmpty(message = "회원 이름은 필수입니다.")
		private String name;
        
		private String city;
		private String street;
		private String zipcode;
	
	}

(3) @Valid 추가

  • validation 다음에 binding 있으면 error를 Binding에 담아준다.
	@PostMapping("/members/new")
	public String create(@Valid MemberForm form, BindingResult result) {
		// result에 에러값 여부
		if( result.hasErrors() ) {
			return "members/createMemberForm";
		}
		
		Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode());
		Member member = new Member();
		member.setName(form.getName());
		member.setAddress(address);
		
		memberService.join(member);
		
		return "redirect:/";
	}
  • name 입력 ❌
    • result 객체에 message = "회원 이름은 필수입니다." 받아서 처리 -> 에러를 담아서 다시 회원가입 페이지 -> input 박스에 에러메세지 담기
  • name 입력 ⭕
    • 내용 저장

(4) input box에 에러 메세지 담기

① 에러여부에 따라 class명 바꾸기

- 에러 x : 'form-control'
- 에러 o : 'form-control fieldError'

	<input type="text" class="form-control" placeholder="이름을 입력하세요" th:field="*{name}" 
           th:class="${#fields.hasErrors('name')}?'form-control fieldError':'form-control'" />

② @NotEmpty(message = "회원 이름은 필수입니다.")불러오기

	<p th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></p>

👍 결과

2. Name 중복 여부

(1) @service에서 repository.save가 실행되기전에 메서드 추가

	@Transactional
	public Long join(Member member){
		// name 중복 체크 메소드 호출
		validationMemberCheck(member);
		memberRepository.save(member);
		return member.getId();
	}

(2) 메서드 만들기

@Service

	// 호출시켜주는 곳에 예외라고 던져주는 것
	private void validationMemberCheck(Member member) throws IllegalAccessException {
		List<Member> findMembers = memberRepository.findByName(member.getName());
	
		// findMembers가 비어있어야 정상, 비지 않았으면 exception
		if( !findMembers.isEmpty() ) {
			//exception 객체 생성 후 던지기
			throw new IllegalAccessException("이미 존재하는 회원입니다.");
		}
	}

@Repository

	// service단에 만들었던 예외 처리
	public List<Member> findByName(String name) throws IllegalAccessException {
		return em.createQuery("select m from Member where m.name = :name", Member.class)
				 .setParameter("name", name)
				 .getResultList();
	}

(3) 예외 처리 : 메서드, 메서드 호출하는 곳, 서비스랑 연결된 곳

@Controller

	@PostMapping("/members/new")
	public String create(@Valid MemberForm form, BindingResult result) throws IllegalAccessException {
    					....메소드....
    }

@Service

    @Transactional
	public Long join(Member member) throws IllegalAccessException {
    					.... 메소드 ....
    }

👍 결과

  • 같은 이름 입력하면 was단 -> 500 error 발생
  • 콘솔창 출력
profile
안녕하세요, 한보람입니다.

0개의 댓글