관리 메뉴

제뉴어리의 모든것

ResponseEntity<>와 ajax 사용시 주의사항 본문

Spring Boot

ResponseEntity<>와 ajax 사용시 주의사항

제뉴어리맨 2021. 4. 8. 23:00

 

service단에서 exception일 발생되있을때, controller단에서 해당 exception 처리를 할 수 있도록 아래와 가이

handler를 만들어 주었다.

  //Controller에 존재
  
  
   @ExceptionHandler(ControllerException.class)
    public ResponseEntity<ErrorResponse> handleControllerException(ControllerException e)
    {
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setMessage(e.getReason());
        errorResponse.setCode(e.getCode());

        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }

ErrorResponse는 아래와같이 View에 넘기는 DTO 개념으로 만든 임의클래스다.

package com.january.springsecurity.error;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ErrorResponse {

    private String message;

    private String code;


}

 

 

아래 구문은 Service단이고 특수문자가 id에 포함됬을 경우 예외를 발생시킨다.

//Service
 
 public Boolean existMember(String id)
    {
        String speChar = "[^\uAC00-\uD7A3xfe0-9a-zA-Z\\s]";

        Pattern pattern = Pattern.compile(speChar);
        Matcher matcher = pattern.matcher(id);

        if(matcher.find())
        {
            throw new ControllerException("wrong id");
        }
        return memberRepository.existsById(id);
    }

예외가 발생되면 위에서 나온 handleControllerException로 콜백이 간다.

그리고 return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);를 리턴하는데..

      var data = { id : id};


            $.ajax({
                url: '/member/exist',
                method : 'post',
                contentType : 'application/x-www-form-urlencoded; charset=utf-8',
                data : data,
                type : 'post',
                dataType: 'json',
                success : function(data){
					console.log(data);
                    if(data.result == 'true')
                    {
                        alert('사용 불가 아이디입니다');
                    }
                    else
                    {
                        alert('사용 가능 아이디입니다');
                        $('input[name=id]').prop( 'readonly', true );
                        $('#vailID').val('true');

                    }

                },
                error : function(data){
                    console.log(data);
                    alert('[' + data.message + ': '+ data.code +'] 잘못된 양식의 아이디입니다');
                    console.log("error "+data);
                }


            })

예외 던졌을 경우 위에 ajax에서 error : function(data)로 진입한다.

여기서 그리고 console.log들을 만나는데, success 상황에서와 error 상황에서 리턴되는 객체타입이 달라진다

success시에 

console.log(data); 구문의 결과는 아래와 같고

 

error시에

console.log(data); 구문의 결과는 아래와 같다

 

public ResponseEntity<ErrorResponse> handleControllerException(ControllerException e) 과 같이 메소드 정의할때

ErrorResponse 타입으로 리턴하겠다고 했어도 위와같이 데이터가 넘어온다..

Exception 발생시엔 항상 저런식으로 발생되는듯하다.

 

즉, success시와 error시에 같은 ResponseEntity<객체> 타입이여도 리턴되는 객체타입이 다르다.

 

그리고 추가로, console.log(data);

부분을 식별하기 쉽도록 console.log("success : " + data); 와 같이 수정하면 

위와 같이 console.log를 볼 수 없고 그냥 success : object 형태로 출력된다.