인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

작성자 없음

작성자 정보가 삭제된 글입니다.

스프링 프레임워크는 내 손에 [스프1탄]

41.아이디 중복확인 기능 구현(Ajax)

아이디 중복확인 NullPointerException

작성

·

315

0

20:35 예시 코드처럼 입력했는데, 공백을 입력하고 중복확인을 하는 경우처럼 반환되는 Member가 없는 경우 NullPointerException이 발생합니다.

memID로 찾아지는 Member가 있는 경우 0을 반환하면서 잘 동작합니다.

선생님 예시에서는 작동이 잘 되는데 왜 저는 안 되는 걸까요? 옵셔널이나 예외처리를 해주어야 할까요?

    @RequestMapping("/memRegisterCheck.do")
    public @ResponseBody int memRegisterCheck(@RequestParam("memID") String memID) { //넘어오는 파라미터 이름과 받는 이름이 같은 경우 생략 가능
        Member m = memberMapper.registerCheck(memID);
        if (m != null || m.equals("")) {  //아이디가 중복이거나 공백인 경우 => 사용불가
            return 0;
        }
        return 1;  //사용 가능
    }

 

java.lang.NullPointerException
	kr.board.controller.MemberController.memRegisterCheck(MemberController.java:25)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:498)
	org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
	org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
	org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777)
	org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:489)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:583)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

 

답변 2

0

박매일님의 프로필 이미지
박매일
지식공유자

Member m = memberMapper.registerCheck(memID);
위에서 아이디가 공백이다면 Member m=null 이런 개념이기 때문에 m. 을 이용해서 equals() 메서드를 접근할수없어서 NullPointerException이 나는듯합니다.
사전에 아이디에 공백을 넣을수없게 미리 차단을 하고나서 Member m = memberMapper.registerCheck(memID); 이부분이 수행되어야 될듯합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

작성하신 코드와 오류 메시지를 보면, NullPointerExceptionMember mnull인 경우에도 .equals("")를 호출하려고 해서 발생합니다. mnull일 때는 .equals("") 호출 자체가 불가능하기 때문에 오류가 발생하는 것입니다.

해당 부분을 다음과 같이 수정해야 할 것 같습니다:

if (m != null && m.getMemID() != null && !m.getMemID().equals("")) { 
    // 아이디가 중복이 있는 경우 => 사용불가
    return 0;
}

여기서 m.getMemID()mmemID 값을 가져와야 하는데, 당연히 실제 멤버 변수 이름은 코드에 맞게 조정해야 합니다.

이와 비슷한 상황을 다루는 예시로, 다음 질문들이 참고가 될 수 있습니다.

해당 링크들에서는 동일한 상황이 아닐 수 있으나, XML Mapper를 사용할 때 resultTypeparameterType에 관한 내용이 언급되어 있으니 NullPointerException과는 다르게 Mapper 설정에 관한 문제가 있을 때 참고하시면 도움이 될 수 있습니다.

질문자님의 경우에는 명시적인 null 체크를 통해 문제를 해결할 수 있을 것으로 보입니다. 변수가 null인지 먼저 확인하고, 그 후에 값이 있는 경우에만 메서드나 속성에 접근하는 것을 권장합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기