-
[스프링부트 및 JPA] - 공통 응답 DTO 만들어보기 본문
저번 포스팅에서 우리는
Map을 이용해서 return했었습니다.
그런데 문제가 하나 있는데, 길이를 아주 길게 써서 작성하면 정상적으로 오류를 뱉지만 "유효성 검사에 실패했습니다" 메세지도 같이 출력하고 싶은데 그렇지 못띄웁니다.
메세지도 같이 띄우고 싶은데 그러지 못하기 때문에 dto에 클래스를 하나 만듦으로써 공통 응답 처리를 한 번 해보도록 하겠습니다.
이런식으로 web - dto내부에 auth 내부가 아닌 곳에 CMRespDto 클래스를 생성해보겠습니다.
그리고 Getter, Setter대신 롬복 라이브러리를 이용하고 있으므로 Data어노테이션과 No-, All-어노테이션을 답니다.
우리는 message와 errorMap 둘 다를 받고 싶은 것이기 때문에 dto는 이쯤 해두고 ControllerExceptionHandler 클래스로 이동합니다.
그리고 조금 수정을 해줄건데,
원래 Map타입으로 return했던 것을 다음과 같이 수정합니다.
그럼 CMRespDto타입의 함수를 return할 때에도 메세지와 errorMap으로 반환 가능합니다.
실제로 이렇게 입력하고 예외를 출력했을 때 어떤 메세지를 띄우는지 확인해보겠습니다.
Postman으로 예외를 내보낸 결과
이런 메세지를 띄우네요.
유효성 검사에 실패했다는 메세지와 함께 실패한 에러 요인들을 모두 띄울 수 있습니다.
그런데 한 번 생각해보아야할 점이 하나 있습니다.
우리는 CMRespDto를 통해 데이터를 리턴할 수도 있습니다.
예를들면 User오브젝트를 리턴하거나 다른 정보를 리턴해올 때의 경우도 생각을 해줘야 한다는 것이지요.
우리가 CMRespDto를 사용하는 목적은 간단합니다.
공통의 응답 Dto를 만들기 위해서 그렇습니다.
정상적으로 Return할 때에도, 그리고 오류를 발생했을 때에도 내보낼 Dto를 생성하는 것입니다.
그런데 오류만 내보내는 errorMap만 만들자니 정상의 응답을 내보낼 수 없고, 그렇다고 정상 응답과 errorMap을 내보내자니 말 자체가 굉장히 모순적이기 때문에 이를 선택적으로 내보내야 합니다.
그러기 위해서 우린 제네릭을 사용할 것입니다.
이렇게 입력합니다.
그리고 message위에 이것도 덧붙히겠습니다.
이는, 정상적인 회원가입이면 1을 내보낼 것이고, 에러가 발생하면 -1을 내보낼 것입니다.
굉장히 간단하죠?
자 그럼 이제 ControllerExceptionHandler 클래스로 이동하여 수정을 조금 해보겠습니다.
이렇게 입력하면 -1은 실패코드, e.getMessage()는 메세지, e.getErrorMap()은 에러를 띄울 것입니다.
실제로 회원가입을 진행해보면
이렇게 뜹니다. 굉장히 직관적이지요?
그리고 제네릭에 ?을 쓰면 타입을 따로 지정하지 않겠단 뜻을 의미합니다.
근데 아직 끝나지 않았습니다. 계속 해봅시다.
우리가 입력을 하다가 중복된 가입을 시도하거나 글자 길이가 초과될 때 등의 에러가 떴을 때 다른 페이지로 넘어가서 에러를 알려주는건 사용자에게 좋은 사용자 경험을 줄 수 없을 것입니다.
그래서 util이라는 패키지를 새로 생성하고 Script라는 클래스를 만들어보겠습니다.
다음과 같이 입력합니다.
alert를 띄우고 그 안에 msg를 띄여면서 다시 사이트의 뒤로 돌아가는 로직입니다.
그런 다음
ControllerExceptionHandler를 다음과 같이 구성합니다.
분명 '힘들게 개발한걸 왜 바꾸나요?' 라고 물으실 수 있을겁니다.
우리가 개발하는 목적은 사용자의 편의를 위한 것이 가장 큽니다.
그런데 사용자에게 보다 나은 환경에서 사이트에 오래 머물도록 하기 위해서는 당연히 기존의 CMRespDto방식으로 어디가 틀렸다고 메세지를 띄우고 그 사이트에 정체되어 있는 방식보다는 지금의 JS를 이용한 Script방식이 훨씬 편리할 것입니다.
어떤 차이가 있는지 보겠습니다.
username을 엄~청 길게 쓰고
실행해보면 자 이렇게 뜹니다.
메세지가 뜨지요.
그리고 확인을 누르면
다시 입력하던 페이지로 돌아오지요.
얼마나 편한가요???
지금까지 CMRespDto와 Script를 둘 다 사용해보며 비교를 해보았습니다.
정리를 한 번 해보자면, 클라이언트에게 응답할 때는 Script가 편리합니다.
즉, 사용자에게 편의를 제공하기 위해서는 Script방식을 채용하는 것이 옳겠습니다.
하지만 안드로이드와 통신하거나 Ajax와 통신할 때에는 CMRespDto가 편리합니다.
Ajax통신과 Android 통신은 개발자가 JS코드로 서버 통신을 한다는 특징이 있습니다.
개발자가 자신들의 편의를 위해 데이터를 주고 받게 설정하는데 Alert를 띄우고 그럴 필요가 없겠죠??
즉, 목표 대상이 누군지에 따라 사용하는 방식도 극명하게 갈릴 수 있으니 개발할 때 주의해야겠습니다.
감사합니다.
'백엔드 기술 정리 > 스프링 부트' 카테고리의 다른 글
[스프링부트 및 JPA] - Principal 넘기기 (0) | 2022.02.15 |
---|---|
[스프링부트 및 JPA] - UserDetailService만들기 (0) | 2022.02.11 |
[스프링부트 및 JPA] - 예외를 고의로 생성하고 CustomExceptionHandler로 낚아채기 (0) | 2022.02.11 |
[스프링부트 및 JPA] - 전처리 후처리 개념 (0) | 2022.02.08 |
[스프링부트 및 JPA] - BCryptPasswordEncoder를 이용한 비밀번호 해시화 (0) | 2022.02.05 |