GlobalExceptionHandler ์์ฑ
์๋ฒ์์ ๋ฐ์ํ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ฅผ ํํฐ๋งํด์ฃผ๊ณ ์ค๋ฅ ํ์ด์ง๋ก ์ฒ๋ฆฌํด ์ฃผ๋ Global Exception Handler๋ฅผ ์์ฑํ์.
Exception
TaskService
@Transactional(readOnly = true)
public Task findTask(long id) {
Task requestTask = taskRepository.findById(id).orElseThrow(()->{
return new IllegalArgumentException("ํด๋น task๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.");
});
return requestTask;
}
๋ค์๊ณผ ๊ฐ์ด Task
๋ผ๋ Entity๋ฅผ ์กฐํํ๋ Service ๊ฐ์ฒด๊ฐ ์๋ค๊ณ ํ์.
id๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ผ๋ฉด return ํด์ฃผ์ง๋ง, ํด๋นํ๋ id๊ฐ ์์ ๋ IllegalArgumentException
์์ธ๋ฅผ return ํ๋ค.
์์ธ ๋ฐ์
Task ํ
์ด๋ธ์ ์กด์ฌํ์ง ์๋ id๋ฅผ ์กฐํํ์ฌ Exception์ ํธ์ถํด๋ณด์.
Whitelabel Error Page
ํ์ด์ง๊ฐ ์์ฑ๋๋ฉฐ, ์ค๋ฅ์ ๋ํ ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋๋ค.
์ด๋ฌํ ๋ก๊ทธ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ชจ๋ ๋ณด์ฌ์ฃผ๋ ๊ฑด ์ข์ง ์์ ์นํ์ด์ง์ด๋ฏ๋ก, ์ค๋ฅ๋ฅผ ํํฐ๋งํด์ฃผ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค๊ณ , ์ค๋ฅ์ ๋ํ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ ๋ฐ๋ก ๋ณด์ฌ์ค์ผ ํ๋ค.
GlobalExceptionHandler
handler
๋ผ๋ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ GlobalExceptionHandler
๋ผ๋ ํด๋์ค๋ฅผ ์์ฑํด ์ฃผ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์.
package com.vividswan.studymate.handler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
@RestController
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public String handleException(Exception e){
return e.getMessage();
}
}
์ฐ์ error์ getMessage()
๋ฉ์๋๊ฐ ์ ์ถ๋ ฅ๋๋์ง ํ์ธํ๊ธฐ ์ํด RestController
๋ก ์์ฑํด ์ฃผ์.@ControllerAdvice
๋ Controller์์ ๋ฐ์ํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๊ณณ์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํด ์ฃผ๋ ์ด๋
ธํ
์ด์
์ด๋ค.@handleException
๋ฅผ ๋ฉ์๋์ ์ ์ธํด ์ค๋ค.
์ด๋ value๋ Exception.class
๋ก ์ ์ธํ์๋ค.
์์ ์์ ์ IllegalArgumentException.class
๋ก ์ ์ธํ๋ค๋ฉด, ์ธ์์ ๋ํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ค ์ ์์ง๋ง, Exception.class๋ ๋ชจ๋ ์์ธ ํด๋์ค์ ๋ถ๋ชจ์ด๋ฏ๋ก ๋ค๋ฅธ ์์ธ๋ค๋ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฉ์๋์ ์ธ์๋ฅผ Exception e
๋ก ๋ฐ๊ณ e.getMessage()๋ฅผ return ํด์ค๋ค.
์์ ์ค๋ฅ๋ฅผ ๋ค์ ๋ฐ์์์ผ๋ณด์.
e.getMessage()
๋ง ์ถ๋ ฅ๋์๋ค.
Exception View
Exception์ ๋ํ view ํ์ด์ง๋ฅผ Mustache๋ก ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด๋ณด์.
์ฐ์ ์์์ ๋ง๋ RestController๋ฅผ Controller๋ก ๋ฐ๊ฟ์ฃผ์ด ํ์ด์ง๋ฅผ ํธ์ถํ ์ ์๋๋ก ํ์.
package com.vividswan.studymate.handler;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@Controller
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public String handleException(Exception e,Model model){
model.addAttribute("errorMessage",e.getMessage());
return "errorView";
}
}
์ด์ errorView ํ์ด์ง๋ฅผ ๊ฐ๋จํ๊ฒ ์์ฑํ์.
mustache์ ์ ์ด์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋ค.
errorView
<script>
const backFunc = function (){
history.back();
}
</script>
<br>
<div class="container">
<h1>Error Message Page</h1>
<hr>
<div class="d-flex justify-content-center">
<h3>{{errorMessage}}</h3>
</div>
<hr>
<div class="d-flex flex-row-reverse">
<button onclick="backFunc()" class="btn btn-primary">๋ค๋ก ๊ฐ๊ธฐ</button>
</div>
</div>
html body ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ํ์ด์ง๋ฅผ ์์ฑํ๋ค.onClick
์ ํตํด ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ๋ ์์ฑํ์ฌ ๋์๊ฐ ์ ์๊ฒ ์์ฑํ๋ค.
์ด๋ก์จ GlobalExceptionHandler
์ ํตํ ์๋ฌ ํ์ด์ง๋ฅผ ์์ฑํ๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
maven ํ๋ก์ ํธ์์ h2 ์คํ (0) | 2022.03.14 |
---|---|
ํ์๊ฐ์ DTO ๋ง๋ค๊ธฐ (0) | 2022.03.14 |
mustache์์ summernote ์ฌ์ฉ (0) | 2022.03.13 |
Post ์์ฒญ ํ ์คํธ ์ฝ๋ ์์ฑ (0) | 2022.03.12 |
์น ์๋ฒ์ ํฐ์ผ์ ์ฐจ์ด (0) | 2022.03.11 |