이거는 스프링에 대한 것 이라기 보다는, 스프링이 제공해주는 테스트 기능을 이용해서 예외 그냥 일부로 던져보는 거임.
@Slf4j
public class CheckedTest {
@Test
void checked_catch(){
Service service = new Service();
service.callCatch();
}
@Test
void checked_throw() throws MyCheckedException {
Service service = new Service();
assertThatThrownBy(()->service.callThrow()).isInstanceOf(MyCheckedException.class);
}
static class MyCheckedException extends Exception{
public MyCheckedException(String message) {
super(message);
}
}
static class Service{
Repository repository = new Repository();
public void callCatch(){
try{
repository.call();
}catch (Exception e){
log.info("예외처리, message={}",e.getMessage(),e);
}
}
public void callThrow() throws MyCheckedException {
repository.call();
}
}
static class Repository{
public void call() throws MyCheckedException {
throw new MyCheckedException("ex");
}
}
}
먼저 리포지토리부터 보면,
예외를 그냥 던지게 함.
우리가 먼저 JDBC 리포지토리 할 때도 SQLException 해서 예외 던졌었음. 아무래도 DB가 외부에 있는 거 연결하는 거다 보니까 예외처리 해야 하는 건 거의 확정적인 듯..
여튼 그 다음 서비스를 보면,
callCatch는 try catch해서 그냥 잡은거임.
callThrow()는 안 잡고 밖으로 던져버린거.
MyCheckedException은 그냥 커스텀으로 예외 만든 거.
아 그리고 예외 받거나 던질 때 Exception으로 하는 경우는 잘 없음.
거의 모든 예외를 처리한다는 의미이므로, 예외는 구체적으로 하는 게 좋은 듯.
checked_catch() 테스트는 callCatch()가 try catch로 예외 처리를 했으므로 정상작동.
checked_throw()는 callThrow()가 던져서 에러.. 나겠지만 assertThatThrownBy()로 예외처리가 나야지 정상작동.
assertThatThrownBy()가 예외를 받는 테스트 메소드니까. 아마 내부에서 try catch 해서 처리 했겠지.
근데 instanceof 해서 인자로 넣어준 에러 클래스의 인스턴스가 아니면 또 throw new 해서 AssertionError라고 또 뿜음.
'스프링 > 5. 스프링 DB-1' 카테고리의 다른 글
34. 체크예외 활용 (0) | 2023.10.03 |
---|---|
33. 언체크 예외 (0) | 2023.10.03 |
31. 예외 기본 규칙 (0) | 2023.10.02 |
30. 자바 예외 (0) | 2023.10.02 |
29. 스프링 부트 자동 리소스 등록 (0) | 2023.10.01 |