인프런 커뮤니티 질문&답변

WW ym님의 프로필 이미지
WW ym

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

회원 등록

@NotEmpty적용 안되는 오류.

작성

·

2.8K

0

1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오

[질문 내용]
'회원 등록' 강의 듣던 중 오류입니다.

회원가입 시 이름이 공백이면 @NotEmpty로 빠꾸시키는 코드 작성한 상태인데, 공백 그대로 db에 저장되고 있습니다. db저장된 후 회원가입을 다시 진행했을 경우에는 기존의 공백을 id로 인식해 "이미 존재하는 회원입니다."라며 500에러가 뜨고 있는 상태이고요.

구글링 해보고 chatGPT까지 썼음에도 아직까지 못잡고 있습니다... 도움 부탁드려요.

코드 일부 보내드립니다.

Controller

@Controller
@RequiredArgsConstructor
public class MemberController {

    private final MemberService memberService;

//코드 일부 생략

@PostMapping("/members/new")
    public String create(@Valid MemberForm form, BindingResult 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:/";
    }

 

MemberForm

@Getter
@Setter
public class MemberForm  {

    @NotEmpty(message = "회원명은 필수입니다.")
    private String name;

    private String city;
    private String street;
    private String zipcode;
}

 

createMemberForm.html

<div th:replace="fragments/bodyHeader :: bodyHeader"/>

<form role="form" action="/members/new" th:object="${memberForm}" method="post">
    <div class="form-group">
        <label th:for="name">이름</label>

        <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요"
               th:class="${#fields.hasErrors('name')}? 'form-control fieldError' : 'form-control'">
        <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">정확하지 않은 답변입니다.</p>

어느 부분이 문제인지 알 수 있을까요?

답변 1

1

안녕하세요. WW ym님, 공식 서포터즈 y2gcoder입니다.

공백이라는 것이 " "를 말씀하시는 것이고 이것을 유효성 검사하고 싶으시다면 @NotEmpty가 아닌 @NotBlank를 사용하셔야 합니다. @NotEmpty는 null이나 "" 등을 유효성 검사하는 애노테이션입니다!

참고로 @NotBlank를 사용하고 싶으시다면 build.gradle에 다음 의존성을 추가하고 refresh를 해주십쇼!

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

 

감사합니다.

WW ym님의 프로필 이미지
WW ym
질문자

아,, 제가 잘못 질문을 작성한 것 같아요.

선생님 수업 때 보면 회원가입 시 name부분에 아무것도 적지 않은 상태에서 회원가입 버튼을 누르면 "회원명은 필수입니다"라고 써지면서 회원가입이 안되는데 저는 아무것도 적지 않았는데도 오류 메시지 없이 회원가입이 되고 있습니다.

image

이런 식으로요.

선생님 강의 진행 중에는

image이런 에러가 리턴되고 bindingResult로 MemberForm과 연계해주는데 이 부분을 진행이 되질 않고 있습니다.
수업은 일단 진행중인데 이 부분이 어디가 문제일까요?

자세하게 알려주셔서 감사합니다.

증상만 듣기로는 유효성 검사가 작동하지 않는 것으로 보입니다.

혹시 @Valid의 import문이 어떻게 되는지 공유해주실 수 있으십니까?

WW ym님의 프로필 이미지
WW ym
질문자

package jpa.jpashop.controller;

import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotEmpty;

@Getter
@Setter
public class MemberForm  {

    @NotEmpty(message = "회원명은 필수입니다.")
    private String name;

    private String city;
    private String street;
    private String zipcode;
}

이렇게입니다

죄송합니다 제가 두루뭉술하게 여쭤본 것 같습니다. MemberController.create()에서 파라미터인 MemberForm 앞에 붙인 @Valid의 임포트가 어떻게 되는지 여쭤보고 싶었습니다.

그럼 번거로우시겠지만 전체 코드를 보여주시겠습니까?

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

감사합니다.


WW ym님의 프로필 이미지
WW ym
질문자

다른 안 되는 부분들 처리하고, 주말엔 질문하기 죄송해서 이제 답글 드립니다.

@valid import문과 해당 코드 보내드리겠습니다.
MemberController

import javax.validation.Valid;

// 생략


@PostMapping("/members/new")
public String create(@Valid MemberForm form, BindingResult 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:/";

}

//application.properties DB접근 주소
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:tcp://localhost/~/jpashop
spring.datasource.username=
spring.datasource.password=

 

제 프로젝트 코드이며 jpa1편 끝난 상태입니다.

https://drive.google.com/file/d/1iFWEW83tv9ZxbAa26YdRMYnZUAJkZhf8/view?usp=sharing

 


1. 문제 영역을 실행할 수 있는 방법

프로젝트 실행 후 회원가입 시 이름의 '공백'은 Controller/MemberForm.java의 @notEmpty에 의해 가입되면 안되는데 가입되는 상황입니다.

import문은 jakarta는 따로 뜨지 않고 javax만 되고 있습니다.

2. 문제가 어떻게 나타나는지에 대한 상세한 설명

선술했습니다~

보내주신 코드 확인했습니다!

스프링 부트에서는 validation을 위해 제가 위에서 말씀드린

//    implementation 'javax.validation:validation-api:2.0.1.Final'
//    implementation 'org.hibernate.validator:hibernate-validator:6.0.13.Final'
    implementation 'org.springframework.boot:spring-boot-starter-validation'

이걸 추가해주셔야 합니다.

다른 것들은 지워주십쇼!

그 후 refresh 후 @Valid와 @NotEmpty의 임포트를 다시 해주시고 애플리케이션을 구동하시면 이제 유효성 검사가 정상적으로 작동합니다! Thymeleaf 가 깨진 부분이 있는데, 이 부분은 스스로 하실 수 있으실 것 같습니다 :)

파이팅입니다!

WW ym님의 프로필 이미지
WW ym
질문자

아.. 임포트 문을 지우지 않으면 인텔리에서 임포트문을 추천해주지 않네요. 처음 알았습니다.

감사합니다!

파이팅입니다!

WW ym님의 프로필 이미지
WW ym

작성한 질문수

질문하기