일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- foreignkey
- subquery
- 예약
- 외부키
- 테스트메소드
- EC2
- MySQL
- appspec.yml
- ubuntu
- WeNews
- 테스트
- 검색
- 서브쿼리
- 메세지수정
- AuthenticationEntryPoint
- 컨테이너실행
- Query
- application.yml
- 메소드명
- 포트
- 추후정리
- 참조키
- ㅔㄴ션
- docker명령어
- appspec
- querydsl
- 2 > /dev/null
- 커밋메세지수정
- 네이티브쿼리
- 적용우선순위
- Today
- Total
제뉴어리의 모든것
ResponseEntity<>와 ajax 사용시 주의사항 본문
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 형태로 출력된다.
'Spring Boot' 카테고리의 다른 글
favicon.ico 와 AuthenticationEntryPoint .. (0) | 2021.04.12 |
---|---|
@Builder.Default (0) | 2021.04.09 |
Spring Boot Devtools 알아보기 (0) | 2021.04.07 |
SpringBoot - 자동 설정파일 만들기 1 (0) | 2021.04.03 |
[Spring] 스프링 빈(Bean)의 개념과 생성 원리 (0) | 2021.04.01 |